【问题标题】:OnCreateOptionsmenu called once in viewpager with tablayoutOnCreateOptionsmenu 在 vi​​ewpager 中使用 tablayout 调用一次
【发布时间】:2019-02-27 21:03:04
【问题描述】:

我遇到了一个罕见的问题。我有一个动态填充选项卡的活动(最多 20 个选项卡)。每个片段都有一个OnCreateOptionsMenu 的实现和一个菜单,其中包含一个书签图标,按下时会改变颜色。有一个类变量menu 类型为Menu,它是在调用片段的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.S setHasOptionsMenu() 在 Fragment 的 OnCreate 中设置为 true

【问题讨论】:

    标签: android android-fragments android-viewpager android-optionsmenu oncreateoptionsmenu


    【解决方案1】:

    试试这个方法

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

    【讨论】:

    • invalidateOptionsMenu() 来自哪里? Android studio 无法解决
    • 试过了,但在 ques_obj 上得到了空异常
    猜你喜欢
    • 2016-02-11
    • 2012-05-15
    • 2020-10-05
    • 2021-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多