码迷,mamicode.com
首页 > 其他好文 > 详细

关于ToolBar+DrawerLayout的小结

时间:2017-03-31 18:18:02      阅读:203      评论:0      收藏:0      [点我收藏+]

标签:out   多个   架构   pat   bundle   ext   single   tac   time   

 

 

将平时的一些困惑记录下来,共勉。

------------------------------------------------------------

应用场景: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的小结

标签:out   多个   架构   pat   bundle   ext   single   tac   time   

原文地址:http://www.cnblogs.com/gis-laozhang/p/6652547.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!