在Android 4.0+上移除操作栏左侧图标的填充

我想在标准的Android 4.0+操作栏左边的图标周围删除填充。 我正在设置图标:

getActionBar().setIcon(getResources().getDrawable(R.drawable.ic_action_myapp)); 

我希望图标垂直填充空间,触摸顶部和底部,类似于soundcloud应用程序所做的:

挖掘到AOSP资源,似乎涉及的代码是在com.android.internal.widget.ActionBarView.java 。 特别是相关部分是内部类ActionBarView$HomeViewonLayout()方法,部分在下面报告(1433-1478行):

  @Override protected void onLayout(boolean changed, int l, int t, int r, int b) { ... final LayoutParams iconLp = (LayoutParams) mIconView.getLayoutParams(); final int iconHeight = mIconView.getMeasuredHeight(); final int iconWidth = mIconView.getMeasuredWidth(); final int hCenter = (r - l) / 2; final int iconTop = Math.max(iconLp.topMargin, vCenter - iconHeight / 2); final int iconBottom = iconTop + iconHeight; final int iconLeft; final int iconRight; int marginStart = iconLp.getMarginStart(); final int delta = Math.max(marginStart, hCenter - iconWidth / 2); if (isLayoutRtl) { iconRight = width - upOffset - delta; iconLeft = iconRight - iconWidth; } else { iconLeft = upOffset + delta; iconRight = iconLeft + iconWidth; } mIconView.layout(iconLeft, iconTop, iconRight, iconBottom); } 

相同的小部件使用此布局,在res/layout/action_bar_home.xml定义:

 <view xmlns:android="http://schemas.android.com/apk/res/android" class="com.android.internal.widget.ActionBarView$HomeView" android:layout_width="wrap_content" android:layout_height="match_parent"> <ImageView android:id="@android:id/up" android:src="?android:attr/homeAsUpIndicator" android:layout_gravity="center_vertical|start" android:visibility="gone" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginEnd="-8dip" /> <ImageView android:id="@android:id/home" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginEnd="8dip" android:layout_marginTop="@android:dimen/action_bar_icon_vertical_padding" android:layout_marginBottom="@android:dimen/action_bar_icon_vertical_padding" android:layout_gravity="center" android:adjustViewBounds="true" android:scaleType="fitCenter" /> </view> 

根据消息来源,图标显示在ID = android.R.id.homeImageview 。 上面报告的onLayout()方法考虑了布局中定义的ImageView边距,由于它们使用值@android:dimen/action_bar_icon_vertical_padding ,所以无法通过主题/样式重写进行设置。

所有你可以做的就是在运行时去掉这些值,并根据你的需要设置它们:简单地检索ImageView并将其顶部和底部边距设置为0 。 像这样的东西:

 ImageView icon = (ImageView) findViewById(android.R.id.home); FrameLayout.LayoutParams iconLp = (FrameLayout.LayoutParams) icon.getLayoutParams(); iconLp.topMargin = iconLp.bottomMargin = 0; icon.setLayoutParams( iconLp ); 

编辑:我刚刚意识到我没有涵盖如何摆脱左填充。 以下解决scheme

操作栏上的左侧填充受操作栏图标的向上导航行为的影响。 当它被禁用时(通过ActionBar.setDisplayHomeAsUpEnabled(false) ),左/上指示符消失,但也使用左填充。 简单的解决scheme:

  1. 使用ActionBar.setDisplayHomeAsUpEnabled(true)启用操作栏向上导航,以便在布局过程中考虑指示器视图
  2. 强制将res/values-v14/styles.xml用作指示符的drawable设置为null

例如:

 <style name="AppBaseTheme" parent="android:Theme.Holo.Light.DarkActionBar"> <!-- API 14 theme customizations can go here. --> <item name="android:homeAsUpIndicator">@null</item> </style> 

我发现了另一个解决scheme(参考appcompat-v7),它改变了toolbarStyle,代码如下:

 <item name="toolbarStyle">@style/Widget.Toolbar</item> <style name="Widget.Toolbar" parent="@style/Widget.AppCompat.Toolbar"> <item name="contentInsetStart">0dp</item> </style> 

