Toolbar的使用注意点以及封装

沉浸式状态栏(顶部状态栏和底部导航栏)
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值,就需要大家自己设置一下,这里就不贴了

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,826评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,968评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,234评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,562评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,611评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,482评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,271评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,166评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,608评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,814评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,926评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,644评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,249评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,866评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,991评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,063评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,871评论 2 354

推荐阅读更多精彩内容