29

我正在使用我正在使用的 android 应用程序,ActionBar所以有一个导航抽屉图标可以打开它,标题为ActionBarin ActionBar。我想在标题上设置一个点击监听器ActionBar,以便它启动一个新的Activity并在导航抽屉图标上设置不同的点击监听器以打开导航抽屉菜单。

我点击了导航抽屉图标,但是当我点击标题标题时,ActionBar它也打开了导航抽屉菜单。有没有办法在ActionBar.

提前致谢。

4

10 回答 10

24

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

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

@Override
public void onClick(View v) {
    //Do something
    }
});
于 2014-07-19T08:33:32.120 回答
19

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

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

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>
于 2014-07-19T08:35:42.607 回答
10

我认为Simas 的答案是最好的,但如果您愿意,这里有一个 hacky 版本。

ViewTools.findActionBarTitle(getWindow().getDecorView()).setOnClickListener(...);

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

  • 股票安卓ActionBar
  • Theme.AppCompat支持ActionBar
  • v21-stylesetActionBar
    使用<Toolbar android:id="@+id/action_bar"
    或传入 inflated Toolbarasroot
  • v21-stylesetSupportActionBar
    使用<android.support.v7.widget.Toolbar android:id="@id/action_bar"
    或传入 inflated Toolbarasroot
  • 自定义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;
}
于 2015-04-23T12:08:30.843 回答
8

如果您使用支持 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

            }
        });
于 2015-03-09T03:04:13.457 回答
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>

然后您可以使用以下代码在 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
        }
    });
于 2015-05-06T12:54:50.180 回答
4

如果要使用当前存在的 ActionBar 而不是 Toolbar,请使用以下命令:

ActionBar actBar = getSupportActionBar();
if(actBar != null) {
    actBar.setTitle(R.string.your_ab_title);
 }

//Set actions to take when the AB is clicked
Toolbar ab = findViewById(R.id.action_bar);
if(ab != null){
    for (int i= 0; i < ab.getChildCount(); i++){

        View child = ab.getChildAt(i);

        if(child instanceof TextView || child instanceof ImageView) {
            child.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    String url = "http://www.HoverDroids.com";

                    Intent i = new Intent(Intent.ACTION_VIEW);
                    i.setData(Uri.parse(url));
                    startActivity(i);
                }
            });
        }
     }
}    
于 2018-10-21T06:44:37.647 回答
1

如果您知道标题中的实际文本,并且您有理由确定TextView屏幕上没有其他人共享该标题,则可以使用递归视图树搜索来查找它。

这是一个很好的解决方案,因为它不需要反映如何构建 Toolbar 的内部知识,并且可以让您直接访问TextView.

@Nullable
public static TextView findTextViewWithText(@Nullable View toCheck, String toFind) {

    if (toCheck instanceof TextView) {
        String foundText = ((TextView) toCheck).getText().toString();
        if (foundText.equals(toFind)) {
            return (TextView) toCheck;
        }

    } else if (toCheck instanceof ViewGroup) {
        for (int i = 0; i < ((ViewGroup) toCheck).getChildCount(); i++) {
            TextView found = findTextViewWithText(((ViewGroup) toCheck).getChildAt(i), toFind);
            if (found != null) {
                return found;
            }
        }
    }
    return null;
}

最可靠的视图是装饰视图,但请随意尝试最适合您的目的,您的里程可能会有所不同。

View found = findTextViewWithText(
    getActivity().getWindow().getDecorView(), "My Title");
if (found != null) {
  // Do something, like set a click listener
}
于 2016-09-16T17:41:23.900 回答
1

我知道为时已晚,但是对于那些SupportActionBar像这样使用但仍然没有找到干净解决方案的人:

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

对于没有徽标和自定义视图的默认配置,第一项(索引 0)将是 Home/Back ImageView,第二项将是我们的 Title TextView,第三项将是 OptionMenu Imageview。

在索引 1 处获取子项将返回标题。向孩子添加一个OnClickListener将使它像一个 chram 一样工作:

    Toolbar toolbar = findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);
    toolbar.getChildAt(1).setOnClickListener(v -> {
       // title is clicked, call ur function here
       
       // can also verify that the view is title itself by converting it to textview
       try {
            String title  = ((TextView)v).getText().toString();
            // title will be your activity title 
        } catch (Exception e) {
            e.printStackTrace();
            // if you got an exception, the view is not title. 
            // Check changing the index, in case you have custom views in the toolbar.
        }
    });
于 2021-05-12T05:38:04.737 回答
0

我知道在这里发表评论已经很晚了,但是当我搜索如何为操作栏标题添加 OnClick 时遇到了这个问题。以下是我发现并为我工作的内容,希望它对像我这样的人有所帮助。

我为我的应用程序中的一个片段编写了它。

        ActionBar actionBar = ((AppCompatActivity) getActivity()).getSupportActionBar();
        actionBar.setTitle(""); 
        ((AppCompatActivity) getActivity()).setSupportActionBar((Toolbar) getActivity().findViewById(R.id.toolbar));
        TextView toolbarTitle = (TextView) getActivity().findViewById(R.id.toolbarTitle);
        toolbarTitle.setText("New title");
        toolbarTitle.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
              // Action bar title clicked
            }
        });
        actionBar.show();
于 2020-09-20T19:29:51.380 回答
0

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

    <android.support.v7.widget.Toolbar
    android:id="@+id/MainActivityToolbar"
    android:layout_width="match_parent"
    android:layout_height="?attr/actionBarSize"
    android:background="@color/colorPrimary"
    app:layout_scrollFlags="scroll|enterAlways"
    app:popupTheme="@style/ThemeOverlay.AppCompat.Light" >
    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent" >
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:text="@string/app_name"
            android:textSize="30sp"
            tools:ignore="RelativeOverlap"

            android:layout_marginTop="10dp"
            android:layout_marginBottom="10dp"
            android:layout_marginRight="10dp"
            android:layout_marginLeft="10dp"
            />
        <Button
            android:id="@+id/LogOutButton"
            android:layout_width="100dp"
            android:layout_height="wrap_content"
            android:layout_alignParentEnd="true"
            android:layout_alignParentRight="true"

            android:layout_marginTop="10dp"
            android:layout_marginBottom="10dp"
            android:layout_marginRight="10dp"
            android:layout_marginLeft="10dp"

            android:text="@string/logout" />
    </RelativeLayout>

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

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

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

logOutButton =  findViewById(R.id.LogOutButton);
logOutButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
   //define your function for logout or something else 
   LogOut();
 }
});
于 2018-04-19T06:48:09.770 回答