14

背景

我希望在 PreferenceActivity 上显示一个 ActionBar,因为它不适用于预蜂窝设备(即使在支持库中)。

因为支持库中没有这样的类,所以我不能只调用 "setSupportActionBar" 。我也不希望使用库(比如这个),因为我发现的所有库仍然使用 Holo 样式,所以到目前为止它们没有得到更新,考虑到这一点。

为此,我试图将 ActionBar 标题的外观和感觉模仿到新的Toolbar类中,该类在支持库 v7 上提供。

问题

我已经成功地放置了一个标题和一个“向上”按钮,但我不知道如何让它们像普通操作栏一样可点击,包括触摸的效果。

编码

这是代码:

SettingsActivity.java

public class SettingsActivity extends PreferenceActivity
  {
  @Override
  protected void onCreate(final Bundle savedInstanceState)
    {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_settings);
    addPreferencesFromResource(R.xml.pref_general);
    final Toolbar toolbar=(Toolbar)findViewById(R.id.toolbar);
    toolbar.setBackgroundColor(getResources().getColor(R.color.windowBackgroundColor));
    toolbar.setTitle("Settings");
    toolbar.setClickable(true);
    toolbar.setLogo(getResIdFromAttribute(this,R.attr.homeAsUpIndicator));
    }

  public static int getResIdFromAttribute(final Activity activity,final int attr)
    {
    if(attr==0)
      return 0;
    final TypedValue typedvalueattr=new TypedValue();
    activity.getTheme().resolveAttribute(attr,typedvalueattr,true);
    return typedvalueattr.resourceId;
    }
  }

活动设置.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.antonioleiva.materialeverywhere.SettingsActivity" >

    <include
        android:id="@+id/toolbar"
        layout="@layout/toolbar" />

    <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent" >

        <View
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="@drawable/abs__ab_solid_shadow_holo" />

        <ListView
            android:id="@android:id/list"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />
    </FrameLayout>

</LinearLayout>

我试过的

我已经尝试了 Toolbar 类的所有点击侦听器类型,但没有任何帮助。

几乎唯一有效的是使用“setNavigationIcon”而不是“setLogo”,但这实际上使标题和图标变得可点击,但只有图标显示其被点击的效果(即使我点击标题)。

问题

如何添加工具栏的外观和感觉,使其标题和徽标看起来像操作栏?

4

4 回答 4

31

我遇到了同样的问题,并找到了一种非常方便的方法(对于可点击的标题),使用Toolbar. 没关系,无论是否Toolbar使用ActionBar,它都适用于两种情况。

只需在Toolbar自身上设置点击侦听器,这将导致完全Toolbar触发点击侦听器,如果不是菜单项或主页图标被点击。对我来说,这正是我所期望的......

例如:

 setSupportActionBar(toolbar);
 getSupportActionBar().setDisplayHomeAsUpEnabled(true);
 toolbar.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Toast.makeText(getThis(), "Toolbar title clicked", Toast.LENGTH_SHORT).show();
        }
    });

onOptionsItemSelected, home click 和类似的不会触发onClick事件。似乎是一个很好的解决方案

于 2015-11-04T09:39:10.053 回答
23

请记住,工具栏基本上只是一个 ViewGroup,因此您可以向其中添加一个 TextView 并监听类似的 onClick 事件。

在 XML 中将 TextView 添加到工具栏:

<android.support.v7.widget.Toolbar
    android:id="@+id/toolbar_top"
    android:layout_height="wrap_content"
    android:layout_width="match_parent"
    android:minHeight="?attr/actionBarSize"
    android:background="@color/action_bar_bkgnd"
    app:theme="@style/ToolBarTheme" >


    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Settings"
        android:id="@+id/toolbar_title" />

    </android.support.v7.widget.Toolbar>

监听 Activity 中的点击:

toolbarTop.findViewById(R.id.toolbar_title).setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Log.d(TAG,"Clicked");
        }
    });
于 2014-10-22T15:49:19.877 回答
2

实际上,您可以很容易地做到这一点,而无需采取任何变通办法。您只需要循环浏览 的所有子视图Toolbar,并找到一个TextView具有正确标题文本的视图。

String title = toolbar.getTitle();
for(int i = 0; i < toolbar.getChildCount(); i++){
    View tmpView = toolbar.getChildAt(i);
    if("android.support.v7.widget.AppCompatTextView".equals(tmpView.getClass().getName())){
        if(((AppCompatTextView) tmpView).getText().equals(title)){
            tmpView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    //do whatever you want here
                }
            });
        }
    }
}
于 2017-08-20T19:38:14.167 回答
1

设置非空工具栏标题后尝试设置标题点击监听器

    if (toolbarView != null) {
        int childCount = toolbarView.getChildCount();
        for (int i = 0; i < childCount; i++) {
            View view = toolbarView.getChildAt(i);
            if (view instanceof TextView) {
                view.setOnClickListener(listener);
                break;
            }
        }
    }

并在设置非空工具栏字幕以设置字幕点击侦听器后

    if (toolbarView != null) {
        int childCount = toolbarView.getChildCount();
        for (int i = childCount - 1; i >= 0; i--) {
            View view = toolbarView.getChildAt(i);
            if (view instanceof TextView) {
                view.setOnClickListener(listener);
                break;
            }
        }
    }
于 2021-04-15T08:23:06.400 回答