android - Navigation Drawer 点击打开另一个 Fragment 替换 TabLayout & ViewPager
问题描述
我有一个带有导航抽屉的项目,它包括 2 项“主页”和“消息”。“消息”页面是一个单独的片段,“主页”页面是一个 tabLayout 组合 viewPager,包括 3 个不同的片段。我想要的是“消息”片段来替换 Home 的 tabLayout 和 viewPager。现在我的问题是当我尝试用“消息”片段替换时,片段本身没有显示任何内容,但考虑到“消息”片段中有很大的 TextView。
MainActivity 的导航点击代码
navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()) {
case 0:
drawerLayout.openDrawer(GravityCompat.START);
break;
case R.id.Home:
getSupportActionBar().setTitle("Home");
viewPager.setAdapter(mSectionPageAdapter);
viewPager.setCurrentItem(1);
mTabLayout.setupWithViewPager(viewPager);
break;
case R.id.Message:
mTabLayout.removeAllTabs();
getSupportActionBar().setTitle("Message");
getSupportFragmentManager().beginTransaction().replace(R.id.viewPager_mainActivity, friendMessageFragment).commit();
break;
}
drawerLayout.closeDrawer(GravityCompat.START);
return true;
}
});
主页选项卡布局的图像
消息片段的图像,该片段假设中间有一个 textView
我尝试用getSupportFragmentManager()
它来替换我的 TabLayout,但它似乎根本不起作用。有没有人知道我做错了什么或者我在这段代码中缺少什么,这些天我一直在努力解决这个问题......
更新 MainActivity XML 代码
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/drawer_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
tools:context=".MainActivityUsed.MainActivity">
<android.support.design.widget.CoordinatorLayout
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.design.widget.FloatingActionButton
android:id="@+id/floatingActionButton"
android:layout_width="56dp"
android:layout_height="56dp"
android:layout_gravity="bottom|end"
android:layout_marginBottom="16dp"
android:layout_marginEnd="16dp"
android:layout_marginRight="16dp"
android:src="@drawable/add"
app:backgroundTint="@color/backgroundOrange" />
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.design.widget.AppBarLayout
android:id="@+id/appbar_main_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:showDividers="beginning"
android:theme="@style/Base.ThemeOverlay.AppCompat.Dark.ActionBar">
<include
android:id="@+id/app_bar_info_regis_main_activity"
layout="@layout/app_bar_info_regis" />
<include android:id="@+id/app_bar_search_view"
layout="@layout/search_view"/>
<android.support.design.widget.TabLayout
android:id="@+id/main_tabs"
android:layout_width="match_parent"
android:layout_height="wrap_content">
</android.support.design.widget.TabLayout>
</android.support.design.widget.AppBarLayout>
<android.support.v4.view.ViewPager
android:id="@+id/viewPager_mainActivity"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_alignParentBottom="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_below="@id/appbar_main_layout">
</android.support.v4.view.ViewPager>
</RelativeLayout>
</android.support.design.widget.CoordinatorLayout>
<android.support.design.widget.NavigationView
android:id="@+id/nav_view_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="start"
android:layout_marginEnd="-65dp"
android:layout_marginRight="-65dp"
android:fitsSystemWindows="false"
app:headerLayout="@layout/nav_header"
app:itemIconTint="@color/colorAccent"
app:menu="@menu/main_activity_menu" />
解决方案
当它只有两个项目时,您可以使用 a ViewFlipper
,它允许两个子节点。
或使用 aFrameLayout
作为容器并相应地膨胀片段,而不是预先存在的XML
.
事实上,它会使第二个片段膨胀,没有机会返回到第一个片段。
推荐阅读
- javascript - Node 和 Socket.IO - 私人聊天(一对一)
- javascript - 如何将变量添加到 formData 和 ajax 过程
- angular - TypeError:对象不支持属性或方法“renderRows”
- typescript - [AssemblyScript]有没有办法将多个 Typescript 文件捆绑到一个 Typescript 文件中?
- r - 向函数中的数据框添加列不起作用
- android - CountDownLatch 使应用停止
- java - Jackson:反序列化 JsonProperty 与 bean 名称不匹配的 xml 属性
- angularjs - 如何在Angular4中获取具有相同ID的输入字段的值
- php - 如何在 PHP 中将数字相加以创建唯一分数并保存
- c# - UITextfield 无法访问,因为它受到保护