如何从片段中捕获工具栏上导航图标的点击事件?

62

我有一个对话框片段,在其中使用布局中的工具栏。我想让工具栏中的返回按钮(导航图标)在单击时起作用并退出片段。但我无法在(对话框)片段中捕获工具栏导航图标的点击事件。

以下是我获取工具栏的方式:

toolbar = (Toolbar) rootView.findViewById(R.id.toolbar);
toolbar.setNavigationIcon(R.drawable.abc_ic_ab_back_mtrl_am_alpha);
toolbar.setTitle(itemType);
((AppCompatActivity)getActivity()).setSupportActionBar(toolbar);

这是我的对话框片段的布局文件:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout          xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/panel_cyan"
    android:id="@+id/rootLayout"
    >

<android.support.v7.widget.Toolbar
    android:id="@+id/toolbar"
    android:layout_width="match_parent"
    android:layout_height="?attr/actionBarSize"
    android:layout_alignParentLeft="true"
    android:layout_alignParentStart="true"
    android:layout_alignParentTop="true"
    android:background="@color/color_primary"
    android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
    app:popupTheme="@style/ThemeOverlay.AppCompat.Light" />

<ListView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/listViewItems"
    />

</RelativeLayout>

这是我到目前为止尝试过但失败的方法:

在id R.id.home中点击选项项目

 @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        int id = item.getItemId();
        switch (id){
            case android.R.id.home:
                finish();
                break;
        }
        return super.onOptionsItemSelected(item);
    }

在工具栏上调用 setNavigationOnClick():

toolbar.setNavigationOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View view) {
                Toast.makeText(getActivity(), "Back clicked!",     Toast.LENGTH_SHORT).show();
            }
        });

1
你在你的Fragment中调用了 setHasOptionsMenu(true); 吗? - Pr38y
是的,在onCreate()中我确实设置了setHasOptionsMenu(true);。 - priyankvex
1
如果你设置了setHasOptionsMenu为true,并且在onCreateOptionsMenu中使用了super调用,那么onOptionsItemSelected将会被触发。请在onOptionsItemSelected中设置一个调试断点,并检查它是否被调用了? - Pr38y
1
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - priyankvex
你在活动的onOptionItemSelected中返回false了吗?如果事件没有被活动消耗,那么它才会触发片段事件。请查看https://dev59.com/GGUp5IYBdhLWcg3wzp5k - Pr38y
我在活动中没有使用选项菜单。但是我仍然尝试返回false。没有成功。我猜问题出在工具栏导航项无法接收点击事件。如何解决? - priyankvex
4个回答

116

setSupportActionBar(toolbar)之后添加代码块toolbar.setNavigationOnClickListener


@Trancer 对于主页按钮的方法,请在onOptionItemSelected中使用以下代码:switch(item.getItemId()) { case android.R.id.home : Toast.makeText(this, "主页被点击了...", Toast.LENGTH_SHORT).show(); break; } - Abhishek
@Abhishek,你的方法不起作用也不正确。我解决了这个问题:所有工具栏中的导航图标都由操作系统控制。 - Trancer
2
这适用于主页按钮,你首先需要设置它toolbar.setNavigationIcon(drawable),然后你可以使用监听器。 - Joseph
是的,当有toolbar.setNavigationIcon(drawable)时,这是有效的,我们也可以设置上面的监听器。 - Parth Patel
2
“after” 部分非常重要。先设置工具栏,然后添加监听器。 - Jcorretjer

28

这对我有效。

toolbar.setNavigationOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        Toast.makeText(getApplicationContext(),"your icon was clicked",Toast.LENGTH_SHORT).show();
    }
});

7
 toolbar.setOnMenuItemClickListener(new Toolbar.OnMenuItemClickListener() {
        @Override
        public boolean onMenuItemClick(MenuItem item) {
            switch (item.getItemId()) {
                case android.R.id.home:

                  // do what ever you want here
            }
            return true;
        }
    });

0
很可能也很重要:如果您使用数据绑定,例如
MyPojoBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
binding.setPojo(myPojo)

setSupportActionBar(toolbar)(接着是添加单击监听器、标题或其他工具栏属性)必须在绑定初始化之后进行。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接