2012-01-11 9 views
5

Sto provando a visualizzare una mappa in una serie di schede, usando i frammenti. Il problema che sto riscontrando è l'attività della mappa scompare se l'utente naviga verso un altro frammento, quindi torna indietro. Come posso visualizzare MapActivity in frammenti in un tabhost?MapActivity in TabHost Frammento che scompare dopo l'interruttore di tabulazione

La base di questo da numerose domande intorno a come integrare un MapActivity con frammenti (vedi MapView in a Fragment (Honeycomb))

MainTabActivity ha un tabhost e usa FragmentManager per visualizzare Frammenti nelle schede. MapFragment ha un tabhost e lo usa per visualizzare un MapActivity.
MapFragment utilizza LocalActivityManager per propagare gli eventi del ciclo di vita all'attività contenuta.

Così MapFragment: il layout

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View view = inflater.inflate(R.layout.map_fragment, container, false); 
     mTabHost = (TabHost) view.findViewById(android.R.id.tabhost); 
     mTabHost.setup(getLocalActivityManager()); 
     Intent intent = new Intent(getActivity(), MapActivityWrapper.class); 
//  intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);//does nothing 
     TabHost.TabSpec tab = mTabHost.newTabSpec("map") 
       .setIndicator("map") 
       .setContent(intent); 
     mTabHost.addTab(tab); 
     return view; 
    } 

MapFragment:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
       android:layout_width="fill_parent" 
       android:layout_height="fill_parent" 
       android:orientation="vertical"> 
    <TabHost xmlns:android="http://schemas.android.com/apk/res/android" 
      android:id="@android:id/tabhost" 
      android:layout_width="fill_parent" 
      android:layout_height="fill_parent"> 
     <LinearLayout android:orientation="vertical" 
       android:layout_width="fill_parent" 
       android:layout_height="fill_parent"> 
      <TabWidget android:id="@android:id/tabs" 
        android:visibility="gone" 
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content"/> 
      <FrameLayout android:id="@android:id/tabcontent" 
        android:layout_width="fill_parent" 
        android:layout_height="fill_parent"/> 
     </LinearLayout> 
    </TabHost> 
</LinearLayout> 

Il codice in MainTabActivity per modificare il contenuto della scheda:

private void updateTab(String oldId, String tabId) { 
    FragmentManager fm = getSupportFragmentManager(); 
    Fragment old = fm.findFragmentByTag(oldId); 
    Fragment selected = fm.findFragmentByTag(tabId); 
    FragmentTransaction ft = fm.beginTransaction(); 
    boolean added = false; 
    if (selected == null) { 
     selected = createFragment(tabId); 
    } else { 
     try { 
      ft.remove(selected); 
     } catch (Exception e) { 
      ft.add(android.R.id.tabcontent, selected, tabId); 
      added = true; 
      //exception for removing an unadded fragment... why throw an exception? 
     } 
    } 
    if (old != null) ft.remove(old); 
    if (!added) ft.replace(android.R.id.tabcontent, selected, tabId); 
    if (!creating && !backStackProcessing) ft.addToBackStack(null);//member vars 
    ft.commit(); 
} 

disposizione MainTabActivity (cancellato una serie di layout di estranei):

Ancora: il problema riscontrato è che l'attività della mappa scompare se l'utente passa a un altro frammento, quindi torna indietro. Come posso visualizzare MapActivity in frammenti in un tabhost?

Grazie mille.

+0

Hai finito per risolvere questo problema? Sto correndo contro lo stesso problema ... – Rockmaninoff

risposta

5

ho lavorato intorno a questo problema come segue ...

ho avuto una variabile di livello di classe:

private View mMapViewContainer; 

ho creato la scheda che contiene la mappa come segue (dove MyMapActivity è il MapActivity visualizzata nella scheda e mTabHost è il TabHost) nel metodo onViewCreated della mia Frammento:

// Map tab 
Intent intent = new Intent(getActivity(), MyMapActivity.class); 
Window window = mLocalActivityManager.startActivity(MAP_ACTIVITY_TAG, intent); 
mMapViewContainer = window.getDecorView(); 
mMapViewContainer.setVisibility(View.VISIBLE); 
mMapViewContainer.setFocusableInTouchMode(true); 
((ViewGroup) mMapViewContainer).setDescendantFocusability(ViewGroup.FOCUS_AFTER_DESCENDANTS); 

View tab = getActivity().getLayoutInflater().inflate(R.layout.tab_background, null); 
((TextView) tab.findViewById(R.id.tv_tab_title)).setText(getResources().getString(R.string.map)); 
TabSpec tabSpec = mTabHost.newTabSpec(MAP_TAB_TAG).setIndicator(tab).setContent(new TabContentFactory() { 

    @Override 
    public View createTabContent(String tag) { 
     return mMapViewContainer; 
    } 
}); 
mTabHost.addTab(tabSpec); 

E poi nei frammenti onStop() metodo ho fatto la seguente:

@Override 
public void onStop() { 
    super.onStop(); 

    ((ViewGroup) mMapViewContainer.getParent()).removeView(mMapViewContainer); 
} 

Ora la mappa è ri-visualizzato quando l'utente si sposta su un altro frammento e poi di nuovo.

+0

Per inciso, il codice che ho usato per creare il mio mMapViewContainer dovrebbe essere accreditato a @ChristopherK nel thread dei commenti di questa risposta: http://stackoverflow.com/a/8126287/447197 – tafty

3

Se si è utilizzato ViewPager nel progetto, chiamare setOffscreenPageLimit() per esso come indicato qui sotto:

this.mViewPager.setOffscreenPageLimit(fragments.size());

in cui frammenti è il vettore di frammenti che hai creato

+0

Grazie mille! Questo mi ha infastidito per ORE e alla fine ho trovato una soluzione al problema in cui i miei frammenti stavano scomparendo dopo un paio di scambi! Grazie mille! – Ruuhkis

Problemi correlati