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:
-
在你的res / layout / actionbar_custom_view_home.xml中改变布局宽度wrap_content:
android:layout_width="wrap_content"
-
获取这样的操作栏的宽度:
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;
-
将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/
- 如何获取ActionBar图标上的文本?
- 如何在ActionBar内显示动作图标和标题?
- ActionBarSherlock getMenuInflater问题
- ActionBarSherlock – typesandroid.support.v4.app.Fragment无法parsing。 它是从所需的.class文件间接引用的
- 微调:当select的项目保持不变时,onItemSelected不会被调用
- 在ViewPager中使用选项卡时,出现错误“Java.lang.IllegalStateException活动已被破坏”
- 删除操作栏下方的阴影
- ActionBarSherlock和ActionBar兼容性的区别
- 隐藏/显示操作栏选项菜单项为不同的片段