zoukankan      html  css  js  c++  java
  • 关于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键
        }
  • 相关阅读:
    数据结构-树与二叉树-思维导图
    The last packet successfully received from the server was 2,272 milliseconds ago. The last packet sent successfully to the server was 2,258 milliseconds ago.
    idea连接mysql报错Server returns invalid timezone. Go to 'Advanced' tab and set 'serverTimezone' property
    redis学习笔记
    AJAX校验注册用户名是否存在
    AJAX学习笔记
    JSON学习笔记
    JQuery基础知识学习笔记
    Filter、Listener学习笔记
    三层架构学习笔记
  • 原文地址:https://www.cnblogs.com/gis-laozhang/p/6652547.html
Copyright © 2011-2022 走看看