如何以编程方式将主页更改为资源?

时间:2013-05-06 08:22:26

标签: android android-actionbar

我知道如何change the homeAsUpIndicator in the styles xml file问题是如何以编程方式更改

我想这样做是因为在某些视图中我支持侧面导航(滑动菜单) - 按向上/向后标题按钮,显示侧边菜单。

在其他视图中,我支持自然向上/向后按钮。

因此,我希望使用不同的指示器图标来指示两种不同的逻辑 - 侧面导航与上/下。

请不要争论这样做的动机。这是给定的状态。感谢。

6 个答案:

答案 0 :(得分:21)

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

答案 1 :(得分:15)

@matthias的解决方案不适用于所有设备,更改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

另请注意,Android API 18具有以编程方式refer documentation编辑homeAsUpIndicator的方法。

答案 2 :(得分:8)

这对我有用

getSupportActionBar().setHomeAsUpIndicator(R.drawable.my_home_as_up)

答案 3 :(得分:5)

虽然this answer可能会达到预期的行为,但您可以在下面的评论中看到它:“此hack在某些设备上无效”。我根据Adneal's answer找到了另一种方式,它给了我线索,特别是正确的方法。

  • 降低API:使用ID R.id.up 来检索相关的ImageView

  • API&gt; = 14:获取Home Parent的相对ImageView android.R.id.home )并检索第一个孩子UpIndicator android.R.id.up )。

然后,此代码段代码会动态更改UpIndicator

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
        .setImageDrawable(getResources().getDrawable(R.drawable.custom_icon_up));
} else {
    // get the up imageview directly with R.id.up
    ( (ImageView) findViewById(R.id.up) )
        .setImageDrawable(getResources().getDrawable(R.drawable.custom_icon_up));
}  

我没有在多个设备上进行过测试(这就是为什么我不确定上面的代码适用于所有设备的原因),但这似乎在the update part here中提到的API中运行良好。

注意:如果您没有区分较高和较低的API,则会出现NullPointerException,因为R.id.up在较高的API中不可用,而android.R.id.up在较低的API中不可用API。

答案 4 :(得分:2)

我为此写了解决方案。它不漂亮但有效:

public static ImageView getHomeAndUpIndicator(View decorView) {
    ImageView res = null;

    int upId = Resources.getSystem().getIdentifier("up", "id", "android");
    if (upId > 0) {
        res = (ImageView) decorView.findViewById(upId);
    } else {
        if (android.os.Build.VERSION.SDK_INT <= 10) {
            ViewGroup acbOverlay = (ViewGroup)((ViewGroup)decorView).getChildAt(0);
            ViewGroup abcFrame = (ViewGroup)acbOverlay.getChildAt(0);
            ViewGroup actionBar = (ViewGroup)abcFrame.getChildAt(0);
            ViewGroup abLL = (ViewGroup)actionBar.getChildAt(0);
            ViewGroup abLL2 = (ViewGroup)abLL.getChildAt(1);
            res = (ImageView)abLL2.getChildAt(0);
        } else if (android.os.Build.VERSION.SDK_INT > 10 && android.os.Build.VERSION.SDK_INT < 16) {
            ViewGroup acbOverlay = (ViewGroup)((ViewGroup)decorView).getChildAt(0);
            ViewGroup abcFrame = (ViewGroup)acbOverlay.getChildAt(0);
            ViewGroup actionBar = (ViewGroup)abcFrame.getChildAt(0);
            ViewGroup abLL = (ViewGroup)actionBar.getChildAt(1);
            res = (ImageView)abLL.getChildAt(0);
        } else {
            ViewGroup acbOverlay = (ViewGroup)((ViewGroup)decorView).getChildAt(0);
            ViewGroup abcFrame = (ViewGroup)acbOverlay.getChildAt(1);
            ViewGroup actionBar = (ViewGroup)abcFrame.getChildAt(0);
            ViewGroup abLL = (ViewGroup)actionBar.getChildAt(0);
            ViewGroup abF = (ViewGroup)abLL.getChildAt(0);
            res = (ImageView)abF.getChildAt(0);
        }
    }
    return res;
}

作为一个参数: getWindow()。getDecorView()

在少数设备上测试(nexus 7(4.4.2),samsung galaxy s +(2.3.6),yaiu g3(4.2.2))和android 2.3.3和4.1.1的模拟器

答案 5 :(得分:0)

这是工作代码

final Drawable upArrow = getResources().getDrawable(R.drawable.ic_arrow_back_black_24dp);
        upArrow.setColorFilter(Color.parseColor("#000000"), PorterDuff.Mode.SRC_ATOP);
        getSupportActionBar().setHomeAsUpIndicator(upArrow);