2011-11-16 78 views
5

我一直试图插入一个MapViewActionBarTab,但我没有能够解决这个问题,即使使用谷歌搜索。FragmentMap + ActionBar标签

这里的主要活动:

@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(); 
    } 

} 

而这里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是actionbarsherlock.com图书馆,而这一次从MapActivity延伸,从而它应该工作。

我得到的错误,是下一个:

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)

任何人都知道发生了什么事?

回答

4

解决方案是在应该扩展FragmentMapActivity的主要活动中启动mapview。然后你的片段可以通过从主要活动中获取它来实现mapview。

主要活动:

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

片段:

@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(); 
} 

器是与在它的MapView静态字段的类。

+0

但我怎样才能声明交换器mapView属性? 我从来没有使用Exchange类 – cesards

+0

交换器只是一个我自己做的类,它只有一个静态字段为mMapView的类。 – Warpzit

+0

完美。是的,我也是这样做的。一个单身人士:-)非常感谢你! – cesards

1

Google的Android Maps Maps API库现在不支持Fragments。

+0

但是这样做有一些技巧。问题是使用操作栏+标签+地图 – cesards

0

我使用显示/隐藏方法,以避免在MapActivity创建多个MapView类:

 
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

我已经解决了这个问题,改变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; 
} 

其中视图是一个查看的对象。