OnCreateOptionsmenu在viewpager中使用tablayout调用一次

问题描述 投票:0回答:1

我有一个罕见的问题。我有一个动态填充标签的活动(最多20个标签)。每个片段都有一个OnCreateOptionsMenu的实现和一个菜单,其中包含一个书签图标,按下时会改变颜色。有一个menu类型的类变量Menu,它是在调用fragment的OnCreateOptionsMenu时设置的。这是为了让我能够在onCreateOptionsMenu之外设置书签菜单项(这也是动态完成的)。

问题:当父活动只有一个选项卡(一个片段实例)时,此实现工作正常。但是,如果有多个选项卡,应用程序会崩溃并显示错误:Attempt to invoke interface method android.view.MenuItem android.view.Menu.findItem(int)

我的想法:我认为问题是OnCreateOptionsMenu被调用一次,即类变量:menu只为第一个标签(片段)设置一次,因此当添加其他标签时,menunull

一些代码:片段

Menu menu;
...
...
@Override
    public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
 setMenuBookmark(ques_obj);
}

private void setMenuBookmark(QuestionAnswerList ques_obj){
        MenuItem menuBookmark = this.menu.findItem(R.id.action_bookmark);

        if (ques_obj.getIs_bookmarked().equals("1")) {
            menuBookmark.setIcon(R.drawable.ic_bookmark_white_24dp);
        } else {
            menuBookmark.setIcon(R.drawable.ic_bookmark_border_white_24dp);
        }
    }

...
...

@Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        inflater.inflate(R.menu.cbt_fragment_menu, menu);
        this.menu = menu;

        super.onCreateOptionsMenu(menu, inflater);
    }

P.SsetHasOptionsMenu()在Fragment的OnCreate中设置为true

android-fragments android-viewpager android-tablayout android-optionsmenu oncreateoptionsmenu
1个回答
0
投票

试试这种方式

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


         new Handler().postDelayed(new Runnable() {

            @Override
            public void run() {
                getActivity().invalidateOptionsMenu()
            }
         }, 500 );

    }



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

         MenuItem menuBookmark = menu.findItem(R.id.action_bookmark)

         if (ques_obj.getIs_bookmarked().equals("1")) {
            menuBookmark.setIcon(R.drawable.ic_bookmark_white_24dp);
         } else {
            menuBookmark.setIcon(R.drawable.ic_bookmark_border_white_24dp);
         }

         return true;
    }
© www.soinside.com 2019 - 2024. All rights reserved.