Har*_*rry 3 navigation android android-layout android-architecture-components android-jetpack
我正在尝试实现Jetpack随附的新引入的导航体系结构组件。到目前为止,它对于管理应用程序的导航流程非常酷并且非常有用。
我已经用MainActivity中的工具栏设置了包括抽屉布局在内的基本导航,如下所示:
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val navController = Navigation.findNavController(this, R.id.mainNavFragment)
// Set up ActionBar
setSupportActionBar(toolbar)
NavigationUI.setupActionBarWithNavController(this, navController, drawerLayout)
// Set up navigation menu
navigationView.setupWithNavController(navController)
}
override fun onSupportNavigateUp(): Boolean {
return NavigationUI.navigateUp(Navigation.findNavController(this, R.id.mainNavFragment), drawerLayout)
}
}
Run Code Online (Sandbox Code Playgroud)
使用此布局:
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<android.support.design.widget.AppBarLayout
android:id="@+id/appbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:theme="@style/AppTheme.AppBarOverlay">
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
app:popupTheme="@style/AppTheme.PopupOverlay"
app:navigationIcon="@drawable/ic_home_black_24dp"/>
</android.support.design.widget.AppBarLayout>
<fragment
android:id="@+id/mainNavFragment"
android:name="androidx.navigation.fragment.NavHostFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:defaultNavHost="true"
app:navGraph="@navigation/nav_main"/>
</LinearLayout>
Run Code Online (Sandbox Code Playgroud)
它的鳍。但是,真正的问题是,何时为应用提供定制设计,
如何设置汉堡包的自定义图标或后退图标?
截至目前,由NavigatoinController本身处理。
我已经尝试过下面的选项,但是不起作用:
app:navigationIcon="@drawable/ic_home_black_24dp" //1
supportActionBar.setHomeAsUpIndicator(R.drawable.ic_android_black_24dp) //2
Run Code Online (Sandbox Code Playgroud)
谢谢!
导航版本存在相同的问题1.0.0-alpha08。我已经通过重新实现setupActionBarWithNavController以提供所需的自定义行为来解决了该问题。
setDisplayShowTitleEnabled(false) //Disable the default title
container.findNavController().addOnDestinationChangedListener { _, destination: NavDestination, _ ->
//Set the toolbar text (I've placed a TextView within the AppBar, which is being referenced here)
toolbar_text.text = destination.label
//Set home icon
supportActionBar?.apply {
setDisplayHomeAsUpEnabled((destination.id in NO_HOME_ICON_FRAGMENTS).not())
setHomeAsUpIndicator(if (destination.id in TOP_LEVEL_FRAGMENTS) R.drawable.app_close_ic else 0)
}
}
Run Code Online (Sandbox Code Playgroud)
您需要做的就是将一个onDestinationChangedListener添加到导航控制器,并为每个目标设置标题和图标。
该代码应放在包含导航图的活动内的onCreate()方法内,并NavigationUI.setupActionBarWithNavController(this, navController, drawerLayout)应从代码中删除。
请注意,这将删除导航抽屉的默认功能。
我希望这有帮助!
小智 7
Navigation Component 使用 DrawerArrowDrawable 作为底层实现,它实际上是在汉堡图标和后退箭头图标之间进行动画处理。两个图标的外观都可以通过样式进行一定程度的修改,参见
如何从 Android appcompat v7 21 库中设置 DrawerArrowToggle 的样式
对于我们的应用程序,我们使用以下属性来获取细长箭头:
<style name="ToolbarArrow" parent="Widget.AppCompat.DrawerArrowToggle">
<item name="color">@color/primary</item>
<item name="drawableSize">32dp</item>
<item name="arrowShaftLength">22dp</item>
<item name="thickness">1.7dp</item>
<item name="arrowHeadLength">8dp</item>
</style>
Run Code Online (Sandbox Code Playgroud)
必须在您的应用主题中设置此样式,如下所示:
<item name="drawerArrowStyle">@style/ToolbarArrow</item>
Run Code Online (Sandbox Code Playgroud)
小智 2
我使用导航版本时遇到同样的问题1.0.0-alpha07。我找到了以下解决方法:
在我的活动中,我将工具栏视图设置为支持操作栏和导航控制器:
val toolbar = findViewById<Toolbar>(R.id.toolbar)
setSupportActionBar(toolbar)
toolbar.setupWithNavController(navController, appBarConfiguration)
Run Code Online (Sandbox Code Playgroud)
然后在onViewCreated我想要替换箭头图标的片段中,我设置图标并将其设置为启用(可能可以在 中执行此操作onAttached):
(requireActivity() as AppCompatActivity).supportActionBar?.apply {
setHomeAsUpIndicator(R.drawable.ic_close_24dp)
setDisplayHomeAsUpEnabled(true)
}
Run Code Online (Sandbox Code Playgroud)
当我执行此操作时,导航组件似乎仍然可以正确处理后退堆栈、动画并删除开始片段上的图标。希望在离开 alpha 之前,导航组件支持自定义图标,而不必求助于旧式操作栏 API。
| 归档时间: |
|
| 查看次数: |
2623 次 |
| 最近记录: |