美文网首页
Toolbar的使用注意点以及封装

Toolbar的使用注意点以及封装

作者: 0青衣小褂0 | 来源:发表于2019-01-28 16:01 被阅读45次

    沉浸式状态栏(顶部状态栏和底部导航栏)
    Toolbar的使用注意点以及封装
    WToolBarLayout

    toolbar的属性

    <!--toolbar的基本使用-->
    <?xml version="1.0" encoding="utf-8"?>
    <com.a50647.wtoolbarhelper.ToolBarLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:id="@+id/common_toolbar_layout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:isHalfTrans="false">
    
        <android.support.v7.widget.Toolbar
            android:id="@+id/common_toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            android:theme="@style/ToolbarTheme"
            app:contentInsetLeft="0dp"
            app:contentInsetStart="0dp"
            app:contentInsetStartWithNavigation="0dp"
            app:popupTheme="@style/Common_Menu_Style">
    
            <TextView
                android:id="@+id/common_title"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="center"
                android:ellipsize="end"
                android:gravity="center"
                android:maxLines="1"
                android:textColor="@color/common_white"
                android:textSize="20sp" />
        </android.support.v7.widget.Toolbar>
    </com.a50647.wtoolbarhelper.ToolBarLayout>
    

    以上,就是对于toolbar布局的体现,下面就来具体介绍一下几个重要属性所起到的作用(一般来讲,我们都需要对这几个属性进行处理的)
    如未配置沉浸式,则只需将包裹的WToolbarLayout去掉即可

    WToolbarLayout是我自己写的一个可以帮助在沉浸式模式下,实现我们自己的状态栏的小工具,在这一篇当中涉及到的并不
    多,这里可以忽略,可以暂时当作在toolbar上方填充了一个自定义的状态栏
    
    <!--边距-->
    app:contentInsetLeft="0dp"
    app:contentInsetStart="0dp"
    这个边距,指的是在不显示back键的时候,toolbar所包裹的内容,距离开始(一般指左边的距离,是有一个默认距离的
    ,如果我们希望其中的toolbar所包裹的内容可以顶边,则需要自己将这个距离设置为0)
    
    如图: 边距的效果
    
    <!--距离back键的边距-->
    app:contentInsetStartWithNavigation="0dp"
    这个边距,指的是在显示back键的时候,toolbar所包裹的内容,距离back键的边距,也是有一个默认的距离,这就是很多
    小伙伴说,在使用toolbar的时候,标题距离back键太远的原因,我们也是可以进行调整的
    
    边距的效果 - 默认 边距的效果 - 设置
    <!--主题-->
    android:theme="@style/ToolbarTheme"
    主题的主要作用,就是决定back键以及menu键的颜色
    但是需要在v21以上才有作用
    
    附上ToolbarTheme,我这里设置的是白色
    value文件夹的styles中
    <style name="ToolbarTheme" />
    value-v21文件夹的styles中
    <style name="ToolbarTheme">
       <item name="android:colorControlNormal">@color/common_white</item>
    </style>
    
    
    <!--弹出pop_menu的样式-->
    app:popupTheme="@style/Common_Menu_Style"
    注意: 这里的样式是分为两个步骤来完成的,否则没有效果
    1. 需要现在values文件夹的styles中定义,各项属性都有注释
    <style name="Common_Menu_Style" parent="@style/Widget.AppCompat.PopupMenu.Overflow">
            <!-- 是否覆盖锚点,默认为true,即盖住Toolbar -->
            <item name="overlapAnchor">false</item>
            <!-- 弹出层背景颜色,或者drawable -->
            <item name="android:popupBackground">@color/common_blue_50</item>
            <!-- 弹出层垂直方向上的偏移,负值会覆盖toolbar -->
            <item name="android:dropDownVerticalOffset">@dimen/dimens_f2</item>
            <!-- 弹出层水平方向上的偏移,即距离屏幕左边的距离,负值会导致右边出现空隙 -->
            <item name="android:dropDownHorizontalOffset">@dimen/dimens_f2</item>
            <!--文字颜色-->
            <item name="android:textColor">@color/common_white</item>
    </style>
    
    2. 主要在你所作用的activity所使用的主题当中引用
    <!--公共的默认配置-->
     <style name="CommonDefaultTheme" parent="BaseAppTheme">
       ...
       <!--对于menuStyle的默认配置-->
       <item name="actionOverflowMenuStyle">@style/Common_Menu_Style</item>
     </style>
    比如说这里,我选择一个activity的主题是CommonDefalutTheme,则需要item对于actionOverflowMenuStyle来
    进行引用
    
    3. 一般我们会比较关注的是menu所弹出的背景,那么就可以通过
    <!-- 弹出层背景颜色,或者drawable -->
    <item name="android:popupBackground">@color/common_blue_50</item>
    来设置我们想要的背景啦,我这里只是更改了一下颜色
    
    <!--textView的width属性-->
    需要采用wrap_content,否则不能居中
    

    toolbar在java代码中需要的配置,以及封装方式

    public abstract class BaseActivity extends AppCompatActivity {
        protected Context mContext;
        protected ToolBarLayout mToolBarLayout;
        protected Toolbar mToolbar;
        protected TextView mToolBarTitle;
    
        @Override
        protected void onCreate(@Nullable Bundle savedInstanceState) {
            if (!isSupportScreenShot()) {
                getWindow().setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE);
            }
            translateStatueBar();
            super.onCreate(savedInstanceState);
            mContext = this;
            setContentView(getLayoutId());
            initView();
            fitScreen();
        }
    
        /**
         * 沉浸式(默认已在style中配置完成)
         */
        protected void translateStatueBar() {
            Window window = getWindow();
            window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                    | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
        }
    
        /**
         * 是否支持截屏 默认支持
         *
         * @return true 支持 false 不支持
         */
        protected boolean isSupportScreenShot() {
            return true;
        }
    
        /**
         * 获取布局id
         *
         * @return 布局id
         */
        protected abstract int getLayoutId();
    
        /**
         * 初始化view
         */
        protected abstract void initView();
    
        /**
         * 一些需要代码动态适配的地方
         */
        protected void fitScreen() {
    
        }
    
        /**
         * 设置默认的title
         *
         * @param title   标题
         * @param isTrans 是否透明
         */
        protected void initToolBar(CharSequence title, boolean isTrans) {
            initToolBar(title, isTrans, 0);
        }
    
        /**
         * 设置默认的title并伴随menu的style
         *
         * @param title     标题
         * @param isTrans   是否透明
         * @param menuStyle menu的style
         */
        protected void initToolBar(CharSequence title, boolean isTrans, int menuStyle) {
            mToolBarLayout = findViewById(R.id.common_toolbar_layout);
            mToolbar = findViewById(R.id.common_toolbar);
            mToolBarTitle = findViewById(R.id.common_title);
            if (mToolBarLayout == null) {
                return;
            }
            if (isTrans) {
                mToolBarLayout.setBackgroundColor(mContext.getResources().getColor(R.color.transparent));
            } else {
                mToolBarLayout.setBackground(mContext.getResources().getDrawable(R.drawable.common_bg_title));
            }
            if (mToolbar == null) {
                return;
            }
            //一定要在setSupportToolBar之前调用
            mToolbar.setTitle("");
            setSupportActionBar(mToolbar);
            if (menuStyle != 0) {
                mToolbar.setPopupTheme(menuStyle);
            }
            ActionBar actionBar = getSupportActionBar();
            if (actionBar != null) {
                getSupportActionBar().setDisplayHomeAsUpEnabled(isSupportDisplayHomeAsUpEnabled());
            }
            if (mToolBarTitle == null) {
                return;
            }
            mToolBarTitle.setText(title);
        }
    
        /**
         * 是否支持toolBar的返回键,默认支持
         *
         * @return true:支持 false:不支持
         */
        protected boolean isSupportDisplayHomeAsUpEnabled() {
            return true;
        }
    
        /**
         * toolbar菜单
         *
         * @param menu 菜单
         * @return true 表示支持
         */
        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            if (isSupportMenu()) {
                getMenuInflater().inflate(getMenuLayout(), menu);
            }
            return true;
        }
    
        /**
         * 是否支持菜单栏 默认不支持
         *
         * @return true:支持 false:不支持,默认false
         */
        protected boolean isSupportMenu() {
            return false;
        }
    
        /**
         * 支持菜单栏的情况下才会调用,返回菜单布局
         *
         * @return 菜单布局
         */
        protected int getMenuLayout() {
            return R.menu.menu_main;
        }
    
        /**
         * toolbar回退键
         *
         * @param item menu中的按钮
         * @return boolean
         */
        @Override
        public boolean onOptionsItemSelected(MenuItem item) {
            if (android.R.id.home == item.getItemId()) {
                onClickToolBarHome();
            }
            return super.onOptionsItemSelected(item);
        }
    
        /**
         * 当点击toolBar的home键,默认是backPress,不同地方可重写
         */
        protected void onClickToolBarHome() {
            onBackPressed();
        }
    
        /**
         * 在使用toolBar的menu的时候,添加此方法则可以在menu中显示图标
         */
        @SuppressLint("RestrictedApi")
        @Override
        protected boolean onPrepareOptionsPanel(View view, Menu menu) {
            if (!isSupportMenuIcon()) {
                return super.onPrepareOptionsPanel(view, menu);
            }
            if (menu != null) {
                if (menu.getClass() == MenuBuilder.class) {
                    try {
                        Method m = menu.getClass().getDeclaredMethod("setOptionalIconsVisible", Boolean.TYPE);
                        m.setAccessible(true);
                        m.invoke(menu, true);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }
            return super.onPrepareOptionsPanel(view, menu);
        }
    
        /**
         * 在使用menu的时候,是否支持menu列表中图标的显示,默认支持
         *
         * @return true:支持 false:不支持
         */
        protected boolean isSupportMenuIcon() {
            return true;
        }
    }
    

    每一个方法都有注释他的作用以及默认值,感兴趣的小伙伴可以自己配置,并改变一些值,尝试一下
    不同的效果,当然也可以在github上下载代码,直接看一下我的一些使用

    示例activity

    public class MainActivity extends BaseActivity {
    
        @Override
        protected int getLayoutId() {
            return R.layout.activity_main;
        }
    
        @Override
        protected void initView() {
            initToolBar("toolbarLayout", false);
            findViewById(R.id.tv).setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    startActivity(new Intent(MainActivity.this, SecondActivity.class));
                }
            });
            mToolbar.setOnMenuItemClickListener(new Toolbar.OnMenuItemClickListener() {
                @Override
                public boolean onMenuItemClick(MenuItem item) {
                    int itemId = item.getItemId();
                    if (itemId == R.id.action_edit) {
                        startActivity(new Intent(MainActivity.this, SecondActivity.class));
                    }
                    return true;
                }
            });
        }
    
        @Override
        protected boolean isSupportMenu() {
            return true;
        }
    
        @Override
        protected boolean isSupportDisplayHomeAsUpEnabled() {
            return true;
        }
    
        @Override
        protected int getMenuLayout() {
            return R.menu.menu_main;
        }
    }
    

    menu点击事件

    选择对应的id即可

    mToolbar.setOnMenuItemClickListener(new Toolbar.OnMenuItemClickListener() {
                @Override
                public boolean onMenuItemClick(MenuItem item) {
                    int itemId = item.getItemId();
                    if (itemId == R.id.action_edit) {
                        startActivity(new Intent(MainActivity.this, SecondActivity.class));
                    }
                    return true;
                }
            });
    

    封装使用

    首先,需要继承baseActivity
    (1)是否支持截屏 
    true:支持
    false :不支持
    默认支持
    boolean isSupportScreenShot()
    
    (2)初始化toolbar
    title: 文本内容
    isTrans: 是否支持半透明状态栏, true支持,false不支持
    void initToolBar(CharSequence title, boolean isTrans)
    
    可配置menuStyle(需要在activity的style中也配置,就像之前介绍一样)
    void initToolBar(CharSequence title, boolean isTrans, int menuStyle)
    
    (3) 是否显示back键
    true: 显示
    false: 不显示
    默认显示
     boolean isSupportDisplayHomeAsUpEnabled()
    需配合
    void onClickToolBarHome()
    默认是onBackpressed();
    
    (4) 是否支持menu键
    true: 支持
    false: 不支持
    默认不支持
    boolean isSupportMenu()
    需配合
    int getMenuLayout()
    返回一个你所定义的menu,否则就会显示我所给的默认啦
    再配合
    boolean isSupportMenuIcon();
    决定menu当中的图标是否需要显示,true是显示,false是不显示,默认是显示
    

    附上xml代码

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">
    
        <include layout="@layout/common_default_toolbar"/>
    
        <TextView
            android:gravity="center"
            android:id="@+id/tv"
            android:text="goSecond"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />
    </LinearLayout>
    

    common_default_toolbar

    <?xml version="1.0" encoding="utf-8"?>
    <com.a50647.wtoolbarhelper.ToolBarLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:id="@+id/common_toolbar_layout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:isHalfTrans="false">
    
        <android.support.v7.widget.Toolbar
            android:id="@+id/common_toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            android:theme="@style/ToolbarTheme"
            app:contentInsetLeft="0dp"
            app:contentInsetStart="0dp"
            app:contentInsetStartWithNavigation="0dp"
            app:popupTheme="@style/Common_Menu_Style">
    
            <TextView
                android:id="@+id/common_title"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="center"
                android:ellipsize="end"
                android:gravity="center"
                android:maxLines="1"
                android:textColor="@color/common_white"
                android:textSize="20sp" />
        </android.support.v7.widget.Toolbar>
    </com.a50647.wtoolbarhelper.ToolBarLayout>
    

    menu

    <?xml version="1.0" encoding="utf-8"?>
    <menu xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto">
        <item
            android:id="@+id/action_edit"
            android:orderInCategory="1"
            android:title="第一个"
            android:icon="@mipmap/ic_launcher_round"
            app:showAsAction="never"/>
    
        <item
            android:id="@+id/action_share"
            android:orderInCategory="2"
            android:title="第二个"
            app:showAsAction="never"/>
    
        <item
            android:id="@+id/action_settings"
            android:orderInCategory="3"
            android:title="第三个"
            app:showAsAction="never"/>
    
    </menu>
    

    两个theme的写法上面已经贴过啦,可以直接使用的,颜色和demin值,就需要大家自己设置一下,这里就不贴了

    相关文章

      网友评论

          本文标题:Toolbar的使用注意点以及封装

          本文链接:https://www.haomeiwen.com/subject/jkjajqtx.html