API 18具有新方法ActionBar.setHomeAsUpIndicator()
-很遗憾,目前支持库不支持这些方法
我使用以下技巧以编程方式更改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
这是我为实现这种行为所做的。我继承了基本主题,并创建了一个新主题以将其用作特定活动的主题。
<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指出正确的方向
如果有人使用库support-v7 appcompat,则可以直接调用此方法:
如果您将DrawerLayout
this.getSupportActionBar().setDisplayUseLogoEnabled(true);
this.getSupportActionBar().setLogo(R.drawable.about_selected);
问题是动态地]更改 对于较低的API,我使用Up Home Indicator
,尽管此answer正在接受并且大约是Themes
和Styles
。根据Adneal's answer,我找到了一种以编程方式执行此操作的方法,这为我提供了线索,尤其是正确的执行方法。我使用了以下代码段代码,它在提到here的API的(经过测试的)设备上运行良好。R.id.up
,在较高的API上不可用。这就是为什么,我通过一些变通方法来检索此ID,该方法是获取home
按钮的父对象(android.R.id.home
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
。
API 18具有新方法ActionBar.setHomeAsUpIndicator()
-很遗憾,目前支持库不支持这些方法
您需要做的就是使用以下代码行:
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
这将更改带有向上指示器的图标。要在以后禁用它,只需再次调用此函数并传递false
作为参数。
通过检查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
还请注意,
Android API 18
具有以编程方式编辑homeAsUpIndicator refer documentation的方法。
您可以以更简单的方式实现这一目标。尝试在您的theme.xml和styles.xml中更改actionBarStyle的homeAsUpIndicator属性。
如果需要填充,只需在图像中添加一些空白。
您可以尝试以下方法:
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_indicator.xml
<?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>
使用getActionBar().setCustomView(int yourView);
,因为ActionBar还没有方法更改homeUp图标!
我能够在Android 4+上使用此hack,但无法理解为什么在扩展搜索小部件时up / home指示器会恢复为默认状态。查看视图层次结构,结果发现操作栏的向上/主页指示器+图标部分具有2种实现方式,当然,第一种方式是未扩展搜索小部件时的方式。因此,这是我用来解决此问题并在两种情况下都更改up / home指示器的代码。
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);
}
}
}
}
});
如果有人使用库support-v7 appcompat,则可以直接调用此方法:
在其他情况下,您可以使用此解决方案:
如果您将DrawerLayout
this.getSupportActionBar().setDisplayUseLogoEnabled(true);
this.getSupportActionBar().setLogo(R.drawable.about_selected);
此外,您还可以在属性android:logo of和标签的清单中定义徽标,并在操作栏中设置要使用徽标而不是应用程序图标的主题。
API 18具有新方法ActionBar.setHomeAsUpIndicator()
-很遗憾,目前支持库不支持这些方法
您需要做的就是使用以下代码行:
通过检查Resources.getSystem()
的解决方案并非在所有设备上都有效,更改homeAsUpIndicator
的更好解决方案是将其设置为@null样式并以编程方式更改徽标资源。
您可以以更简单的方式实现这一目标。尝试在您的theme.xml和styles.xml中更改actionBarStyle的homeAsUpIndicator属性。
您可以尝试以下方法:
使用getActionBar().setCustomView(int yourView);
,因为ActionBar还没有方法更改homeUp图标!