在片段中检测操作栏返回按钮的点击

4
我有一个带有启用操作栏返回按钮的片段。
代码:
@Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        setHasOptionsMenu(true);
        actionBar = ((MainActivity)getActivity()).getSupportActionBar();
        actionBar.setDisplayHomeAsUpEnabled(true);

        actionBar.setCustomView(R.layout.custom_action_bar);
        actionBar.setDisplayShowTitleEnabled(false);
        actionBar.setDisplayShowCustomEnabled(true);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        mInflater = (LayoutInflater) getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View view = mInflater.inflate(R.layout.fragment_layout, container, false);

        return view;
    }

在上面的代码中,actionBar.setDisplayHomeAsUpEnabled(true);可以在操作栏中启用返回按钮,但是我们如何检测它的点击事件呢?
我查看了许多示例并尝试了以下方法,但仍然无法正常工作:
在Fragment中:
@Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
        case android.R.id.home:
            Toast.makeText(getActivity(), "Back", Toast.LENGTH_LONG).show();
            break;
        default:
            break;
        }
        return super.onOptionsItemSelected(item);
    }

还有在片段中显示的返回按钮是黑色的,我需要将其更改为白色或自定义颜色,我该怎么做?

onOptionSelectde(MenuItem item)是菜单项的事件,而且使用actionBar.setDisplayHomeAsUpEnabled(true),它自动提供返回功能...不需要通过点击事件来实现。 - Vidhi
@VidhiTrivedi 当我点击它时,什么也不会发生,那么我的下一步是检查我做错了什么? - user2056563
我也遇到了同样的问题,有人找到解决方法了吗?无法检测到android.R.id.home事件。 - Swapnil
5个回答

8
迟做总比不做好,请尝试这个>
 @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        mInflater = (LayoutInflater) getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View view = mInflater.inflate(R.layout.fragment_layout, container, false);
        //set setHasOptionsMenu on true here on CreateView method
        setHasOptionsMenu(true);
        return view;
    }

并实现

@Override
public boolean onOptionsItemSelected(MenuItem item){
            if (item.getItemId() == android.R.id.home) {
                if (getActivity() != null) {
                    getActivity().onBackPressed();
                }
                return true;
            };
            return super.onOptionsItemSelected(item);
 }

1
这个不起作用。Fragment的onOptionsItemSelected从未被调用。它直接调用了Activity的方法。 - kdas
你只能在 Fragment 中使用 onOptionsItemSelected,而不能同时在 Activity 和 Fragment 中使用。它符合我的要求。对我来说这是一个不错的方法。 - Yurets

4
我曾经遇到过同样的问题,但是当我将这段代码放在活动中时,返回按钮就可以从片段内部工作:
@Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
        case android.R.id.home:
            Toast.makeText(getActivity(), "Back", Toast.LENGTH_LONG).show();
            break;
        default:
            break;
        }
        return super.onOptionsItemSelected(item);
    }

0

如果有人遇到这个问题,可以按照以下步骤进行操作:

将MenuProvider实现到你的Fragment类中,并使用MenuHost在Fragment内初始化菜单,然后使用重写的方法。

class NumbersFragment : Fragment(), MenuProvider{

    private val args: NumbersFragmentArgs by navArgs()

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        val view = inflater.inflate(R.layout.fragment_numbers, container, false)

        val menuHost: MenuHost = requireActivity()
        menuHost.addMenuProvider(this, viewLifecycleOwner, Lifecycle.State.RESUMED)

        val numberListView = view.findViewById<RecyclerView>(R.id.numbersListView)
        val adapter = NumbersAdapter()
        adapter.setNumberList(args.numberArguments)
        numberListView.adapter = adapter

        return view
    }

    override fun onCreateMenu(menu: Menu, menuInflater: MenuInflater) {
        //Nothing
    }

    override fun onMenuItemSelected(menuItem: MenuItem): Boolean {
        this.findNavController().popBackStack()
        return false
    }
}

你可以使用 requireActivity().onBackPressed() 代替 this.findNavController().popBackStack() - sfmirtalebi

0

试试这个

@Override
public boolean onOptionsItemSelected(MenuItem item) {
   finish(); //to finish current activity
    return super.onOptionsItemSelected(item);
}

2
你的回答可以通过提供更多支持信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的答案是正确的。您可以在帮助中心中找到有关如何编写良好答案的更多信息。 - Community
请详细说明此代码如何回答这个问题。 - Aegir
目前你的回答不够清晰,请编辑并添加更多细节,以帮助其他人理解它如何回答问题。你可以在帮助中心找到有关如何编写好答案的更多信息。 - Community

-3
View cView = getLayoutInflater().inflate(R.layout.header, null);
cView.findViewById(R.id.btn_id).setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
                     // Do stuff here.
    }
});
actionBar.setCustomView(cView);

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