关于ToolBar+DrawerLayout的小结
Posted gis老张
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于ToolBar+DrawerLayout的小结相关的知识,希望对你有一定的参考价值。
将平时的一些困惑记录下来,共勉。
------------------------------------------------------------
应用场景:ToolBar(用ToolBar代替ActionBar)+DrawerLayout
values---styles----> <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
其中架构采用的是(一个)Activity+(多个)Fragment形式,每个Fragment显示的标题不一样,于是将ToolBar定义在每个Fragment布局视图中。由于多个Fragment都有ToolBar,可以将其抽离出来,只在每个Fragment中加入以下代码,同时单独在布局视图文件夹下建一个“title.xml”,这样便于管理,***fragment代码如下:
<!--引入自定义标题布局-->
<include layout="@layout/title" />
title.xml,代码如下:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" xmlns:app="http://schemas.android.com/apk/res-auto"> <android.support.v7.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="wrap_content" android:minHeight="?attr/actionBarSize" android:background="?attr/colorPrimary" android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" app:popupTheme="@style/ThemeOverlay.AppCompat.Light" > <!--ToolBar标题的文字,居中显示--> <TextView android:id="@+id/toolbar_title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" android:layout_gravity="center" android:maxLines="1" android:textColor="@android:color/white" android:textSize="20sp" /> </android.support.v7.widget.Toolbar> </LinearLayout>
在每个fragment中实现标题栏以及显示标题名称,以一个fragment为例,方法如下:
@Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.fragment_map, container, false); } @Override public void onViewCreated( View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState);
Toolbar toolbar = (Toolbar) view.findViewById(R.id.toolbar);
TextView textView = (TextView) view.findViewById(R.id.toolbar_title);
toolbar.setTitle(" ");
textView.setText(R.string.fragment_plot);//显示toolbar的标题
如果toolbar上需要增加按钮以实现某些功能,则可以在在菜单文件夹(menu文件夹)里创建menu_fragment_trail.xml文件(文件名可以任意命名)进行菜单项设置,例如:
<menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"> <group android:checkableBehavior="single"> <item android:id="@+id/MMPK_Map" android:title="@string/mmpk" app:showAsAction="never" /> <item android:id="@+id/TILE_Map" android:title="@string/tilelayer" app:showAsAction="never" /> <item android:id="@+id/SATE_Map" android:title="@string/satemap" app:showAsAction="never" /> </group> </menu>
同时在fragment中进行调用,代码如下:
toolbar.inflateMenu(R.menu.menu_fragment_trail);//设置右上角的填充菜单 toolbar.getMenu().getItem(0).setChecked(true); //默认选中切片地图 toolbar.setOnMenuItemClickListener(this);//监听菜单项点击事件
//图层切换选择 @Override public boolean onMenuItemClick(MenuItem item) { switch (item.getItemId()) { case R.id.MMPK_Map: //create a map with MMPK loadMobileMapPackage(mmpkFilePath); toolbar.getMenu().getItem(0).setChecked(true); break; case R.id.TILE_Map: // create a map with Streets Basemap loadArcgisOnlineMap(tilemappath);//加载切片底图 toolbar.getMenu().getItem(1).setChecked(true); break; case R.id.SATE_Map: // create a map with Satelite Basemap loadArcgisOnlineMap(satemappath);//加载影像图 toolbar.getMenu().getItem(2).setChecked(true); break; case R.id.home: mDrawerLayout.openDrawer(GravityCompat.START);//打开DrawerLayout default: } return true; }
如果需要在toolbar上调用系统自带的返回键,则使用如下方法进行调用。
在toolbar上显示返回键按钮:
((AppCompatActivity)mActive).setSupportActionBar(toolbar);
ActionBar actionBar = ((AppCompatActivity) getActivity().getSupportActionBar();//强转
if (actionBar != null) { actionBar.setDisplayHomeAsUpEnabled(true); actionBar.setHomeButtonEnabled(true); }
//图层切换选择 @Override public boolean onMenuItemClick(MenuItem item) { switch (item.getItemId()) { case R.id.MMPK_Map: //create a map with MMPK loadMobileMapPackage(mmpkFilePath); toolbar.getMenu().getItem(0).setChecked(true); break; case R.id.TILE_Map: // create a map with Streets Basemap loadArcgisOnlineMap(tilemappath);//加载切片底图 toolbar.getMenu().getItem(1).setChecked(true); break; case R.id.SATE_Map: // create a map with Satelite Basemap loadArcgisOnlineMap(satemappath);//加载影像图 toolbar.getMenu().getItem(2).setChecked(true); break; case R.id.home: mDrawerLayout.openDrawer(GravityCompat.START);//打开DrawerLayout default: } return true; }
此外如果想达到点击返回键既能弹出DrawerLayout窗口的应用效果,还需要在onCreate()方法中加入setHasOptionsMenu(true)方法,代码如下:
@Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setHasOptionsMenu(true);//这样才能打开home键 }
以上是关于关于ToolBar+DrawerLayout的小结的主要内容,如果未能解决你的问题,请参考以下文章
Android使用ToolBar+DrawerLayout+NavigationView实现侧滑抽屉效果
android 5.X Toolbar+DrawerLayout实现抽屉菜单
android ToolBar与DrawerLayout笔记
如何使用 Appcompat v7 21、Toolbar 和 DrawerLayout 将 Burger 动画化为箭头