【问题标题】:How to replace fragment to another fragment in TabLayout and ViewPager如何在 TabLayout 和 ViewPager 中将片段替换为另一个片段
【发布时间】:2015-12-18 14:40:17
【问题描述】:

我想将片段替换为 TabLayout Viewpager 包含的另一个片段。像这样:

Activity -> A Fragment -> B Fragment(TabLayout ViewPager) -> C Fragment(Tab's片段)-> D 片段

我的任务是将Fragment C切换到Fragment D

注意:- TabLayout ViewPager还包含FragmentPagerAdapter的3个tab Fragment控件。

Tablayout 片段的布局:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical" >

<android.support.design.widget.TabLayout
    android:id="@+id/tablayout_postpaid_service"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@color/colorPrimary"
    app:tabGravity="fill"
    app:tabIndicatorColor="@color/white"
    app:tabMode="scrollable"
    app:tabSelectedTextColor="@color/white"
    app:tabTextColor="@color/tab_fade_text_color" >
</android.support.design.widget.TabLayout>

<android.support.v4.view.ViewPager
    android:id="@+id/viewpager_postpaid_service"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <!-- <FrameLayout
        android:id="@+id/container_body"
        android:layout_width="fill_parent"
        android:layout_height="0dp"
        android:layout_weight="1" /> -->
</android.support.v4.view.ViewPager>

片段B类:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    view = inflater.inflate(R.layout.fragment_select_postpaid_service, container, false);

    tablayout = (TabLayout) view.findViewById(R.id.tablayout_postpaid_service);
    viewpager = (ViewPager) view.findViewById(R.id.viewpager_postpaid_service);
    viewpager.setAdapter(new TabPagerAdapter(getChildFragmentManager(), TabConstants.POSTPAID_SERVICE_TYPE_TABS_FLAG, TabConstants.POSTPAID_SERVICE_TYPE_TABS));


    tablayout.post(new Runnable() {

        @Override
        public void run() {
            tablayout.setupWithViewPager(viewpager);
            setupTabIcons();
        }
    });
    return view;
}

片段 C 类:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {

    view = inflater.inflate(R.layout.fragment_select_operator, container,
            false);
    setGridview();
    return view;
}
private void setGridview() {

    operatorName = new ArrayList<String>();
    operatorCode = new ArrayList<String>();

    recyclerview = (RecyclerView) view
            .findViewById(R.id.select_operator_recycler_view);
    recyclerview.setHasFixedSize(true);
    GridLayoutManager layoutManager = new GridLayoutManager(getActivity(),
            Constants.NO_OF_OPERATOR_GRID);
    recyclerview.setLayoutManager(layoutManager);
    OperatorGridAdapter adapter = new OperatorGridAdapter(getActivity(),
            HomeConstants.OPERATOR_LIST_ICON);
    recyclerview.setAdapter(adapter);
    recyclerview.addOnItemTouchListener(new RecyclerItemClickListener(
            getActivity(),
            new RecyclerItemClickListener.OnItemClickListener() {

                @Override
                public void onItemClick(View view, int position) {
                    navigateFragment(position);
                }

            }));
}
private void navigateFragment(int position) {

    Fragment fragment = new DFragment();

    // FragmentTransaction fragmentTransaction = getChildFragmentManager().beginTransaction();
    FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
    fragmentTransaction.replace(R.id.container_body, fragment);
     //fragmentTransaction.addToBackStack(null);

    fragmentTransaction.commit();
    ((AppCompatActivity) getActivity()).getSupportActionBar().setTitle(
            getResources().getString(R.string.app_name));
    Log.d(Constants.ACTIVITY_TAG, "********************");
}


我收到一个错误

java.lang.IllegalArgumentException: No view found for id 0x7f0a006e (com.recharge:id/container_body) for fragment DFragment{4327cfd0 #2 id=0x7f0a006e}
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1070)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1259)
at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:738)
at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1624)
at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:517)

我已经尝试了很多刻度和解决方案,但对我来说没有成功。
请帮我解决这个问题。

【问题讨论】:

  • 据我了解,您正在尝试创建嵌套选项卡布局。
  • @Gaurav Balbhadra 可以说......实际上我想用另一个片段更改 Tab 片段(包含 TabLayout 的片段)。
  • 看看这个可能对你有帮助stackoverflow.com/questions/34261057/…
  • @Gaurav Balbhadra 不走运......

标签: android android-layout android-fragments android-viewpager android-tablayout


【解决方案1】:

你试过了吗?

FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
fragmentTransaction.replace(R.id.main_container, new FragmentB()).commit();

【讨论】:

  • 您好 Garg,由于我们正在使用带有视图分页器的选项卡布局,因此 Activity xml 文件中没有框架布局。如果你完成了这个,你能解释一下main_container id吗?
【解决方案2】:

我认为错误非常明显。编译说:

not view found for container_body

在你的代码中:

private void navigateFragment(int position) {

Fragment fragment = new DFragment();

// FragmentTransaction fragmentTransaction = getChildFragmentManager().beginTransaction();
FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
fragmentTransaction.replace(R.id.container_body, fragment);
 //fragmentTransaction.addToBackStack(null);

fragmentTransaction.commit();
((AppCompatActivity) getActivity()).getSupportActionBar().setTitle(
        getResources().getString(R.string.app_name));
Log.d(Constants.ACTIVITY_TAG, "********************");

}

我看到您尝试使用 fragmentTransaction.replace(R.id.container_body, fragment); 但是您只需在布局中评论 container_body。这就是为什么编译器告诉你它找不到 container_body 来让片段膨胀。也许这就是问题所在?

如果您可以发布有关片段 D 布局的更多详细信息,这应该会有所帮助。

如果这能解决您的问题,请告诉我 ;)

【讨论】:

  • 亲爱的代码注释 b'coz framelayout 组件不适合在这个位置它导致另一个异常......这就是我的实际问题“如何替换 tablayout 片段中的片段”。我
猜你喜欢
  • 1970-01-01
  • 2011-11-18
  • 1970-01-01
  • 1970-01-01
  • 2021-05-08
  • 1970-01-01
  • 1970-01-01
  • 2023-03-24
  • 1970-01-01
相关资源
最近更新 更多