在Android 4.0+上移除操作栏左侧图标的填充
我想在标准的Android 4.0+操作栏左边的图标周围删除填充。 我正在设置图标:
getActionBar().setIcon(getResources().getDrawable(R.drawable.ic_action_myapp));
我希望图标垂直填充空间,触摸顶部和底部,类似于soundcloud应用程序所做的:
挖掘到AOSP资源,似乎涉及的代码是在com.android.internal.widget.ActionBarView.java
。 特别是相关部分是内部类ActionBarView$HomeView
的onLayout()
方法,部分在下面报告(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.home
的Imageview
。 上面报告的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:
- 使用
ActionBar.setDisplayHomeAsUpEnabled(true)
启用操作栏向上导航,以便在布局过程中考虑指示器视图 - 强制将
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方法:
-
使用ActionBarSherlock。 它使用它自己的drwables和资源,所以你可以修改箭头图标为emty png,这样你的图标就会向左移动。
-
上/下图标来自:
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); }