ActionBar – 定制视图与中央ImageView,侧面的行动项目

我有一个要求在“主页”活动的操作栏中居中自定义徽标(使用ImageView)。 我为这个项目使用ABS。 这和 SO上发布的另一个问题非常相似( ActionBar徽标居中,Action两侧 ),但是我不确定ImageView或search菜单是否有所作为,因为我没有得到我期待的结果为(一个中心的图像),或者如果我刚刚弄错了。 基本上,我在左侧设置了一个图标,在中间插入自定义视图,并在右侧有一个search图标(OptionsMenu)。 图像确实出现在图标的右侧,但仍然居中。 任何关于如何在操作栏中的ImageView的指针将不胜感激。

Home.java:

public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_home); LayoutInflater inflater = (LayoutInflater) getSupportActionBar().getThemedContext() .getSystemService(LAYOUT_INFLATER_SERVICE); final View customActionBarView = inflater.inflate( R.layout.actionbar_custom_view_home, null); /* Show the custom action bar view and hide the normal Home icon and title */ final ActionBar actionBar = getSupportActionBar(); actionBar.setHomeButtonEnabled(true); actionBar.setDisplayHomeAsUpEnabled(false); actionBar.setDisplayShowTitleEnabled(false); actionBar.setIcon(R.drawable.ic_ab_som); actionBar.setCustomView(customActionBarView); actionBar.setDisplayShowCustomEnabled(true); } @Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = new MenuInflater(this); inflater.inflate(R.menu.search, menu); return true; } 

RES /布局/ actionbar_custom_view_home.xml:

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:layout_gravity="center"> <ImageView android:id="@+id/actionBarLogo" android:contentDescription="@string/application_name" android:layout_width="wrap_content" android:layout_height="wrap_content" android:clickable="false" android:duplicateParentState="false" android:focusable="false" android:longClickable="false" android:padding="@dimen/padding_small" android:src="@drawable/logo_horizontal" /> </LinearLayout> 

RES /菜单/ search.xml:

 <?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@id/search_item" android:icon="?attr/action_search" android:title="@string/search_label" android:showAsAction="ifRoom|collapseActionView"> </item> </menu> 

解释:

在这里输入图像描述

粉红色的容器,是您添加视图的真实空间。

诀窍是做一些math,以视图(无论)为中心。

在我的情况下,视图是一个TextView。 这是我的完整方法:

 public void addTextToActionBar( String textToSet ) { mActionbar.setDisplayShowCustomEnabled( true ); // Inflate the custom view LayoutInflater inflater = LayoutInflater.from( this ); View header = inflater.inflate( R.layout.actionbar_header, null ); //Here do whatever you need to do with the view (set text if it's a textview or whatever) TextView tv = (TextView) header.findViewById( R.id.program_title ); tv.setText( textToSet ); // Magic happens to center it. int actionBarWidth = DeviceHelper.getDeviceWidth( this ); //Google for this method. Kinda easy. tv.measure( 0, 0 ); int tvSize = tv.getMeasuredWidth(); try { int leftSpace = 0; View homeButton = findViewById( android.R.id.home ); final ViewGroup holder = (ViewGroup) homeButton.getParent(); View firstChild = holder.getChildAt( 0 ); View secondChild = holder.getChildAt( 1 ); leftSpace = firstChild.getWidth()+secondChild.getWidth(); } catch ( Exception ignored ) {} mActionbar.setCustomView( header ); if ( null != header ) { ActionBar.LayoutParams params = (ActionBar.LayoutParams) header.getLayoutParams(); if ( null != params ) { int leftMargin = ( actionBarWidth / 2 - ( leftSpace ) ) - ( tvSize / 2 ) ; params.leftMargin = 0 >= leftMargin ? 0 : leftMargin; } } } 

布局:

 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center_horizontal|center_vertical|center" android:orientation="horizontal" > <TextView android:id="@+id/program_title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textColor="@android:color/white" android:contentDescription="@string/content_description_program_title" android:ellipsize="end" android:maxLines="1" android:textSize="22sp"/> </RelativeLayout> 

请享用。

如果你想在ActionBar中心的imageview,然后使用:

在这里输入图像描述

只需要replacegetActionBar(); getSupportActionBar(); 在下面的代码

 public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); final ActionBar actionBar = getActionBar(); actionBar.setCustomView(R.layout.actionbar_custom_view_home); actionBar.setDisplayShowTitleEnabled(false); actionBar.setDisplayShowCustomEnabled(true); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.activity_main, menu); return true; } 

