在Android中的操作栏标题上设置OnClick侦听器

N S*_*rma 24 android android-appcompat android-actionbar android-actionbar-compat android-actionbaractivity

我在Android应用程序的工作,我现在用ActionBar这样一个有导航是抽屉图标来打开它和标题ActionBarActionBar.我想在标题上设置一个点击监听器ActionBar,使其Activity在导航抽屉图标上启动一个新的并设置不同的点击监听器,以打开导航抽屉菜单.

我点击了导航抽屉图标但是当我点击标题ActionBar标题时它也会打开导航抽屉菜单.有没有办法在标题上设置不同的点击监听器ActionBar.

提前致谢.

Jak*_*eso 23

尝试在onCreate()函数下添加此代码.这将获取操作栏标题所在的资源,并为其分配一个可用于添加OnClickListener的ID.让我知道事情的后续!

final int abTitleId = getResources().getIdentifier("action_bar_title", "id", "android");
findViewById(abTitleId).setOnClickListener(new View.OnClickListener() {

@Override
public void onClick(View v) {
    //Do something
    }
});
Run Code Online (Sandbox Code Playgroud)

  • Android 4.0+的错误 (5认同)

Sim*_*mas 17

您可以为标题使用自定义布局并为其指定一个侦听器:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    ActionBar actionBar = getActionBar();
    if (actionBar != null) {
        // Disable the default and enable the custom
        actionBar.setDisplayShowTitleEnabled(false);
        actionBar.setDisplayShowCustomEnabled(true);
        View customView = getLayoutInflater().inflate(R.layout.actionbar_title, null);
        // Get the textview of the title
        TextView customTitle = (TextView) customView.findViewById(R.id.actionbarTitle);


        // Change the font family (optional)
        customTitle.setTypeface(Typeface.MONOSPACE);
        // Set the on click listener for the title
        customTitle.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Log.w("MainActivity", "ActionBar's title clicked.");
            }
        });
        // Apply the custom view
        actionBar.setCustomView(customView);
    }
}
Run Code Online (Sandbox Code Playgroud)

actionbar_title.xml:

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center">

    <TextView
        android:id="@+id/actionbarTitle"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="25sp"
        android:text="@string/app_name"/>

</LinearLayout>
Run Code Online (Sandbox Code Playgroud)

  • 可悲的是,这种方式你失去了`getActionBar().setTitle()`的能力,你也需要自己实现字幕handilng,否则这是正确的解决方案.如果有人发布了一个`ActionBarTitles`的要点作为支持标题/副标题和阅读主题的插入式替换自定义视图,那将是很好的. (2认同)

TWi*_*Rob 10

我认为Simas的答案是最好的,但是如果你喜欢的话,这里有一个hacky版本.

ViewTools.findActionBarTitle(getWindow().getDecorView()).setOnClickListener(...);
Run Code Online (Sandbox Code Playgroud)

这个应该是通用的,因为它适用于:

  • 股票Android ActionBar
  • Theme.AppCompat 支持 ActionBar
  • v21风格setActionBar
    使用<Toolbar android:id="@+id/action_bar"
    或传递膨胀Toolbarroot
  • v21风格setSupportActionBar
    使用<android.support.v7.widget.Toolbar android:id="@id/action_bar"
    或传递膨胀Toolbarroot
  • 自定义Toolbar实现可能需要稍微调整,
    但是您可以将其封装在该自定义类中.

虽然我只测试了支持:v22.

/** @param root usually Activity.getWindow().getDecorView() or your custom Toolbar */
public static @Nullable View findActionBarTitle(@NonNull View root) {
    return findActionBarItem(root, "action_bar_title", "mTitleTextView");
}
/** @param root usually Activity.getWindow().getDecorView() or your custom Toolbar */
public static @Nullable View findActionBarSubTitle(@NonNull View root) {
    return findActionBarItem(root, "action_bar_subtitle", "mSubtitleTextView");
}

private static @Nullable View findActionBarItem(@NonNull View root,
        @NonNull String resourceName, @NonNull String toolbarFieldName) {
    View result = findViewSupportOrAndroid(root, resourceName);

    if (result == null) {
        View actionBar = findViewSupportOrAndroid(root, "action_bar");
        if (actionBar != null) {
            result = reflectiveRead(actionBar, toolbarFieldName);
        }
    }
    if (result == null && root.getClass().getName().endsWith("widget.Toolbar")) {
        result = reflectiveRead(root, toolbarFieldName);
    }
    return result;
}

@SuppressWarnings("ConstantConditions")
private static @Nullable View findViewSupportOrAndroid(@NonNull View root, @NonNull String resourceName) {
    Context context = root.getContext();
    View result = null;
    if (result == null) {
        int supportID = context.getResources().getIdentifier(resourceName, "id", context.getPackageName());
        result = root.findViewById(supportID);
    }
    if (result == null) {
        int androidID = context.getResources().getIdentifier(resourceName, "id", "android");
        result = root.findViewById(androidID);
    }
    return result;
}

@SuppressWarnings("unchecked")
public static <T> @Nullable T reflectiveRead(@NonNull Object object, @NonNull String fieldName) {
    try {
        Field field = object.getClass().getDeclaredField(fieldName);
        field.setAccessible(true);
        return (T)field.get(object);
    } catch (Exception ex) {
        Log.w("HACK", "Cannot read " + fieldName + " in " + object, ex);
    }
    return null;
}
Run Code Online (Sandbox Code Playgroud)


小智 7

如果您使用的工具栏支持v7:21.查看以下代码:

Field titleField = Toolbar.class.getDeclaredField("mTitleTextView");
        titleField.setAccessible(true);
        TextView barTitleView = (TextView) titleField.get(mToolbar);
        barTitleView.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub

            }
        });
Run Code Online (Sandbox Code Playgroud)


jim*_*251 7

您可以使用工具栏轻松完成此操作.在布局xml文件中定义工具栏,如下所示:

 <android.support.v7.widget.Toolbar
    android:id="@+id/toolbar"
    android:layout_width="match_parent"
    android:layout_height="?actionBarSize"
    android:background="?colorPrimary"
    app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
    app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">

    <TextView
        android:id="@+id/toolbarTitle"
        style="@style/TextAppearance.Widget.AppCompat.Toolbar.Title"
        android:background="?attr/selectableItemBackground"
        android:layout_width="wrap_content"
        android:gravity="center_vertical"
        android:layout_height="match_parent" />
</android.support.v7.widget.Toolbar>
Run Code Online (Sandbox Code Playgroud)

然后,您可以使用以下代码在Activity中设置侦听器:

setSupportActionBar((Toolbar) findViewById(R.id.toolbar));

TextView toolbarTitle= (TextView) findViewById(R.id.toolbarTitle);
toolbarTitle.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            // DO SOMETHING HERE
        }
    });
Run Code Online (Sandbox Code Playgroud)