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.
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>
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
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
quelle est la question? – vikki
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