2011-11-16 13 views
5

Ho cercato di inserire un MapView in un ActionBarTab, ma non ero in grado di risolvere il problema anche su Google.FragmentMap + ActionBar Tab

Qui è l'attività principale:

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    //setContentView(R.layout.action_bar_tabs); 
    FragmentManager fm = getSupportFragmentManager(); 
    fm.beginTransaction().add(android.R.id.content, GigLoader.GigLoaderListFragment.newInstance()).commit(); 

    getSupportActionBar().setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); 

    ActionBar.Tab tab1 = getSupportActionBar().newTab().setText("Geo").setTabListener(this); 
    ActionBar.Tab tab2 = getSupportActionBar().newTab().setText("Lista").setTabListener(this); 
    getSupportActionBar().addTab(tab1); 
    getSupportActionBar().addTab(tab2); 
} 

@Override 
public void onTabSelected(Tab tab, FragmentTransaction ft) { 
    if (tab.getPosition() == 0) { 
     fm.beginTransaction().add(android.R.id.content, GigLoader.GigLoaderListFragment.newInstance()).commit(); 
    } 
    else { 
     fm.beginTransaction().add(android.R.id.content, GeoGigLoader.GeoGigMapFragment.newInstance()).commit(); 
    } 

} 

E qui il codice del GeoGigLoader:

public class GeoGigLoader extends FragmentMapActivity { 

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

public static final class GeoGigMapFragment extends Fragment { 

    static GeoGigMapFragment newInstance() { 
     GeoGigMapFragment map = new GeoGigMapFragment(); 
     return map; 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View view = getActivity().getLayoutInflater().inflate(R.layout.map_gigs, container, false); 
     MapView mapView = (MapView)view.findViewById(R.id.map_view); 
     mapView.setBuiltInZoomControls(true); 
     return view; 
    } 

} 

@Override 
protected boolean isRouteDisplayed() { 
    return false; 
} 
} 

FragmentMapActivity è una libreria da actionbarsherlock.com, e questo si estende da un MapActivity, così dovrebbe funzionare.

L'errore che ottengo, è la prossima:

FATAL EXCEPTION: main E/AndroidRuntime(954): android.view.InflateException: Binary XML file line #2: Error inflating class com.google.android.maps.MapView E/AndroidRuntime(954): at android.view.LayoutInflater.createView(LayoutInflater.java:513) E/AndroidRuntime(954): at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:565)

Qualcuno sa cosa sta succedendo?

risposta

4

La soluzione è avviare mapview nell'attività principale che dovrebbe estendere FragmentMapActivity. Quindi il tuo frammento può implementare il mapview recuperandolo dall'attività principale.

Principale attività:

mMapView = new MapView(YourActivity.this, MAPS_KEY); 
    mMapView.setClickable(true); 
    Exchanger.mMapView = mMapView; 

Frammento:

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    mMapView = Exchanger.mMapView; 
    return mMapView; 
} 

@Override 
public void onDestroy() { 
    if(mMapView != null) { 
     NoSaveStateFrameLayout parentView = (NoSaveStateFrameLayout) mMapView.getParent(); 
     parentView.removeView(mMapView); 
    } 
    super.onDestroy(); 
} 

Exchanger è una classe con un campo statico con mapview in esso.

+0

Ma come posso dichiarare l'attributo mapView di Exchanger ?? Non ho mai usato la classe di scambio – cesards

+0

Exchanger è solo una classe che ho creato io, è una classe con solo 1 campo statico che è mMapView. – Warpzit

+0

Perfetto. Sì, ho fatto lo stesso. Uno Singleton :-) Grazie mille! – cesards

1

La libreria API di Google Maps per Android non supporta frammenti in questo momento.

+0

Ma ci sono alcuni trucchi per farlo. Il problema sta usando la barra delle azioni + schede + mappa – cesards

0

uso i metodi mostra/nascondi per evitare di creare MapView multipla in un MapActivity:

 
public class TabFragment extends SherlockFragment { 

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

     ActionBar actionBar = getSherlockActivity().getSupportActionBar(); 
     actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); 

     actionBar.addTab(actionBar 
      .newTab() 
      .setText("List") 
      .setTabListener(
       new TabListener(((FragmentActivity) getActivity()), "listFragment", ListFragment.class))); 

     actionBar.addTab(actionBar 
      .newTab() 
      .setText("Map") 
      .setTabListener(
       new TabListener(((FragmentActivity) getActivity()), "MapFragment", MapFragment.class))); 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     return inflater.inflate(R.layout.tab_view, container, false); 
    } 

    public static class TabListener implements ActionBar.TabListener { 
     private final FragmentActivity activity; 
     private final String tag; 
     private final Class clazz; 
     private final Bundle args; 
     private Fragment fragment; 

     public TabListener(FragmentActivity activity, String tag, Class clz) { 
      this(activity, tag, clz, null); 
     } 

     public TabListener(FragmentActivity activity, String tag, Class clz, Bundle args) { 
      this.activity = activity; 
      this.tag = tag; 
      this.clazz = clz; 
      this.args = args; 

      // Check to see if we already have a fragment for this tab, probably from a previously saved state. If so, 
      // hide it, because our initial state is that a tab isn't shown. 
      fragment = activity.getSupportFragmentManager().findFragmentByTag(tag); 
      if (fragment != null && !fragment.isHidden()) { 
       FragmentTransaction ft = activity.getSupportFragmentManager().beginTransaction(); 
       ft.hide(fragment); 
       ft.commit(); 
      } 
     } 

     @Override 
     public void onTabSelected(Tab tab, FragmentTransaction ft) { 
      if (fragment == null) { 
       fragment = Fragment.instantiate(activity, clazz.getName(), args); 
       ft.add(R.id.container_fragment, fragment, tag); 
      } else { 
       ft.show(fragment); 
      } 
     } 

     @Override 
     public void onTabUnselected(Tab tab, FragmentTransaction ft) { 
      if (fragment != null) { 
       ft.hide(fragment); 
      } 
     } 

     @Override 
     public void onTabReselected(Tab tab, FragmentTransaction ft) { 
     } 
    } 
} 
1

Ho risolto questo problema modificando il metodo onCreateView:

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 
    if (view == null) { 
     view = inflater.inflate(R.layout.fragment_geo, container, false); 
    } 
    return view; 
} 

dove vista è un Visualizza l'oggetto.