错误@Override片段中的方法被调用(Android)

问题描述:

我有一个使用片段的问题。
首先是一些基本的信息。我正在使用带3个Tabs/Fragments的Actionbar(support.v4)。前两个片段会导致问题。第一个片段扩展了ListFragment,第二个扩展了片段。两者都有一个ListView和一个ArrayAdapter(不同的ArrayAdapters)。错误@Override片段中的方法被调用(Android)

  1. 我的片段:

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

    在两个片段我重写onCreateContextMenu(..)onContextItemSelected(..)

  2. 我的适配器:

    两个适配器重写getView方法。

    • 如果我选择片段2的ContextItem,frament 1的onContextItemSelected方法被称为:

    • 我的问题。

    • 如果我更新片段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; 
       } 
      } 
+0

发布一些代码,您提出,我们会尽力帮助你们。但现在,这很困难。 – Fllo

+0

你使用viewpager来保存片段? –

+0

是的,我喜欢。因为圣诞节我没有那么多时间。但我会尽快写一些代码。非常感谢! – Wicked161089

的Android FragmentManager通过所有碎片迭代处理针对的ContextMenuItem选择覆盖,让您的每一个片段处理上下文菜单中点击需要有逻辑,是否处理呼叫或者如果该呼叫应该传递给下一个片段。

看到这个答案: Wrong fragment in ViewPager receives onContextItemSelected call