其他分享
首页 > 其他分享> > 按下HomeUp时如何禁用背景颜色?

按下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