Wrong fragment in ViewPager receives onContextItemSelected call

前端 未结 5 1965
佛祖请我去吃肉
佛祖请我去吃肉 2020-11-28 12:00

I have an app that shows a few fragments (of the same type) in a ViewPager and I\'m having some trouble with context menu items. (I\'m using the support library

5条回答
  •  鱼传尺愫
    2020-11-28 12:20

    It happens because of this:

    public boolean dispatchContextItemSelected(MenuItem item) {
        if (mActive != null) {
            for (int i=0; i

    As you can see, FragmentManager calls Fragment.onContextItemSelected for all of his own fragments until it returns true. In your example I can offer such fix:

        public static class TestListFragment extends ListFragment {
    
        private int mNumber = 0;
        private ArrayList mItems;
    
        public static TestListFragment newInstance(int number) {
            Bundle args = new Bundle();
            args.putInt("number", number + 1);
    
            TestListFragment fragment = new TestListFragment();
            fragment.setArguments(args);
    
            return fragment;
        }
    
        public TestListFragment() {}
    
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
    
            mNumber = getArguments().getInt("number");
            mItems = new ArrayList();
            mItems.add("I am list #" + mNumber);
        }
    
        @Override
        public void onActivityCreated(Bundle savedInstanceState) {
            super.onActivityCreated(savedInstanceState);
            setListAdapter(new ArrayAdapter(getActivity(), android.R.layout.simple_list_item_1, mItems));
            registerForContextMenu(getListView());
        }
    
        @Override
        public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
            super.onCreateContextMenu(menu, v, menuInfo);
            menu.add(mNumber, 0, 0, "Hello, World!");
        }
    
        @Override
        public boolean onContextItemSelected(MenuItem item) {
            if(item.getGroupId() == mNumber){
                Log.d("ViewPagerContextMenuBug", "onContextItemSelected called for number " + mNumber);
                Toast.makeText(getActivity(), "onContextItemSelected called for number " + mNumber, Toast.LENGTH_SHORT).show();
                return true;
            }
            return false;
        }
    
    }
    

提交回复
热议问题