博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
actionbar-displayOptions 属性分析
阅读量:5110 次
发布时间:2019-06-13

本文共 6014 字,大约阅读时间需要 20 分钟。

displayOptions 这个属性主要是控制这actionbar 上返回按钮、标题等的显示。它作为 actionBarStyle 的一个item,如下

然后我们可以从 ActionBarView这个类中看到它的使用

setDisplayOptions(a.getInt(R.styleable.ActionBar_displayOptions, DISPLAY_DEFAULT));

 

我们通过查询源码

frameworks/base/core/res/res/values/attrs.xml

可以发现这条属性可以使用的成员如下

 

它们对应的代码中的数值如下

ActionBar.DISPLAY_USE_LOGO |            ActionBar.DISPLAY_SHOW_HOME |            ActionBar.DISPLAY_HOME_AS_UP |            ActionBar.DISPLAY_SHOW_TITLE |                        ActionBar.DISPLAY_SHOW_CUSTOM | //disableHome 代码中未看到 //这个是设置是否 action_bar_title 双行显示                              ActionBar.DISPLAY_TITLE_MULTIPLE_LINES;

 

 

 

 

下面我们就来研究下,这几个属性到底是什么作用

直接看demo

actionbar style

我们发现,actionbar上面就显示了三项。这三项分别是(从左到右)

homeAsUp-返回箭头

showHome-图标

showTitle-标题

其他没有显示的三项(接下来会研究)

useLogo-未知

showCustom-未知

disableHome-未知

我们去ActionBarView这个类中去寻找答案

1.showCustom

我们找到如下关键代码

public void setCustomView(View view) {        final boolean showCustom = (mDisplayOptions & ActionBar.DISPLAY_SHOW_CUSTOM) != 0;        if (showCustom) {            ActionBarTransition.beginDelayedTransition(this);        }            if (mCustomNavView != null && showCustom) {            removeView(mCustomNavView);        }            mCustomNavView = view;        if (mCustomNavView != null && showCustom) {            addView(mCustomNavView);        }        }

很明显,这个属性控制的是custoView的显示问题

2.disableHome

 这个属性具体有什么作用,暂时还没有发现。在framework下搜索这个属性也没有找到具体使用的地方。

3.useLogo

还是从framework下寻找答案。我们从actionBarView中看到如下代码

if ((flagsChanged & ActionBar.DISPLAY_USE_LOGO) != 0) {          final boolean logoVis = mLogo != null && (options & ActionBar.DISPLAY_USE_LOGO) != 0;         mHomeLayout.setIcon(logoVis ? mLogo : mIcon);  }

所以说,它的作用其实跟showHome是差不多的,它就是从manifest里面读取icon,然后在activity中显示出来

此外,我们还能看到如下代码

final boolean showHome = (options & ActionBar.DISPLAY_SHOW_HOME) != 0;            final boolean homeAsUp = (mDisplayOptions & ActionBar.DISPLAY_HOME_AS_UP) != 0;            final boolean titleUp = !showHome && homeAsUp;            mHomeLayout.setShowIcon(showHome); public void setShowIcon(boolean showIcon) {            mIconView.setVisibility(showIcon ? VISIBLE : GONE);        }

 

我们知道,showHome 是总开关。只有它跟useLogo 同时存在的时候,才能显示logo

 看如下效果

 

我们既然知道了这几个属性的意义,那么我们如何改改他们的样式呢?这就需要我们去继续看它们的代码实现了。

还是在actionBarView中寻找答案

1.看到如下方法

public void setDisplayOptions(int options) {    ......}

我们还能从WindowDecorActionBar 中看到另一个相同的方法

public void setDisplayOptions(@DisplayOptions int options, @DisplayOptions int mask) {    ......}

这两个方法分析如下

直接看如下代码

