2011-11-16 8 views
5

MapViewActionBarTabに挿入しようとしましたが、グーグルでも問題を解決できませんでした。ここでフラグメントマップ+アクションバータブ

が主な活動です:

@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からライブラリであり、この1はそう、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を開始することです。次に、あなたのフラグメントは、主なアクティビティからそれを取得することによって、マップビューを実装することができます。

主な活動:

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の静的フィールドを持つクラスです。

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

ビュー:私はonCreateView方法を変更するこの問題を解決してきました

 
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) { 
     } 
    } 
} 
+0

しかし、どうやって交換機のmapView属性を宣言できますか? 私はExchangeクラスを一度も使用していません – cesards

+0

交換器は自分自身で作成したクラスです。静的フィールドがmMapViewだけのクラスです。 – Warpzit

+0

パーフェクト。はい、私は同じことをしました。シングルトン1 :-)そんなにありがとう! – cesards

1

GoogleのAndroid用Maps APIライブラリは、現在、フラグメントをサポートしていません。

+0

しかし、それを行うためのいくつかのトリックがあります。問題はアクションバー+タブ+マップを使用しています – cesards

0

私はMapActivityで複数のMapViewを作成しないように表示/非表示の方法を使用します表示オブジェクトです。