Java 碎片图+;操作栏选项卡

Java 碎片图+;操作栏选项卡,java,android,android-fragments,Java,Android,Android Fragments,我一直在尝试将地图视图插入操作栏选项卡,但我甚至在谷歌上都无法解决这个问题 以下是主要活动: @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //setContentView(R.layout.action_bar_tabs); FragmentManager fm = getSupportFragmentManager();

我一直在尝试将
地图视图
插入
操作栏
选项卡
,但我甚至在谷歌上都无法解决这个问题

以下是主要活动:

@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
扩展而来的,所以它应该可以工作

我得到的错误是下一个:

致命异常:main
E/AndroidRuntime(954):android.view.InflateException:二进制XML文件行#2:对类com.google.android.maps.MapView进行充气时出错
E/AndroidRuntime(954):位于android.view.LayoutInflater.createView(LayoutInflater.java:513)
E/AndroidRuntime(954):位于android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:565)


有人知道发生了什么吗?

谷歌的Android地图API库目前不支持片段。

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

主要活动:

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

Exchange是一个静态字段中包含mapview的类。

我使用show/hide方法避免在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) { } } } 公共类TabFragment扩展了SherlockFragment{ @凌驾 创建时的公共void(Bundle savedInstanceState){ super.onCreate(savedInstanceState); ActionBar ActionBar=getSherlockActivity().getSupportActionBar(); actionBar.setNavigationMode(actionBar.NAVIGATION\u MODE\u选项卡); actionBar.addTab(actionBar .newTab() .setText(“列表”) .SetTableListener( 新的TabListener(((FragmentActivity)getActivity(),“listFragment”,listFragment.class)); actionBar.addTab(actionBar .newTab() .setText(“地图”) .SetTableListener( 新的TabListener(((FragmentActivity)getActivity(),“MapFragment”,MapFragment.class)); } @凌驾 CreateView上的公共视图(布局、充气机、视图组容器、捆绑包保存状态){ 返回充气机。充气(R.layout.tab_视图,容器,错误); } 公共静态类TablListener实现ActionBar.TablListener{ 私人最终碎片活动; 私有最终字符串标签; 私人期末班; 私有最终包args; 私有片段; 公共TabListener(FragmentActivity活动、字符串标记、类clz){ 这(活动、标记、clz、null); } 公共TabListener(FragmentActivity活动、字符串标记、类clz、捆绑参数){ 这个。活动=活动; this.tag=tag; this.clazz=clz; this.args=args; //检查此选项卡是否已有片段,可能来自以前保存的状态。如果是, //隐藏它,因为我们的初始状态是不显示选项卡。 fragment=activity.getSupportFragmentManager().findFragmentByTag(标记); if(fragment!=null&!fragment.ishiden()){ FragmentTransaction ft=activity.getSupportFragmentManager().beginTransaction(); 皮(碎片); ft.commit(); } } @凌驾 已选择的公共事务(选项卡,碎片事务ft){ if(片段==null){ fragment=fragment.instantiate(活动,clazz.getName(),args); ft.add(R.id.container_碎片、碎片、标签); }否则{ ft.show(片段); } } @凌驾 已选择公共空页(选项卡,碎片事务ft){ if(片段!=null){ 皮(碎片); } } @凌驾 已重新选择公共无效页签(页签,碎片事务){ } } }
我已通过更改onCreateView方法解决了此问题:


其中视图是视图对象。

但是有一些技巧可以做到这一点。问题是使用操作栏+选项卡+映射,但如何声明交换器的mapView属性??我从未使用过Exchange类交换器,它只是我自己创建的一个类,只有一个静态字段是mMapView.Perfect。是的,我也这么做了。单身汉:-)非常感谢你!为什么不在MainActivity中使用静态字段呢?要跳过对交换器类的需要?:)这样就行了,我只使用交换器来避免不必要地引用主活动。
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    if (view == null) {
        view = inflater.inflate(R.layout.fragment_geo, container, false);
    }
    return view;
}