当前位置: 首页 > 知识库问答 >
问题:

在片段中获取空片段管理器/活动

艾凯捷
2023-03-14

我想在收到一些HTTP请求的响应后,更新几个<code>片段

发送请求。--

活动

protected void onCreate(Bundle savedInstanceState) {
    Log.d("DetailedProduct-LifeCycle", "------------onCreate------------");

    ...

    // Set ViewPager
    viewPager = findViewById(R.id.view_pager);
    adapter = new ViewPagerAdapter(getSupportFragmentManager());
    viewPager.setAdapter(adapter);
    // Send Request
    sendRequest();

    ...
}

public void sendRequest(){
    Log.d("DetailedProduct", requestUrl);

    RequestQueue queue = Volley.newRequestQueue(this);
    JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.GET,
            requestUrl,
            null,
            new Response.Listener<JSONObject>() {
                @Override
                public void onResponse(JSONObject response) {
                    LinearLayout progressView = findViewById(R.id.progressView);
                    progressView.setVisibility(View.GONE);
                    bundle.putString("detail", response.toString());
                    Log.d("DetailedProduct", "get data:"+response.toString());
                    Log.d("DetailedProduct", "final Data:" + bundle.toString());
                    adapter.updateFragment(bundle);
                }
            },
            new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                    Log.d("DetailedProduct", "Cannot get detailed data");
                }
            });
    queue.add(jsonObjectRequest);
}

适配器

public class ViewPagerAdapter extends FragmentPagerAdapter {
    private SellerFragment sellerFragment;
    private ShippingFragment shippingFragment;
    private ProductSummaryFragment productSummaryFragment;
    private FragmentManager fragManager;
    public ViewPagerAdapter(FragmentManager fragmentManager){
        super(fragmentManager);
        sellerFragment = new SellerFragment();
        shippingFragment = new ShippingFragment();
        productSummaryFragment = new ProductSummaryFragment();
    }
    @NonNull
    @Override
    public Fragment getItem(int position) {
        // ToDo:
        Log.d("ViewPager", position+": ------------getItem----------");

        switch (position){
            case 0:
                if(productSummaryFragment==null){
                    productSummaryFragment = new ProductSummaryFragment();
                }
                return productSummaryFragment;
            case 1:
                if(sellerFragment==null){
                    sellerFragment = new SellerFragment();
                }
                return sellerFragment;
            case 2:
                if(shippingFragment==null){
                    shippingFragment = new ShippingFragment();
                }
                return shippingFragment;
            default:
                return null;
        }
    }

    @Override
    public int getCount() {
        return 3;
    }

    public void updateFragment(Bundle bundle){
        Log.d("ViewPager", "------------updateData----------");
        productSummaryFragment.updateData(bundle);
        sellerFragment.updateData(bundle);
        shippingFragment.updateData(bundle);
    }
}

碎片样本

public class ShippingFragment extends Fragment {
    private TextView shippingSection;
    protected JSONObject data;
    private AppCompatActivity mActivity;
    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        return inflater.inflate(R.layout.shipping_fragment_layout, container, false);
    }

    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        shippingSection = view.findViewById(R.id.shipping_info_section_content);
        setData();
    }

    @Override
    public void onAttach(@NonNull Context context) {
        Log.d("ShippingFragment", "-----------onAttach----------");
        super.onAttach(context);
        if(context instanceof AppCompatActivity){
            Log.d("ShippingFragment", "---------bind mActivity Success-------");
            mActivity = (AppCompatActivity)context;
        }
    }

    @Override
    public void onDetach() {
        Log.d("ShippingFragment", "-----------onDetach----------");
        super.onDetach();
    }
    // Same for all fragments
    public void  updateData(Bundle bundle){
        Log.d("ShippingFragment", "--------------updateData------------");
        setArguments(bundle);

        if(mActivity==null){
            Log.e("ShippingFragment", "------------activity disappears----------");
        }
        FragmentManager fragmentManager = mActivity.getSupportFragmentManager();
        fragmentManager.beginTransaction().detach(this).attach(this).commit();
    }
}

日志显示位置0,1处的片段的<code>updateData</code>工作良好。但是对于位置2处的片段,它会导致错误。

我发现的区别是适配器没有为位置2调用getItem,这意味着没有调用shippingFraankonAttach。因此mactive不存在。

我的直觉告诉我,问题一定来自适配器的工作流或fragmentManager事务。但是作为一个Android初学者,我花了一整天的时间在它们上面,毫无头绪。

如何修复?顺便问一下,有没有更好的方法来实现我的场景?

共有1个答案

尉迟禄
2023-03-14

尝试调用< code > view pager . setoffscreenpagelimit(3)以确保在活动打开后所有3个片段都附加到活动。

 类似资料:
  • 我的照片应用程序里有一个片段。当用户编辑照片时, null 我的片段异步任务: 我在调用getParentFragmentManager()时遇到异常。我提到了一个相关的帖子,Fragment MyFragment not attached to Activity,但它与Fragment not be Activity相关。所以我不确定添加是否可以解决我的问题。理想情况下,在尝试弹出backSta

  • 问题内容: 我托管了5个片段,在每个片段上我都需要填写一些字段。 我想从中获取这些字段的值。我尝试了类似的东西: AddActivity.java FragPagerAdapter.java OtherFragment.java 公共类OtherFragment扩展Fragment {Button btn; 更新 的问题我总是得到EditText(而其他字段要获得)的问题等于null如果它们位于片

  • 在适配器中 Holder.NameExam2.SetOnClickListener(新建View.OnClickListener(){ 成碎片 @覆盖公共视图onCreateView(LayoutInflater inflater,ViewGroup container,Bundle savedInstanceState){ 它在getString()中调用空指针异常。如何解决。

  • 有什么理由不不分青红皂白地这样做而不重新评估我使用片段的每个单独的情况吗?

  • 我正在使用导航组件版本,并且我使用在3个屏幕之间来回导航 <代码>导航。findNavController(it)。导航(R.id.action\u参与者) 第二次浏览相同的屏幕后,我可以看到第二个片段,但我收到一个异常。我在FragmentManager上启用了日志,似乎有一个相同片段的不同实例没有附加,导致错误 关于导航组件为什么要创建另一个未连接的片段实例,有什么想法吗?有什么变通方法可以获

  • 我这么问的原因是因为我多年来一直在专门使用活动,Facebook SDK和Google Maps 2.0迫使我使用片段,现在我想知道与其他实现相比,它们是否本质上“更好”。 如果这个“不具建设性”或“过于开放”,那么答案显然是“不”。但是如果有一些谷歌开发者的文档或博客关于这个确切的主题,那么我想知道它