我需要在Actionbar中为“Home”活动设置一个自定义徽标(使用ImageView)。 我正在为这个项目使用ABS。 这非常类似于在SO上发布的另一个问题( ActionBar徽标居中和侧面的Action项目 ),但我不确定ImageView或搜索菜单是否有所作为,因为我没有得到我正在寻找的结果(中心图像),或者如果我错了。 基本上,我在左侧设置了一个Icon,在中心插入自定义视图,右侧有一个搜索图标(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>

===============>>#1 票数:66

如果你想在ActionBar中心使用imageview,那么使用:

在此输入图像描述

只需替换getActionBar(); to 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 for Toolbar

<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>

===============>>#2 票数:18 已采纳

解释:

在此输入图像描述

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

诀窍在于做一些数学运算,将View(无论如何)置于中间位置。

就我而言,View是一个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>

请享用。

===============>>#3 票数:6

我遇到了这个问题,这是我的解决方案:

  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); 

===============>>#4 票数:3

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

其他方法是不向操作栏添加图标和操作项,而是使用内部带有图标和按钮的自定义布局。 但在这种情况下,您需要自己处理操作项。

===============>>#5 票数:2

我遇到了同样的问题,我建议采用以下解决方案:

  1. 在res / layout / actionbar_custom_view_home.xml中,将layout的宽度更改为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); } } } ); 

===============>>#6 票数:2

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

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

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

===============>>#7 票数:2

晚到派对,但万一它可以帮助其他人 - 使用图层列表并将其设置为背景。 否则,徽标将基于剩余空间而不是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>

  ask by Doug Sparling translate from so

未解决问题?本站智能推荐:

1回复

操作栏中的自定义视图

我有一个动作栏。 操作栏中的一个项目用于通知。 我想在操作栏项的右上角添加一个小图标,表示用户当前有多少通知。 我继续为动作栏项目制作了自定义布局。 去添加它,令我惊讶的是,我无法在操作栏上添加自定义视图作为按钮。 我使用Actionbar-Sherlock来兼容旧设备。
6回复

如何在ActionBar中显示自定义视图?

我想在操作栏中显示自定义搜索(为此我正在使用ActionBarSherlock)。 收到: 但我想使自定义布局(edittext字段)占据整个可用宽度。 我已经按照这里的建议实现了自定义布局。 有我的自定义布局search.xml : 在MyActivity : 如何使自定义布局占
1回复

使用Sherlock操作栏的自定义ActionBar

我按照这种方式使用Sherlock Action Bar创建自定义ActionBar。 我的自定义布局文件 下载了sherlock库,并将其添加到我的项目中。 然后我的活动课 公共类MainActivity扩展了SherlockActivity { 我的新版式中
2回复

使控件适合自定义ActionBar视图

我的应用程序使用包含导航微调器和几个操作按钮的拆分ActionBar。 我想使用顶部的多余空间添加一个额外的微调器,这里用蓝色突出显示: 虽然它在纵向(在此特定设备上)正确显示,但横向显示问题: 自定义视图似乎楔入导航微调器和操作按钮之间。 是否有什么让动作按钮崩溃到溢出
2回复

使用自定义视图复制ActionBar选项卡

我想有一个带有自定义导航的ActionBar,其中自定义视图看起来像标准操作栏选项卡。 我知道这听起来像重新发明轮子,但这意味着我们可以将菜单按钮放在与标签相同的行上,如下所示。 这是一个设计要求,实际上为这个应用程序提供了比标准的android行为更多的UI意义。 我尝试过使用Act
1回复

如何在ActionBar中显示自定义视图?

我试图在操作栏中显示自定义视图。 我正在使用SherlockActionBar。 这是我的代码。 自定义视图永远不会显示。 我究竟做错了什么?
1回复

使用自定义视图作为操作栏图标

我正在尝试使用自定义视图作为向上按钮旁边的图标。 我在线搜索了一个解决方案,并阅读了一些有关使用图形缓存的信息,并尝试在我的代码中实现它,但未显示任何图标。 谢谢你的帮助 :)
3回复

Android ActionBar Action Items

我正在使用Actionbar Sherlock并且我有三个按钮 使用SearchView进行搜索 打开Dialog Fragment的类别 排序打开一个隐藏的下拉菜单 当我单击“搜索”按钮时,SearchView文本会展开。 当搜索视图已展开时,我想隐藏操作栏
2回复

具有溢出菜单的自定义操作栏布局

我使用带有自定义操作栏的actionbarsherklock库,如下所示: 我的自定义工具: 这是自定义布局: 问题是我想添加一个溢流菜单来分享像这样的按钮: 请告诉我如何使用自定义操作栏布局执行此操作。
2回复

如何在Android(ActionbarSherlock)中自定义ActionBar?

我在应用程序中使用了ActionBarSherlock来为预蜂窝设备提供ActionBar。 我想在其中使用Light.DarkActionBar主题,如何为ActionBar的某些部分自定义以下内容(参见图片) ActionBar的背景色 ActionBar选项卡栏的背景图