按下HomeUp时如何禁用背景颜色?
作者:互联网
背景:
由于以下原因,我目前在“活动”中启用了HomeUp按钮:
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
根据Documentation,它与setHomeButtonEnabled
有关:
Enables or disables the “home” button in the corner of the action bar […] Setting the constant DISPLAY_HOME_AS_UP display option (setDisplayHomeAsUpEnabled method) will automatically enable the home button.
另外,我使用以下样式通过选择器自定义ActionBar中项目的状态背景:
<style name="MainTheme" parent="@style/Theme.AppCompat.Light">
<item name="android:actionBarItemBackground">@drawable/ab_item_background</item>
<item name="actionBarItemBackground">@drawable/ab_item_background</item>
</style>
尽管这很好用,但是当启用UpIndicator时,我不想为HomeUp按钮使用可绘制的选择器.
我为什么需要它:
ActionBar的背景为灰色(相对于Theme.AppCompat.Light),按下项目时选择器使用绿色背景.但是,应用程序图标也为绿色,当按下该图标时,它将与按下背景的状态合并.我需要通过不为HomeUp的背景使用可绘制对象来避免这种情况.
题:
关于变通办法,我如何实现?
笔记:
>我尝试搜索一个相关属性,该属性允许使用自定义背景的应用程序图标和UpIndicator在style.xml中进行自定义,但在Resources中找不到它.
>如果我使用setDisplayHomeAsUpEnabled(true)和setDisplayHomeAsUpEnabled(false),则我具有菜单项的预期行为(背景相对于其状态发生了变化),但是尽管HomeUp按钮的背景行为正确,但不再启用它.
>另外,我想避免对ActionBar使用CustomView.
更新:
根据Adneal’s answer并经过测试和研究,结果如下:
_______________________________________________________________________________
| | | | |
| API | R.id.home | android.R.id.home | method |
|_____|________________________|_________________________|______________________|
| | | | |
| 8 | OK | -- | getParent() x 1 |
| 10 | OK | -- | getParent() x 1 |
| 11 | OK | -- | getParent() x 1 |
| 12 | OK | -- | getParent() x 1 |
| 13 | OK | -- | getParent() x 1 |
| 14 | -- | OK | getParent() x 1 |
| 15 | -- | OK | getParent() x 1 |
| 16 | -- | OK | getParent() x 1 |
| 17 | -- | OK | getParent() x 2 |
| 18 | -- | OK | getParent() x 2 |
| 19 | -- | OK | getParent() x 2 |
|_____|________________________|_________________________|______________________|
然后,正确的条件应该是:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
// retrieve the two parents with "android.R.id.home"
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
// retrieve the first parent with "android.R.id.home"
} else {
// retrieve the first parent with "R.id.home"
}
解决方法:
您可以使用View.getParent
将主页按钮的背景设置为空.
一旦在ActionBarView
中膨胀,就将This is the layout that contains the home button添加到up container layout中,这实际上是使用actionBarItemBackground属性的.
但是,AppCompat
并没有采用“向上容器”布局,也没有采用API级别18以下的普通ActionBar(Jelly Bean MR2).
因此,要更改主页按钮的背景,您将在使用支持库或API级别11-17的ActionBar时一次调用View.getParent,而在更改API级别18时调用两次.
View home;
final int version = Build.VERSION.SDK_INT;
if (version >= Build.VERSION_CODES.JELLY_BEAN_MR2) {
// Normal action bar, post-"up container"
home = (View) findViewById(android.R.id.home).getParent().getParent();
} else if (version >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
// Normal action bar, pre-"up container"
home = (View) findViewById(android.R.id.home).getParent();
} else {
// Support library action bar
home = (View) findViewById(R.id.home).getParent();
}
home.setBackgroundDrawable(null);
AppCompat可能会在将来进行更新,以包含到“向上容器”布局中,因此请记住,稍后可能需要调整代码以适应这种情况.
标签:android-homebutton,android-actionbar,android-ui,android 来源: https://codeday.me/bug/20191121/2054315.html