2

Je ne suis pas très expert en Fragment android. Dans mon dernier projet, j'utilisais TabActivity, mais à cause de sa dépréciation, je commence à implémenter un ActionBar en utilisant Fragments.Mise en page Android MasterDetail dans ActivityTab éviter les fragments imbriqués

Voici le code de ma classe Tab:

public class TabInterventoClass extends FragmentActivity{ 

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

    ActionBar actionBar = getSupportActionBar(); 
    actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); 
    actionBar.setDisplayShowTitleEnabled(false); 

    Tab tab = actionBar.newTab() 
      .setText("Dati") 
      .setTabListener(new TabListener<DatiFragment_>(this, "dati", DatiFragment_.class)); 
    actionBar.addTab(tab); 

    tab = actionBar.newTab() 
      .setText("Sistemi alimentazione") 
      .setTabListener(new TabListener<SistemaAlimentazioneFragment_>(this, "Sistemi alimentazione", SistemaAlimentazioneFragment_.class)); 
    actionBar.addTab(tab); 

    tab = actionBar.newTab() 
     .setText("Home") 
     .setTabListener(new TabListener<HomeFragment_>(this, "home", HomeFragment_.class)); 
    actionBar.addTab(tab); 
} 

J'ai mis en ActionBar.TabListener ainsi:

public class TabListener<T extends Fragment> implements ActionBar.TabListener { 
    private Fragment mFragment; 
    private final FragmentActivity mActivity; 
    private final String mTag; 
    private final Class<T> mClass; 

    public TabListener(FragmentActivity activity, String tag, Class<T> clz) { 
     mActivity = activity; 
     mTag = tag; 
     mClass = clz; 
    } 

    public void onTabSelected(Tab tab, FragmentTransaction ft) { 
     // Check if the fragment is already initialized 
     if (mFragment == null) { 
      // If not, instantiate and add it to the activity 
      mFragment = Fragment.instantiate(mActivity, mClass.getName()); 
      ft.add(android.R.id.content, mFragment, mTag); 
     } else { 
      // If it exists, simply attach it in order to show it 
      //ft.attach(mFragment); 
      ft.show(mFragment); 
     } 
    } 

    public void onTabUnselected(Tab tab, FragmentTransaction ft) { 
     if (mFragment != null) { 
      // Detach the fragment, because another one is being attached 
      //ft.detach(mFragment); 
      ft.hide(mFragment); 
     } 
    } 
} 

S'il vous plaît noter le commentaire sur fixez/détachez méthode en faveur de afficher/masquer C'est parce que dans mon deuxième onglet, je reçois une exception la deuxième fois que je l'entre (certainement pour mauvaise conception de deuxième fragment de tabulation). Voici l'exception:

10-18 11:10:13.093: E/AndroidRuntime(3777): Caused by: java.lang.IllegalArgumentException: Binary XML file line #38: Duplicate id 0xffffffff, tag sistemiList, or parent id 0x0 with another fragment for it.cpmapave.mt.ui.intervento.SistemaAlimentazioneListFragment_ 

