2

我在使用片段时遇到问题。
首先是一些基本信息。我正在使用Actionbar带有 3 个选项卡/片段的 (support.v4)。前两个片段会导致问题。第一个片段扩展 ListFragment,第二个扩展片段。两者都有一个ListView和一个ArrayAdapter(不同的 ArrayAdapter)。

  1. 我的片段:

    在两个片段中,我创建了一个ContextMenu(不同的菜单/菜单项):

    在这两个片段中,我都覆盖了onCreateContextMenu(..)onContextItemSelected(..)

  2. 我的适配器:

    两个适配器都覆盖了 getView 方法。

  3. 我的问题:

    • 如果我选择ContextItem片段 2 的 a,onContextItemSelected则调用 frament 1 的方法。

    • 如果我更新片段 2,也会调用片段 1 的 getView。

在您的帮助和 StackOverflow 的帮助下,我已经发现,如果一个片段处于活动状态,那么紧挨着它的两个片段已经处于活动状态。因此,如果两个片段具有相同的可覆盖方法,则将选择第一个。问题是,我没有找到解决方案;-)

这里有没有人了解我的问题和/或曾经处理过这个问题?

编辑:源代码

public class ActionBarActivity extends FragmentActivity implements
ActionBar.TabListener {

SectionsPagerAdapter mSectionsPagerAdapter;
ViewPager mViewPager;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    getWindow().requestFeature(Window.FEATURE_ACTION_BAR);

    setContentView(R.layout.actionbarlayout);

    mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager());

    mViewPager = (ViewPager) findViewById(R.id.pager);
    mViewPager.setAdapter(mSectionsPagerAdapter);

    android.support.v4.app.FragmentManager      fm = getSupportFragmentManager();
    android.support.v4.app.FragmentTransaction  ft = fm.beginTransaction();
    android.support.v4.app.Fragment myFirstFragment     = (Fragment) new Fragment_ONE();
    android.support.v4.app.Fragment mySecondFragment    = (Fragment) new Fragment_TWO();
    android.support.v4.app.Fragment myThirdFragment     = (Fragment) new Fragment_THREE();
    ft.add(R.id.pager, myFirstFragment, "FIRSTFRAGTAG");
    ft.add(R.id.pager, mySecondFragment, "SECONDFRAGTAG");
    ft.add(R.id.pager, myThirdFragment, "THIRDFRAGTAG");
    ft.commit();
    fm.executePendingTransactions();

    public class SectionsPagerAdapter extends FragmentPagerAdapter {

    public SectionsPagerAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public Fragment getItem(int position) {
        switch (position){
        case 0:
            Fragment myFirstFragment = new Fragment_ONE();
            return myFirstFragment;
        case 1:
            Fragment mySecondFragment = new Fragment_TWO();
            return mySecondFragment;
        case 2:
            Fragment myThirdFragment = new Fragment_THREE();
            return myThirdFragment;
        default: 
            Fragment defaultFragment = new Fragment_ONE();
            return defaultFragment;

        }

    }
    @Override
    public int getCount() {
        // Show 3 total pages.
        return 3;
    }

    @Override
    public CharSequence getPageTitle(int position) {
        Locale l = Locale.getDefault();
        switch (position) {
        case 0:
            return getString(R.string.title_section1).toUpperCase(l);
        case 1:
             return getString(R.string.title_section2).toUpperCase(l);
        case 2:
            return getString(R.string.title_section3).toUpperCase(l);
        }
        return null;
     }




    @Override
        public void onTabSelected(ActionBar.Tab tab,
    FragmentTransaction fragmentTransaction) {
        mViewPager.setCurrentItem(tab.getPosition());
    }



@Override
public void onTabUnselected(ActionBar.Tab tab,
        FragmentTransaction fragmentTransaction) {
}

@Override
public void onTabReselected(ActionBar.Tab tab,
        FragmentTransaction fragmentTransaction) {
}

}


            public class FirstAdapter extends ArrayAdapter<xxx> {

                public BroadcastReceiver receiver = new BroadcastReceiver() {

                    @Override
                    public void onReceive(Context context, Intent intent) {
                        //SOME CODE
                    }
                };
                public FirstAdapter(Context context, ArrayList<xxx> items) {
                    super(context, 0, items);
                    // SOME CODE
                }

                @Override
                public View getView(int position, View convertView, ViewGroup parent) {
                    // SOME CODE: codeONE
                    return convertView;
                }
            }

            public class SecondAdapter extends ArrayAdapter<xxx> {

                public BroadcastReceiver receiver = new BroadcastReceiver() {

                    @Override
                    public void onReceive(Context context, Intent intent) {
                        //SOME CODE
                    }
                };
                public SecondAdapter(Context context, ArrayList<xxx> items) {
                    super(context, 0, items);
                    // SOME CODE
                }

            public  class Fragment_ONE extends ListFragment{

                public Fragment_ONE() {
                }

                @Override
                public View onCreateView(LayoutInflater inflater, ViewGroup container,
                        Bundle savedInstanceState) {
                    View rootView = inflater.inflate(
                            R.layout.firstfragment, container, false);
                    setRetainInstance(true);

                    return rootView;
                }

                @Override
                public void onActivityCreated (Bundle savedInstanceState) {
                    super.onActivityCreated(savedInstanceState);
                    mFirstListView =(ListView) getView().findViewById(android.R.id.list);
                    registerForContextMenu(mFirstListView);

                    mFirstAdapter = new FirstAdapter(myInstance, mItemsONE);
                    mFirstListView.setAdapter(mFirstAdapter);

                    @Override
                    public void onCreateContextMenu(ContextMenu menu, View v,
                        ContextMenuInfo menuInfo) {

                    super.onCreateContextMenu(menu, v, menuInfo);

                        if (v.getId() == android.R.id.list) {
                            AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) menuInfo;
                            menu.setHeaderTitle("CONTEXTMENU");
                            menu.add(FIRST_FRAGMENT_GROUP_ID, 0, 0, "1");
                            menu.add(FIRST_FRAGMENT_GROUP_ID, 1, 1, "2");
                            menu.add(FIRST_FRAGMENT_GROUP_ID, 2, 2, "3");
                            menu.add(FIRST_FRAGMENT_GROUP_ID, 3, 3, "4");
                            menu.add(FIRST_FRAGMENT_GROUP_ID, 4, 4, "5");
                            menu.add(FIRST_FRAGMENT_GROUP_ID, 5, 5, "6");
                        }
                    }

                    @Override
                    public boolean onContextItemSelected(MenuItem item) {

                        if (item.getGroupId()==FIRST_FRAGMENT_GROUP_ID){
                        AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) item
                                .getMenuInfo();

                        int ListItemIndex = info.position;

                        Intent broadcast = new Intent(UPDATEREQUEST);
                        broadcast.putExtra(UPDATEREQUESTEXTRA, 1);
                        ActionBarActivity.getMyInstance().getApplicationContext().sendBroadcast(broadcast);
                        return true;
                        }
                    }

                    @Override
                    public void onListItemClick(ListView l, View v, int position, long id) {
                    }
            }

            public  class Fragment_TWO extends Fragment {
                public Fragment_TWO() {
                }

                @Override
                public View onCreateView(LayoutInflater inflater, ViewGroup container,
                        Bundle savedInstanceState) {
                    View rootView = inflater.inflate(
                            R.layout.secondfragment, container, false);
                            setRetainInstance(true);

                    return rootView;
                }

                @Override
                public void onActivityCreated (Bundle savedInstanceState) {
                    super.onActivityCreated(savedInstanceState);

                    mySecondListView = (ListView) getView().findViewById(R.id.secondListView);

                    mySecondAdapter = new SecondAdapter(myInstance, myItemsTWO);
                    mySecondListView.setAdapter(mySecondAdapter);
                    registerForContextMenu(mySecondListView);   
                }

                @Override
                public void onCreateContextMenu(ContextMenu menu, View v,
                        ContextMenuInfo menuInfo) {
                    super.onCreateContextMenu(menu, v, menuInfo);
                    AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) menuInfo;
                    menu.setHeaderTitle("Options");
                    menu.add(SECOND_FRAGMENT_GROUP_ID, 1, 1, "1");
                    menu.add(SECOND_FRAGMENT_GROUP_ID, 2, 2, "2");
                }

                @Override
                public boolean onContextItemSelected(MenuItem item) {
                    super.onContextItemSelected(item);
                    // SOME CODE
                    Intent broadcast = new Intent(UPDATEREQUEST);
                    broadcast.putExtra(UPDATEREQUESTEXTRA, 1);
                    ActionBarActivity.getMyInstance().getApplicationContext().sendBroadcast(broadcast);
                    return true;
                }

            }
                @Override
                public View getView(int position, View convertView, ViewGroup parent) {
                    // SOME CODE: codeTWO
                    return convertView;
                }
            }
4

1 回答 1

1

Android FragmentManager 通过遍历所有 Fragment 来处理 contextMenuItem 选择的覆盖,因此处理上下文菜单单击的每个 Fragment 都需要具有是否处理调用或是否应将调用传递给下一个 Fragment 的逻辑。

看到这个答案: ViewPager 中的错误片段接收 onContextItemSelected 调用

于 2014-09-09T00:44:03.957 回答