android - Gmail 应用,例如带有 NavigationDrawer 的片段导航
问题描述
我想以与 Gmail 应用程序完全相同的方式构建导航。让我澄清一下我的意思。Gmail 应用程序(至少从外观上看)有 1 个托管活动、许多片段和导航抽屉。
我想要的是工具栏的行为与 Gmail 应用程序中的相同。
当在列表片段(收件箱,重要等)中时,有这个工具栏:您可以看到导航抽屉在那里切换并且它按预期工作。
当导航到单个项目片段时,会出现此工具栏: 请注意,后退按钮的行为类似于后退按钮应有的行为(导航到上一个视图)。并且导航抽屉仍然可以通过从侧面滑动来使用。
我正在尝试像这样重现这种行为:我正在为每个片段单独膨胀工具栏菜单
// both inside list and item fragments
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setHasOptionsMenu(true)
}
// inside list fragment
override fun onCreateOptionsMenu(menu: Menu, menuInflater: MenuInflater) {
menuInflater.inflate(R.menu.list_toolbar, menu)
super.onCreateOptionsMenu(menu, menuInflater)
}
// inside item fragment
override fun onCreateOptionsMenu(menu: Menu, menuInflater: MenuInflater) {
menuInflater.inflate(R.menu.item_toolbar, menu)
super.onCreateOptionsMenu(menu, menuInflater)
}
现在因为需要从所有片段中使用导航抽屉。它需要放置在托管活动视图中(我认为)。这就是我初始化它的方式
override fun onCreate(savedInstanceState: Bundle?) {
// inside hosting activity view
ActionBarDrawerToggle(this, drawer, toolbar, R.string.open, R.string.close).apply {
addDrawerListener(this)
syncState()
}
}
这行得通,我得到了工作导航抽屉。但是,当我导航到项目片段时。工具栏中的后退按钮充当导航抽屉切换按钮,显示和隐藏抽屉,而不是向后导航。
PS。这就是我在项目片段 onCreate 方法中添加后退按钮的方式
(activity as AppCompatActivity).supportActionBar?.setDisplayHomeAsUpEnabled(true)
(activity as AppCompatActivity).supportActionBar?.setDisplayShowHomeEnabled(true)
所以实际的问题是如何让后退按钮表现得像它应该的那样,而不是切换导航抽屉?
解决方案
创建名为 homeActivity 的活动作为(示例)
将此添加到您的 xml 中,这是您的 homeactivity xml
FrameLayout 作为容器,它有助于处理 Fragment ...并将 Framelayout 边距设置为 50dp,以便在您开始交易时工具栏将保留在那里
<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout
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:layout_width="match_parent"
android:layout_height="match_parent"
>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="53dp"
android:layout_alignParentTop="true"
android:id="@+id/too"
>
<android.support.design.widget.AppBarLayout
android:layout_width="match_parent"
android:layout_height="50dp"
android:layout_alignParentTop="true"
>
<android.support.v7.widget.Toolbar
android:layout_width="match_parent"
android:layout_height="50dp"
android:id="@+id/tabs"
android:background="@drawable/new_layout"
>
<ImageView(icon)
android:id="@+id/animation_view"
android:layout_marginTop="5dp"
android:layout_width="40dp"
android:layout_height="40dp"
/>
</android.support.v7.widget.Toolbar>
</android.support.design.widget.AppBarLayout>
</RelativeLayout>
<FrameLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginTop = "50dp"
android:id="@+id/container">
</FrameLayout>
</android.support.design.widget.CoordinatorLayout>
在家庭活动中使用它进行交易
private void initializeFragment(){
FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
fragmentTransaction.add(R.id.main_container, homeFragment);
fragmentTransaction.add(R.id.main_container, notificationFragment);
fragmentTransaction.add(R.id.main_container, accountFragment);
fragmentTransaction.hide(notificationFragment);
fragmentTransaction.hide(accountFragment);
fragmentTransaction.commit();
}
private void replaceFragment(Fragment fragment, Fragment currentFragment){
FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
if(fragment == homeFragment){
fragmentTransaction.hide(accountFragment);
fragmentTransaction.hide(notificationFragment);
}
if(fragment == accountFragment){
fragmentTransaction.hide(homeFragment);
fragmentTransaction.hide(notificationFragment);
}
if(fragment == notificationFragment){
fragmentTransaction.hide(homeFragment);
fragmentTransaction.hide(accountFragment);
}
fragmentTransaction.show(fragment);
//fragmentTransaction.replace(R.id.main_container, fragment);
fragmentTransaction.commit();
}
推荐阅读
- java - JDBI:插入数据时的长/整数异常
- java - 如何通过 OWL API 从多个文件中加载本体?
- c# - 从 BundleConfig 在 RegisterBundles 中查找网站 URL
- r - 在 R 中计算平均值时丢失小数位
- reactjs - 我应该如何使用 HOC 测试 React 组件的组成(或者我什至应该测试它们)?
- javascript - 如何为 SinglyLinkedList 实现方法 add(value, index) 和 remove(index)
- python - 使用请求从 Python 3 中的 API 调用下载 CSV
- java - Java Netbeans 显示 opencv3 错误“错误:无法找到或加载主类库”
- chatbot - 如何区分对话流中语音响应的缩写
- javafx - 为什么 javaFX 在运行时使用阿拉伯语太慢?