Passaggio di frammenti all'interno della linguetta

Sto creando un'applicazione che utilizza ActionBarSherlock. L'applicazione è costituita da tre tabs e in ciascuna di esse vengono visualizzate più schermate in base all'entrata dell'utente. Sono in grado di commutare frammenti tra le tabs, ma la commutazione di frammenti all'interno delle tabs fornisce un problema. Ho provato così:

Nella class principale:

  • riempiendo un cerchio gradualmente dal basso verso l'alto e android
  • Come fermare un dispositivo android da caricare in modo programmato?
  • Errore (-19,0) Mediaplayer
  • Come get il livello della batteria dopo la connessione al dispositivo BLE?
  • Layout specifico per Android per Android
  • Errore durante l'esecuzione dell'emulatore in android
  • SingleStationFragment singleStationFragment = new SingleStationFragment(); FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); transaction.replace(android.R.id.content, singleStationFragment); transaction.addToBackStack(null); transaction.commit(); 

    Questo sostituisce il primo frammento per il secondo, ma quando cambio le tabs, il secondo frammento è ancora visibile, mostrando il contenuto della nuova scheda in cima al contenuto della vecchia scheda. Penso che in qualche modo devo separare il secondo frammento in onTabUnselected , ma non ho idea di come get un riferimento a questo frammento.

    Qualcuno mi può aiutare con questo?

    Per chiarezza, alcune classi significative:

    La mia class principale:

     public class TreinVerkeer extends SherlockFragmentActivity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setupTabs(savedInstanceState); } @Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getSupportMenuInflater(); inflater.inflate(R.menu.menu, menu); return true; } private void setupTabs(Bundle savedInstanceState) { ActionBar actionBar = getSupportActionBar(); actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); Tab tab = actionBar.newTab().setText("STATIONS").setTabListener(new TabListener<StationsFragment>(this, "stations", StationsFragment.class)); actionBar.addTab(tab); tab = actionBar.newTab().setText("ROUTE").setTabListener(new TabListener<RouteFragment>(this, "route", RouteFragment.class)); actionBar.addTab(tab); tab = actionBar.newTab().setText("DELAYS").setTabListener(new TabListener<DelaysFragment>(this, "delays", DelaysFragment.class)); actionBar.addTab(tab); if (savedInstanceState != null) { actionBar.setSelectedNavigationItem(savedInstanceState.getInt("tab", 0)); } } @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putInt("tab", getSupportActionBar().getSelectedNavigationIndex()); } } 

    Il TabListener (da "Aggiunta di tabs di navigazione" nel sito dello sviluppatore Android con alcune modifiche minori):

     public class TabListener<T extends SherlockFragment> implements com.actionbarsherlock.app.ActionBar.TabListener { private SherlockFragment mFragment; private final Activity mActivity; private final String mTag; private final Class<T> mClass; /** * Constructor used each time a new tab is created. * * @param activity * The host Activity, used to instantiate the fragment * @param tag * The identifier tag for the fragment * @param clz * The fragment's Class, used to instantiate the fragment */ public TabListener(Activity activity, String tag, Class<T> clz) { mActivity = activity; mTag = tag; mClass = clz; } /* The following are each of the ActionBar.TabListener callbacks */ public void onTabSelected(Tab tab, FragmentTransaction ft) { SherlockFragment preInitializedFragment = (SherlockFragment) mActivity.getSupportFragmentManager().findFragmentByTag(mTag); // Check if the fragment is already initialized if (mFragment == null && preInitializedFragment == null) { // If not, instantiate and add it to the activity mFragment = (SherlockFragment) SherlockFragment.instantiate(mActivity, mClass.getName()); ft.add(android.R.id.content, mFragment, mTag); } else if (mFragment != null) { // If it exists, simply attach it in order to show it ft.attach(mFragment); } else if (preInitializedFragment != null) { ft.attach(preInitializedFragment); mFragment = preInitializedFragment; } } public void onTabUnselected(Tab tab, FragmentTransaction ft) { if (mFragment != null) { // Detach the fragment, because another one is being attached ft.detach(mFragment); } } public void onTabReselected(Tab tab, FragmentTransaction ft) { // User selected the already selected tab. Usually do nothing. } } 

    E StationsFragment (il RouteFragment e DelaysFragment sono gli stessi, con solo text diverso)

     public class StationsFragment extends SherlockFragment { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.stationsfragment, container, false); } } 

    One Solution collect form web for “Passaggio di frammenti all'interno della linguetta”

    Quindi, quello che è accaduto è che, in TabListener , nel metodo onTabUnselected , il Fragment non è stato staccato, causandolo ancora ad essere mostrato mentre è stato mostrato un nuovo Fragment .

    La causa a questo fu che il Fragment che si staccava era il primo frammento, e non il mio secondo frammento. Ho fatto alcune modifiche.

    Nell'attività:

     SingleStationFragment singleStationFragment = new SingleStationFragment(); FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); transaction.replace(android.R.id.content, singleStationFragment, "STATIONS"); transaction.addToBackStack(null); transaction.commit(); 

    Qui ho aggiunto il tag "STATIONS" nel metodo replace() , che è lo stesso tag del primo frammento.
    Il TabListener è ora come segue:

     public class TabListener<T extends SherlockFragment> implements com.actionbarsherlock.app.ActionBar.TabListener { private final SherlockFragmentActivity mActivity; private final String mTag; private final Class<T> mClass; private SherlockFragment mFragment; public TabListener(SherlockFragmentActivity activity, String tag, Class<T> clz) { mActivity = activity; mTag = tag; mClass = clz; } public void onTabSelected(Tab tab, FragmentTransaction ft) { SherlockFragment preInitializedFragment = (SherlockFragment) mActivity.getSupportFragmentManager().findFragmentByTag(mTag); if (preInitializedFragment == null) { mFragment = (SherlockFragment) SherlockFragment.instantiate(mActivity, mClass.getName()); ft.add(R.id.treinverkeer_fragmentcontent, mFragment, mTag); } else { ft.attach(preInitializedFragment); } } public void onTabUnselected(Tab tab, FragmentTransaction ft) { SherlockFragment preInitializedFragment = (SherlockFragment) mActivity.getSupportFragmentManager().findFragmentByTag(mTag); if (preInitializedFragment != null) { ft.detach(preInitializedFragment); } else if (mFragment != null) { ft.detach(mFragment); } } public void onTabReselected(Tab tab, FragmentTransaction ft) { // User selected the already selected tab. Usually do nothing. } } 

    Nel metodo onTabUnselected , onTabUnselected ora il Fragment corretto, quindi rimuovi.

    Spero che questo aiuti qualcuno!

    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.