使用自定义布局的ActionBar

在这里输入图像描述

 public class TestActivity extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); final ActionBar actionBar = getActionBar(); actionBar.setCustomView(R.layout.actionbar_custom_view_home); actionBar.setDisplayShowTitleEnabled(false); actionBar.setDisplayShowCustomEnabled(true); actionBar.setDisplayUseLogoEnabled(false); actionBar.setDisplayShowHomeEnabled(false); setContentView(R.layout.main); } public void Click(View v) { if (v.getId() == R.id.imageIcon) { Log.e("click on--> ", "Action icon"); } } } 

actionbar_custom_view_home.xml

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/linearLayout1" android:layout_width="fill_parent" android:layout_height="fill_parent" android:gravity="center" > <ImageView android:id="@+id/imageIcon" android:onClick="Click" android:layout_width="wrap_content" android:layout_height="match_parent" android:src="@drawable/ic_launcher" /> <TextView android:id="@+id/textView1" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Large Icon With Title" android:textAppearance="?android:attr/textAppearanceLarge" /> </LinearLayout> 

增强的parrzhang回复删除左侧的Android 4.0+图标上的操作栏周围的填充

  private void adjustHomeButtonLayout(){ ImageView view = (ImageView)findViewById(android.R.id.home); if(view.getParent() instanceof ViewGroup){ ViewGroup viewGroup = (ViewGroup)view.getParent(); View upView = viewGroup.getChildAt(0); if(upView != null && upView.getLayoutParams() instanceof FrameLayout.LayoutParams){ FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams) upView.getLayoutParams(); layoutParams.width = 20;// **can give your own width** upView.setLayoutParams(layoutParams); } } } 

要设置ActionBar的高度,你可以创build一个像这样的新主题:

 <?xml version="1.0" encoding="utf-8"?> <resources> <style name="Theme.BarSize" parent="Theme.Sherlock.Light.DarkActionBar"> <item name="actionBarSize">48dip</item> <item name="android:actionBarSize">48dip</item> </style> </resources> 

并将此主题设置为您的活动:

机器人:主题= “@风格/ Theme.BarSize”

现在,将图标的高度设置为"match_parent"

这将删除顶部和底部的填充。

现在,左侧的箭头内置到框架中,因此您有两种select方法:

  1. 使用ActionBarSherlock。 它使用它自己的drwables和资源,所以你可以修改箭头图标为emty png,这样你的图标就会向左移动。

  2. 上/下图标来自:

 public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: NavUtils.navigateUpFromSameTask(this); return true; } } 

所以,不要使用这个选项作为向上button,而是可以创build另一个具有上一个活动意图的操作栏选项,然后将该图标放在操作栏上。

这将是一个更大的解决方法。

希望帮助.. 🙂

你可以在actionbarview中findhomeview定义如下:

 <view xmlns:android="http://schemas.android.com/apk/res/android" class="com.android.internal.widget.ActionBarView$HomeView" android:layout_width="wrap_content" android:layout_height="match_parent"> <ImageView android:id="@android:id/up" android:src="?android:attr/homeAsUpIndicator" android:layout_gravity="center_vertical|start" android:visibility="gone" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginEnd="-8dip" /> <ImageView android:id="@android:id/home" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginEnd="8dip" android:layout_marginTop="@android:dimen/action_bar_icon_vertical_padding" android:layout_marginBottom="@android:dimen/action_bar_icon_vertical_padding" android:layout_gravity="center" android:adjustViewBounds="true" android:scaleType="fitCenter" /> 

但是你不能通过findViewById(android.R.id.up)来查看。

所以你可以得到homeView并获得它的父视图,设置upview宽度为0

  ImageView view = (ImageView)findViewById(android.R.id.home); if(view.getParent() instanceof ViewGroup){ ViewGroup viewGroup = (ViewGroup)view.getParent(); View upView = viewGroup.getChildAt(0); FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams) upView.getLayoutParams(); layoutParams.width = 0; upView.setLayoutParams(layoutParams); }