2013-02-11 5 views
3

Mon application dispose d'une vue de liste et de détail, où je permets à l'utilisateur de glisser entre les différentes vues de détail, en utilisant un ViewPager en portrait. En paysage, je montre les deux fragments sur l'écran.L'utilisation findFragmentById avec un ViewPager

J'ai un problème où, lorsque l'appareil est pivoté, les icônes se dupliquent encore et encore dans le Actionbar. J'ai appris que je suis probablement en train de créer de nouveaux fragments chaque fois que le périphérique est pivoté et que je devrais vérifier si le fragment est dans le FragmentManager puis créer une nouvelle instance si ce n'est pas le cas.

Je suis capable de le faire facilement en utilisant la mise en page paysage, cependant, je ne suis pas sûr de savoir comment vérifier si le fragment existe en mode portrait, en utilisant le ViewPager. Est-ce que je fais cela dans getItem() du FragmentStatePagerAdapter?

Ce code J'utilise:

public class Main extends SherlockFragmentActivity 
{ 
    private static List<Integer> mIds; 

    @Override 
    public void onCreate(final Bundle icicle) 
    {  
     super.onCreate(icicle); 

     setContentView(R.layout.main); 

     mViewPager = (ViewPager)findViewById(R.id.viewpager); //view pager exists, so we are using the portait layout 

     if (mViewPager != null) 
     { 
      mIds = new ArrayList<Integer>(); 

      mIds.add(0); 
      mIds.add(1); 
      mIds.add(2); 
     } 
     else //in landscape 
     {   
      ListFragment lf = (ListFragment)getSupportFragmentManager().findFragmentById(R.id.fragmentList); 

      if (lf == null) 
       lf = new ListFragment(); 

      DetailFragment df = (DetailFragment)getSupportFragmentManager().findFragmentById(R.id.fragmentDetail); 

      if (df == null) 
      { 
       df = new DetailFragment(); 
       df.setArguments(getIntent().getExtras()); 
      } 

      getSupportFragmentManager().beginTransaction().add(R.id.fragmentList, lf).commit(); 
      getSupportFragmentManager().beginTransaction().add(R.id.fragmentDetail, df).commit(); 
     } 
    }  

    private static class MyFragmentPagerAdapter extends FragmentStatePagerAdapter { 

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

     @Override 
     public Fragment getItem(int index) {   
      //can't use getSupportFragmentManager().findFragmentById() here because I get a "Cannot make a static reference to the non-static method" error 
      if (index == 0) 
       return ListFragment.newInstance(); 
      else    
       return DetailFragment.newInstance(mIds.get(index-1)); 
     } 

     @Override 
     public int getCount() { 
      return 4; 
     } 
    } 
} 

Mise en page principale (portrait)

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_height="fill_parent" 
    android:layout_width="fill_parent"> 

    <android.support.v4.view.ViewPager 
     android:id="@+id/viewpager" 
     android:layout_height="match_parent" 
     android:layout_width="match_parent" 
    /> 
</RelativeLayout> 

Mise en page principale (paysage)

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="horizontal" 
    android:layout_height="fill_parent" 
    android:layout_width="fill_parent" 
    android:weightSum="3" 
> 
    <FrameLayout 
     android:id="@+id/fragmentList" 
     android:layout_weight="1" 
     android:layout_width="0dp" 
     android:layout_height="fill_parent" 
    /> 

    <FrameLayout 
     android:id="@+id/fragmentDetail" 
     android:layout_width="0dp" 
     android:layout_weight="2" 
     android:layout_height="fill_parent" 
    /> 

</LinearLayout> 

Liste Fr agment

public class ListFragment extends SherlockListFragment implements DialogKeywordAddListener 
{ 
    @Override 
    public void onCreate(Bundle savedInstanceState){ 
     super.onCreate(savedInstanceState); 

     setHasOptionsMenu(true); 
    } 

    public static ListFragment newInstance() { 

     return new ListFragment(); 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     super.onCreateView(inflater, container, savedInstanceState); 

     return inflater.inflate(R.layout.listing, container, false); 
    } 
} 

Détail Fragment

public class DetailFragment extends SherlockListFragment 
{ 
    private int mId; 

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

     setHasOptionsMenu(true); 
    } 

    public static DetailFragment newInstance() { 

     DetailFragment df = new DetailFragment(); 
     Bundle bundle = new Bundle(); 
     bundle.putInt("id", id); 
     df.setArguments(bundle); 

     return df; 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     super.onCreateView(inflater, container, savedInstanceState); 

     if (getArguments() != null) 
      mId = getArguments().getInt("id"); 

     return inflater.inflate(R.layout.detail, container, false); 
    } 
} 

Répondre

2

Eh bien, la solution this question's semblait fonctionner pour moi. couchait:

super.onCreate(null); 

dans onCreate du Activity résolu mon problème de fragment.

+1

Cela semble être une très mauvaise idée, vider de nombreuses autres fonctionnalités dans le processus. – kaay