public void removeBackButton() {        if (mActionBar == null) {            return;        }           // Remove the back button but continue showing an icon.        final int mask = ActionBar.DISPLAY_HOME_AS_UP | ActionBar.DISPLAY_SHOW_HOME;        mActionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_HOME, mask);        mActivity.getActionBar().setHomeButtonEnabled(false);    }   /* Vanzo:zhangshuli on: Fri, 17 Apr 2015 18:15:31 +0800 */    public void setBackButtonEnable(boolean enable) {        if (mActionBar == null) {            return;        }           mActivity.getActionBar().setHomeButtonEnabled(enable);    }   // End of Vanzo: zhangshuli    public void setBackButton() {        if (mActionBar == null) {            return;        }           // Show home as up, and show an icon.        final int mask = ActionBar.DISPLAY_HOME_AS_UP | ActionBar.DISPLAY_SHOW_HOME;        mActionBar.setDisplayOptions(mask, mask);        mActivity.getActionBar().setHomeButtonEnabled(true);    }

上面代码中

mActionBar.setDisplayOptions(mask, mask);

就是用来设置home按钮显示的,它的具体用法如下

(1)如果只有一个参数,那么它就是直接设定显示项,

如,

int options = DISPLAY_SHOW_HOME | DISPLAY_USE_LOGO;setDisplayOptions(options);

那么,actionbar就会显示home跟log按钮,也就是,里面添加了谁,谁就显示

(2)如果有两个参数的话

int options = ActionBar.DISPLAY_SHOW_TITLE |ActionBar.DISPLAY_SHOW_HOME ;int mask = ActionBar.DISPLAY_HOME_AS_UP | ActionBar.DISPLAY_SHOW_TITLE | ActionBar.DISPLAY_SHOW_HOME | ActionBar.DISPLAY_SHOW_CUSTOM;getSupportActionBar().setDisplayOptions(options, mask);

如上代码,这时候actionbar会显示home 跟title,其他的不会显示

也就是只有当options在mask中被设置才能被显示,也就是设置为true。

2.单独设置上面某个属性显示与否

从WindowDecorActionBar 能看到如下方法

单独设置某项显示方法如下

getActionBar().setDisplayHomeAsUpEnabled(true);getActionBar().setDisplayShowCustomEnabled(true);getActionBar().setDisplayShowHomeEnabled(true);getActionBar().setDisplayShowTitleEnabled(true);getActionBar().setDisplayUseLogoEnabled(true);

3.设置各个按钮是否可点击状态

//它好像可以控制home等的点击状态getActionBar().setHomeButtonEnabled(true);

 这个方法实现如下

private void setHomeButtonEnabled(boolean enable, boolean recordState) {        if (recordState) {            mWasHomeEnabled = enable;        }            if (mExpandedActionView != null) {            // There's an action view currently showing and we want to keep the state            // configured for the action view at the moment. If we needed to record the            // new state for later we will have done so above.            return;        }            mUpGoerFive.setEnabled(enable);        mUpGoerFive.setFocusable(enable);        // Make sure the home button has an accurate content description for accessibility.        updateHomeAccessibility(enable);    }
mUpGoerFive = (ViewGroup) inflater.inflate(                com.android.internal.R.layout.action_bar_up_container, this, false);        mHomeLayout = (HomeView) inflater.inflate(homeResId, mUpGoerFive, false);

很清楚就知道了,它控制的其实是homeAsUp 跟home两个图标的显示问题

现在我们已经知道了它们的显示跟隐藏,那么我们通过什么方式来更改它们的图标呢。

仍然从代码中找答案

//设置home图标public void setIcon(Drawable icon) {}//设置logo图标public void setLogo(Drawable logo) {}//设置homeAsUp图标public void setUpIndicator(Drawable d) {}//设置titlepublic void setTitle(CharSequence title) {}//设置subtitlepublic void setSubtitle(CharSequence subtitle) {}

如何在xml中更改呢

更改homeAsUp

看up按钮在framework中的布局

所以我们可以在theme中修改它的图标

@android:drawable/ic_ab_back_funui

 

转载于:https://www.cnblogs.com/zhangshuli-1989/p/zhangshuli_home_150417202.html

你可能感兴趣的文章
挂载设备时出现错误:mount: unknown filesystem type 'ntfs'
查看>>
结对编程第一次作业
查看>>
gulp入门学习
查看>>
JDK源码那些事儿之红黑树基础下篇
查看>>
TabHost
查看>>
Linux时间戳和标准时间的互转
查看>>
error: failed to push some refs to 'https://gitee.com/xxx/xxx'
查看>>
BeautifulSoup使用
查看>>
创建Maven工程
查看>>
震惊!计算机连0.3+0.6都算不对?浅谈IEEE754浮点数算数标准
查看>>
Centos 上 Tengine安装
查看>>
POJ 1780 欧拉i回路判断&&输出欧拉回路
查看>>
多行文本框的高度变化
查看>>
Jlink接口的Jtag和SWD接口定义
查看>>
linux 系统下 android studio 获取SHA1
查看>>
Scala的对字符串应用
查看>>
ajax的使用
查看>>
英语常用缩写(二)
查看>>
SpringBoot集成Redis做缓存处理
查看>>
停更声明
查看>>