片段的菜单项 onClickListener

Posted

技术标签:

【中文标题】片段的菜单项 onClickListener【英文标题】:Menu Item onClickListener for fragments 【发布时间】:2016-12-30 22:31:17 【问题描述】:

我有以下菜单:

<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
tools:context=".MainActivity">

<item
    android:id="@+id/action_settings"
    android:orderInCategory="100"
    app:showAsAction="never"
    android:title="Settings" />

<item android:id="@+id/menu_share"
    android:icon="@drawable/ic_heart_outline_white_24dp"
    app:showAsAction="always"
    android:title="Favorite" />
</menu>

如何为此设置 onClick 侦听器?请记住,我的课程扩展了 Fragment:

public class My_Profile extends Fragment implements ....

...我不知道这是否有什么不同,但我已经在这个 java 文件中扩展了一个布局。

@Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) 

myView = inflater.inflate(R.layout.testFragment, container, false);
...

更新 1

这是我在提出建议后尝试的,但似乎没有任何反应,有人可以告诉我我做错了什么:

    @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) 
        inflater.inflate(R.menu.menu_main, menu);
        super.onCreateOptionsMenu(menu, inflater);
    


 @Override
    public boolean onOptionsItemSelected(MenuItem item) 
        int id = item.getItemId();

        if (id == R.id.menu_share) 
            Log.d("ButtonClick", "button click worked");
        

        return super.onOptionsItemSelected(item);
    

在 onCreate 中添加了这个:

setHasOptionsMenu(true);

更新 2

不知道这是否有什么不同,我目前只是在处理一个示例,菜单也像这样膨胀。我不知道这是否会影响其他两种方法:

 mToolbar.inflateMenu(R.menu.menu_main);

更新 3

这是我现在尝试过的,但按钮单击仍然没有记录任何内容:

 public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container,
                             @Nullable  Bundle savedInstanceState) 

        setHasOptionsMenu(true);

        myView = inflater.inflate(R.layout.testFragment, container, false);

        ...

        return myView;
        

只是为了测试重定向到我的其他活动之一,但仍然没有任何反应:

 @Override
    public boolean onOptionsItemSelected(MenuItem item) 
        int id = item.getItemId();

        if (id == R.id.menu_share) 
            Intent myIntent = new Intent(getActivity(),LoginActivity.class);
            startActivity(myIntent);
        else
            Intent myIntent = new Intent(getActivity(),SignupActivity.class);
            startActivity(myIntent);
        

        return super.onOptionsItemSelected(item);
    


    @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) 
        super.onCreateOptionsMenu(menu, inflater);
        inflater.inflate(R.menu.menu_main, menu);
    

【问题讨论】:

谁能帮忙?到目前为止没有任何解决方案有效 【参考方案1】:

您的片段应该有这两种方法来处理菜单:onCreateOptionsMenuonOptionsItemSelected,后者带有 onClick 内容。

例如:

@Override
public boolean onOptionsItemSelected(MenuItem item) 
    int id = item.getItemId();

    if (id == R.id.action_settings) 
        //TODO
     else if (id == R.id.menu_share) 
        //TODO
    

    return super.onOptionsItemSelected(item);

编辑

不要忘记setHasOptionsMenu(true) 为您的片段(谢谢)

【讨论】:

你忘了说片段的onCreateonCreateView函数中需要调用setHasOptionsMenu(true); @lionscribe 我使用 Google 并找到了 setHasOptionsMenu 属性,但仍然没有做任何事情。 您还必须覆盖onCreateOptionsMenu 方法,并扩充菜单。然后您在onOptionsItemSelected 中处理菜单【参考方案2】:

嗯,我认为你有一个很好的代码。 您需要做的就是重新安排onCreateOptionsMenu(...)

例如:

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) 
    setHasOptionsMenu(true);
    return inflater.inflate(R.layout.testFragment, container, false);


@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) 
    super.onCreateOptionsMenu(menu, inflater);
    inflater.inflate(R.menu.menu_main, menu);

我希望这会有所帮助。

【讨论】:

我认为你不需要打电话给mToolbar.inflateMenu(R.menu.menu_main);,因为菜单已经膨胀了onCreateOptionsMenu(Menu menu, MenuInflater inflater)【参考方案3】:

@BadCodersHub 我已经尝试过您的方案,并且使用以下代码可以正常工作。

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) 
    setHasOptionsMenu(true);
    View myView = inflater.inflate(R.layout.fragment_main, container, false);
    return myView;


@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) 
    super.onCreateOptionsMenu(menu,inflater);
    inflater.inflate(R.menu.menu_main, menu);


@Override
public boolean onOptionsItemSelected(MenuItem item) 
    switch (item.getItemId())
        case R.id.action_settings:
            Log.d("","action Settings Clicked !!");
            break;
        case R.id.menu_share:
            Log.d("","action menu_share Clicked !!");
            break;
        default:
            return super.onOptionsItemSelected(item);
    

    return super.onOptionsItemSelected(item);

希望这会对你有所帮助。你需要重写 onCreateOptionMenu 和 onOptionItemSelected 方法

【讨论】:

我尝试了您的建议,但单击按钮时没有任何日志。我确实将菜单膨胀到 onCreate 中的工具栏,否则我看不到菜单 mToolbar.inflateMenu(R.menu.menu_main);这会有所作为吗

以上是关于片段的菜单项 onClickListener的主要内容,如果未能解决你的问题,请参考以下文章

选择导航菜单项时不会替换上一个片段

无法接收点击片段中的菜单项

片段的菜单项 onClickListener

Android - 导航抽屉 - 与动态菜单项重叠的片段

android:来自片段的菜单项单击事件

如何将片段目标绑定到底部导航栏中的菜单项?