4

J'essaie de configuration suivante navigation dans mon application:Remplacer ListFragment avec le fragment intérieur ViewPager avec onglets

état actuel: ViewPager + onglets de glisser entre les listes:

  • ListFragment A
  • ListFragment B

condition souhaitée: ViewPager + onglets:

  • ListFragment A onListItemSelected remplacer ListFragment A avec DetailFragment A
  • ListFragment B onListItemSelected remplacer ListFragment B avec B DetailFragment

Le but est d'afficher les fragments de détail à l'intérieur de l'onglet de navigation. Je ne peux pas remplacer le fragmentList par un detailFragment (le fragmentList n'a aucune disposition faite sur commande et donc aucun ID ET je ne sais pas comment le faire). En outre, le démarrage d'une nouvelle activité masque la barre d'onglets.

Quelqu'un peut-il m'aider s'il vous plaît?

Répondre

14

Je voudrais faire un fragment de wrapper qui sait quoi montrer - liste ou détails. Ceci serait complètement découplé de ViewPager - le pager sache seulement qu'il contient des fragments de wrapper, et ceux-ci géreraient eux-mêmes leur contenu.

La mise en œuvre serait le long de ces lignes:

public class WrapperFragment extends Fragment { 

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

     MyListFragment list = new MyListFragment(); 
     list.setListAdapter(adapter); 
     list.setOnItemClickListener(new OnItemClickListener() { 
      @Override public void onItemClick(AdapterView<?> l, View v, int position, long id) { 
       // Create details fragment based on clicked item's position 
       Fragment details = new Fragment(); 
       getChildFragmentManager() 
        .beginTransaction() 
        .replace(R.id.container, details) 
        .addToBackStack(null) 
        .commit(); 
      } 
     }); 

     getChildFragmentManager() 
      .beginTransaction() 
      .add(R.id.container, list) 
      .commit(); 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     // There has to be a view with id `container` inside `wrapper.xml` 
     return inflater.inflate(R.layout.wrapper, container, false); 
    } 

    public class MyListFragment extends ListFragment { 

     private OnItemClickListener listener; 

     public void setOnItemClickListener(OnItemClickListener l) { 
      this.listener = l; 
     } 

     @Override 
     public void onListItemClick(ListView l, View v, int position, long id) { 
      if(listener != null) { 
       listener.onItemClick(l, v, position, id); 
      } 
     } 
    } 
} 

wrapper.xml. L'idée est que WrapperFragment doit fournir une mise en page qui contient une vue avec l'ID container - parce que nous utilisons la vue avec cet ID pour mettre le fragment enfant - MyListFragment ou DetailsFragment.

<?xml version="1.0" encoding="utf-8"?> 
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <FrameLayout 
     android:id="@+id/container" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"/> 

</FrameLayout> 

Une autre façon. Cela devrait fonctionner, mais vous devrez essayer cela (la mise en page a id lui-même, plutôt que d'avoir un enfant avec id container):

<?xml version="1.0" encoding="utf-8"?> 
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/container" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"/> 
+0

l'emballage de mise en page ressemblerait à ceci? Je reçois une InflateException pour onCreateView.

+1

Ajout d'un exemple pour 'wrapper.xml'. Faites-moi savoir si vous rencontrez des problèmes avec ce – mindeh

+0

Merci, il semble bien fonctionner. –

Questions connexes