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

我知道如何更改样式xml文件中的homeAsUpIndicator 。 问题是如何以编程方式更改它

我想这样做的原因是因为在某些视图中我支持侧面导航 (滑动菜单) – 按上/下标题button,显示侧面菜单。

在其他观点中,我支持自然的上/下

因此我想用不同的指标图标来表示两种不同的逻辑 – 侧导航与上/下。

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

Solutions Collecting From Web of "如何以编程方式将资源更改为资源?"

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

@matthias的解决scheme无法在所有设备上工作。更改homeAsUpIndicator更好的解决scheme是在样式中设置@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具有以编程方式编辑homeAsUpIndicator的方法, 请参阅文档 。

虽然这个答案可能会达到预期的行为,正如你可以在下面的注释中看到的:“ 这种破解在某些设备上不起作用 ”。 根据Adneal的回答 ,我find了另外一种方法,它给了我线索,特别是正确的方法。

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

  • API> = 14:获取Home ImageViewandroid.R.id.home )的相对Parent ,并检索第一个是UpIndicatorandroid.R.id.up )的子对象。

然后,这段代码dynamic改变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)); } 

我没有在多个设备上进行testing(这就是为什么我不确定上面的代码适用于所有设备),但是这似乎在更新部分中提到的 API中起作用。

注意:如果你没有区分高级API和低级API,你将得到一个NullPointerException,因为R.id.up在更高的API中不可用,而android.R.id.up在低级API中不可用。

这对我有效

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

我为此写了解决scheme。 这不是美丽的,但工作:

 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; } 

作为参数put: getWindow()。getDecorView()

使用android 2.3.3和4.1.1testing几个设备(nexus 7(4.4.2),samsung galaxy s +(2.3.6),yaiu g3(4.2.2))和仿真器

这是工作代码

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