(Retrait de l'étiquette et l'identifiant de <fragment android:name="it.cpmapave.mt.ui.intervento.SistemaAlimentazioneListFragment_" /> résoudre le problème .. mais je besoin d'un moyen de l'obtenir afin de rafraîchir son adaptateur J'afficher/masquer les fragments au lieu de joindre /! détacher). Heureusement, je dois corriger l'orientation pour ne pas avoir de problème de chevauchement des fragments lorsque l'orientation change en utilisant show/hide.

Voici l'onglet PREMIER DatiFragment, qui étend la classe Fragment.

First Fragment

Et cela semble être ok!

Et voici sur l'onglet DEUXIÈME, qui affiche StrumentiFragment. Voici la mise en page:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:orientation="vertical" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:layout_marginLeft="16dp" 
android:layout_marginRight="16dp" 
android:divider="?android:attr/dividerHorizontal" 
android:showDividers="middle"> 
<LinearLayout 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:orientation="horizontal"> 
    <TextView 
     android:layout_height="fill_parent" 
     android:layout_width="wrap_content" 
     android:gravity="center_vertical" 
     android:text="Sistema di alimentazione:" /> 

    <Spinner 
     android:id="@+id/sistemiDiAlimentazione" 
     android:layout_height="fill_parent" 
     android:layout_width="wrap_content" /> 

    <Button 
     android:layout_height="wrap_content" 
     android:layout_width="wrap_content" 
     android:text="Aggiungi" 
     android:id="@+id/addSistemaAlimentazione" />   

</LinearLayout> 
<LinearLayout 
    android:baselineAligned="false" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="horizontal"> 
    <fragment android:name="it.cpmapave.mt.ui.intervento.SistemaAlimentazioneListFragment_" 
     android:layout_width="0dp" 
     android:tag="sistemiList" 
     android:layout_height="match_parent" 
     android:layout_weight="1" /> 
    <FrameLayout android:id="@+id/item_detail_container" 
     android:layout_width="0dp" 
     android:layout_height="match_parent" 
     android:layout_weight="3" /> 
</LinearLayout> 

enter image description here

Ajout d'un élément de Spinner dans Fragment une mise à jour du FragmentList B. La sélection d'un élément à partir de détails de mise à jour Liste Fragment B dans le fragment C.

Je pense que le problème pourrait être causé par des fragments imbriqués .. mais je ne sais pas comment je le conçois d'une manière différente .. peut-être que je le rends plus difficile que c'est vraiment ..

J'ai omis de dire et de montrer dans le code que j'utilise ActionBarSherlock, seulement parce que je pense que ce n'est pas la cause de mon problème!

Ainsi, à la fin .. la question est:

J'ai besoin d'obtenir une mise en page fonctionnelle comme celui montré dans la deuxième image. Mais je l'ai obtenu seulement par des fragments de nidification. Je dois éviter de le faire. Comment puis-je faire?

Merci pour toute réponse Marco

+0

cacher et afficher dans l'activité de l'onglet sont une mauvaise pratique dans mon cas, car le fragment ne soit pas mis en pause et repris .. donc mes valeurs ne sont pas stockées en db .. – gipinani

+0

quelle est la question? – vikki

+0

Je dois obtenir une disposition fonctionnelle comme celle montrée dans la deuxième image. Mais je l'ai obtenu seulement par des fragments de nidification. Je dois éviter de le faire. Comment puis-je faire? – gipinani

Répondre

3

Je l'ai résolu de mettre chaque image dans un FrameLayout, affichage/masquage en cas de besoin.

J'ai également défini une mise en page personnalisée pour la classe où je créé mon ActionTab:

<TabHost 
xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@android:id/tabhost" 
android:layout_width="match_parent" 
android:layout_height="match_parent"> 

<LinearLayout 
    android:orientation="vertical" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <TabWidget 
     android:id="@android:id/tabs" 
     android:orientation="horizontal" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_weight="0"/> 

    <FrameLayout 
     android:id="@android:id/tabcontent" 
     android:layout_width="0dp" 
     android:layout_height="0dp" 
     android:layout_weight="1"/> 

    <LinearLayout 
     android:baselineAligned="false" 
     android:orientation="horizontal" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"> 
     <FrameLayout 
      android:id="@+android:id/navtabcontent" 
      android:layout_width="0dp" 
      android:layout_height="600dp" 
      android:layout_weight="1"/> 
     <FrameLayout 
      android:id="@+android:id/realtabcontent" 
      android:layout_width="0dp" 
      android:layout_height="600dp" 
      android:layout_weight="3"/> 
    </LinearLayout> 
</LinearLayout> 

J'espère que cela peut être utile pour quelqu'un!

Questions connexes