以编程方式更改操作栏homeAsUpIndicator

问题描述 投票:5回答:12

我使用以下hack以编程方式更改homeAsupIndicator。

int upId = Resources.getSystem().getIdentifier("up", "id", "android");
if (upId > 0) {
    ImageView up = (ImageView) findViewById(upId);
up.setImageResource(R.drawable.ic_action_bar_menu);
up.setPadding(0, 0, 20, 0);
}

但这并不适用于大多数新手机(HTC One,Galaxy S3等)。有没有一种方法可以跨设备统一更改。我需要它只在主屏幕上更改。其他屏幕将具有默认屏幕。所以不能使用styles.xml

android actionbarsherlock android-actionbar
12个回答
18
投票

这就是我为实现这一行为所做的。我继承了基本主题并创建了一个新主题,将其用作特定活动的主题。

<style name="CustomActivityTheme" parent="AppTheme">
    <item name="android:homeAsUpIndicator">@drawable/custom_home_as_up_icon</item>
</style>

并在android清单中我将活动主题如上所述。

<activity
        android:name="com.example.CustomActivity"
        android:theme="@style/CustomActivityTheme" >
</activity>

效果很好。当我检查我拥有的所有设备时,将再次更新。谢谢@faylon指向正确的方向


0
投票

如果有人使用库support-v7 appcompat,您可以直接调用此方法:

  • getSupportActionBar()。setHomeAsUpIndicator(int redId)

在其他情况下,您可以使用此解决方案:


0
投票

如果你在ActionBarDrawerToggle中使用DrawerLayout,那么请查看 mSearchItem.setOnActionExpandListener(new MenuItem.OnActionExpandListener() { @Override public boolean onMenuItemActionExpand(MenuItem item) { // https://stackoverflow.com/questions/17585892/change-the-actionbar-homeasupindicator-programamtically int actionBarId = getResources().getIdentifier("android:id/action_bar", null, null); View view = getActivity().getWindow().getDecorView().findViewById(actionBarId); if (view == null || !(view instanceof ViewGroup)) { return true; } final ViewGroup actionBarView = (ViewGroup)view; // The second home view is only inflated after // setOnActionExpandListener() is first called actionBarView.post(new Runnable() { @Override public void run() { //The 2 ActionBarView$HomeView views are always children of the same view group //However, they are not always children of the ActionBarView itself //(depends on OS version) int upId = getResources().getIdentifier("android:id/up", null, null); View upView = actionBarView.findViewById(upId); ViewParent viewParent = upView.getParent(); if (viewParent == null) { return; } viewParent = viewParent.getParent(); if (viewParent == null || !(viewParent instanceof ViewGroup)) { return; } ViewGroup viewGroup = (ViewGroup) viewParent; int childCount = viewGroup.getChildCount(); for (int i = 0; i < childCount; i++) { View childView = viewGroup.getChildAt(i); if (childView instanceof ViewGroup) { ViewGroup homeView = (ViewGroup) childView; upView = homeView.findViewById(upId); if (upView != null && upView instanceof ImageView) { Drawable upDrawable = getResources().getDrawable(R.drawable.ic_ab_back_holo_dark_am); upDrawable.setColorFilter(accentColorInt, PorterDuff.Mode.MULTIPLY); ((ImageView) upView).setImageDrawable(upDrawable); } } } } });


-1
投票
https://stackoverflow.com/a/23522910/944630

您还可以在属性android:logo和标签中的清单中定义徽标,并在主题中设置您要在操作栏中使用徽标而不是应用图标。


11
投票

问题是动态改变Up Home Indicator,虽然这个answer接受,它是关于ThemesStyles。根据Adneal's answer的说法,我找到了一种以编程方式执行此操作的方法,它为我提供了线索,特别是正确的方法。我使用了下面的代码片段,它适用于(测试过的)设备,其中提到了here的API。

对于较低的API,我使用R.id.up,这在更高的API上不可用。这就是为什么,我通过一个小的解决方法来获取这个id,这个解决方法是获取home按钮(android.R.id.home)的父节点及其第一个子节点(android.R.id.up):

if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
    // get the parent view of home (app icon) imageview
    ViewGroup home = (ViewGroup) findViewById(android.R.id.home).getParent();
    // get the first child (up imageview)
    ( (ImageView) home.getChildAt(0) )
        // change the icon according to your needs
        .setImageResource(R.drawable.custom_icon_up));
} else {
    // get the up imageview directly with R.id.up
    ( (ImageView) findViewById(R.id.up) )
        .setImageResource(R.drawable.custom_icon_up));
} 

注意:如果您不使用SDK条件,您将获得一些NullPointerException



3
投票

您需要做的就是使用以下代码行:

getSupportActionBar().setDisplayHomeAsUpEnabled(true);

这将使用向上指示符更改图标。要稍后禁用它,只需再次调用此函数并将false作为参数传递。


2
投票

通过检查Resources.getSystem()的解决方案不适用于所有设备,更改homeAsUpIndicator的更好解决方案是在样式中设置@null并以编程方式更改徽标资源。

下面是我在style.xml中的代码

<style name="Theme.HomeScreen" parent="AppBaseTheme">
  <item name="displayOptions">showHome|useLogo</item>
  <item name="homeAsUpIndicator">@null</item>
  <item name="android:homeAsUpIndicator">@null</item>
</style>

在代码中,您可以使用setLogo()方法更改徽标。

getSupportActionBar().setLogo(R.drawable.abc_ic_ab_back_holo_light); //for ActionBarCompat
getActionBar().setLogo(R.drawable.abc_ic_ab_back_holo_light); //for default actionbar for post 3.0 devices

另请注意,qazxsw poi具有以编程方式编辑homeAsUpIndicator的方法,qazxsw poi。


1
投票

您可以更轻松地实现此目的。尝试可以在theme.xml和styles.xml中更改actionBarStyle的homeAsUpIndicator属性。

如果你想要一些填充,只需在你的图像中添加一些空白区域。


1
投票

你可以试试这个:

Android API 18

如果需要更改图标的位置,则必须创建一个包含“layer-list”的可绘制文件,如下所示:

actionbar_indicator.xml

refer documentation

0
投票

使用this.getSupportActionBar().setHomeAsUpIndicator( R.drawable.actionbar_indicator ); //for ActionBarCompat this.getActionBar().setHomeAsUpIndicator( R.drawable.actionbar_indicator ); //for default actionbar for post 3.0 devices 因为ActionBar没有方法来改变homeUp图标!


0
投票

添加到Fllo回答<?xml version="1.0" encoding="utf-8"?> <layer-list xmlns:android="http://schemas.android.com/apk/res/android" > <item android:drawable="@drawable/indicator" android:right="5dp" android:left="10dp" /> </layer-list>

我能够在Android 4+上使用这个hack,但是当搜索小部件扩展时,无法理解为什么up / home指示符恢复到默认值。查看视图层次结构,结果显示操作栏的up / home指示符+图标部分有2个实现,当然第一个是在未展开搜索窗口小部件时。所以这里是我用来解决这个问题的代码,并在两种情况下都改变了up / home指标。

getActionBar().setCustomView(int yourView);
© www.soinside.com 2019 - 2024. All rights reserved.