你的actionbar_custom_view_home.xml

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="wrap_content" android:gravity="center" android:orientation="horizontal" > <ImageView android:id="@+id/actionBarLogo" android:layout_width="wrap_content" android:layout_height="wrap_content" android:clickable="false" android:focusable="false" android:longClickable="false" android:src="@drawable/ic_launcher" /> </LinearLayout> 

隐藏操作栏图标

在这里输入图像描述

 final ActionBar actionBar = getActionBar(); actionBar.setCustomView(R.layout.actionbar_custom_view_home); actionBar.setDisplayShowTitleEnabled(false); actionBar.setDisplayShowCustomEnabled(true); actionBar.setDisplayUseLogoEnabled(false); actionBar.setDisplayShowHomeEnabled(false); 

注意:对于<11 API使用getSupportActionBar()和> 11 API使用getActionBar()


编辑:02/03/16 工具栏

 <android.support.v7.widget.Toolbar style="@style/ToolBarStyle" xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="?attr/colorPrimary" android:minHeight="@dimen/abc_action_bar_default_height_material"> <ImageView android:layout_width="wrap_content" android:contentDescription="@string/logo" android:layout_height="wrap_content" android:layout_gravity="center" android:src="@drawable/ic_launcher"/> </android.support.v7.widget.Toolbar> 

我遇到过这个问题,这里是我的解决scheme:

  ActionBar.LayoutParams layoutParams = new ActionBar.LayoutParams(ActionBar.LayoutParams.MATCH_PARENT, ActionBar.LayoutParams.MATCH_PARENT); layoutParams.gravity = Gravity.CENTER_HORIZONTAL|Gravity.CENTER_HORIZONTAL; actionBar.setCustomView(yourCustomView,layoutParams); 

代码中的ImageView相对于LinearLayout居中,而不是Action Bar。 您可以将左边距(android:layout_marginLeft)添加到布局以调整图像位置。

其他的方法是不要将图标和操作项添加到操作栏中,而是使用内部具有图标和button的自定义布局。 但在这种情况下,您将需要自己处理行动项目。

派对晚了,但万一它帮助其他人 – 使用图层列表并将其设置为背景。 否则,徽标将以剩余空间为中心,而不是Reinherd提到的整个工具栏。

您可以使用具有静态背景颜色的图层列表,并将重心设置为中心的图像如下所示。 希望它有帮助!

toolbar.axml

 <android.support.v7.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" android:background="@drawable/toolbar_background" android:theme="@style/ThemeOverlay.AppCompat.Dark" app:popupTheme="@style/ThemeOverlay.AppCompat.Light" app:layout_scrollFlags="scroll|enterAlways" app:layout_collapseMode="pin"> </android.support.v7.widget.Toolbar> 

toolbar_background.xml

 <layer-list xmlns:android="http://schemas.android.com/apk/res/android"> <item> <shape android:shape="rectangle"> <solid android:color="@color/colorPrimary" /> </shape> </item> <item> <bitmap android:src="@drawable/logo" android:gravity="center" /> </item> </layer-list> 

我面临同样的问题,我build议以下解决scheme:

  1. 在你的res / layout / actionbar_custom_view_home.xml中改变布局宽度wrap_content:

     android:layout_width="wrap_content" 
  2. 获取这样的操作栏的宽度:

     Display display = getWindowManager().getDefaultDisplay(); Point size = new Point(); display.getSize(size); //width of action bar is the same as width of whole screen final int actionBarWidth = size.x; 
  3. 将layoutListener添加到您的customActionBarView中:

     customActionBarView.addOnLayoutChangeListener( new OnLayoutChangeListener() { @Override public void onGlobalLayout() { float x = customActionBarView.getX(); int logoImageWidth = imageLogo.getWidth(); int logoPosition = actionBarWidth / 2 - logoImageWidth / 2; if (x != logoPosition) { customActionBarView.setX(logoPosition); customActionBarView.requestLayout(); } else { customActionBarView.removeOnLayoutChangeListener(this); } } } ); 

我发现工作的唯一的东西是放(正确或左或根据需要,或两者):

 android:layout_marginLeft|Right="?attr/actionBarSize" 

我发现在这里: http : //sourcey.com/android-custom-centered-actionbar-with-material-design/