FragmentMap + вкладка ActionBar
Я пытался вставить MapView
в ActionBar
Tab
, но я не смог решить проблему, даже погуглив.
Вот основная деятельность:
@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. Тогда ваш фрагмент может реализовать представление карты, получая его из основного действия.
Основная деятельность:
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();
}
Exchanger - это класс со статическим полем с отображением карты.
Я решил эту проблему, изменив метод 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;
}
где view - это объект View.
Google Maps API для Android не поддерживает фрагменты прямо сейчас.
Я использую методы show/hide, чтобы избежать создания нескольких MapView в MapActivity:
открытый класс TabFragment extends SherlockFragment { @Override public void onCreate (BundlevedInstanceState) { super.onCreate (savedInstanceState); ActionBar actionBar = getSherlockActivity (). GetSupportActionBar (); actionBar.setNavigationMode (ActionBar.NAVIGATION_MODE_TABS); actionBar.addTab (ActionBar.новая вкладка() .setText("Список") .setTabListener(новый TabListener (((FragmentActivity) getActivity ()), "listFragment", ListFragment.class))); actionBar.addTab (ActionBar.новая вкладка() .setText("Карта") .setTabListener(новый TabListener (((FragmentActivity) getActivity ()), "MapFragment", MapFragment.class))); } @Override Публичное представление onCreateView(вкладчик LayoutInflater, контейнер ViewGroup, BundlevedInstanceState) { return inflater.inflate(R.layout.tab_view, container, false); } открытый статический класс TabListener реализует ActionBar.TabListener { приватная финальная деятельность FragmentActivity; закрытый финальный строковый тег; закрытый финал Class clazz; закрытый финал Bundle args; частный фрагмент фрагмента; public TabListener (активность FragmentActivity, тег String, класс clz) { this(активность, тег, clz, ноль); } public TabListener (активность FragmentActivity, тег String, класс clz, аргументы Bundle) { this.acctivity = активность; this.tag = tag; this.clazz = clz; this.args = args; // Проверяем, есть ли у нас фрагмент для этой вкладки, возможно, из ранее сохраненного состояния. Если так, // скрываем, потому что наше начальное состояние - вкладка не отображается. фрагмент = activity.getSupportFragmentManager().findFragmentByTag(tag); if (фрагмент!= ноль &&! фрагмент.isHidden()) { FragmentTransaction ft = activity.getSupportFragmentManager(). BeginTransaction(); ft.hide(фрагмент); ft.commit (); } } @Override public void onTabSelected (вкладка Tab, FragmentTransaction ft) { if (фрагмент == ноль) { фрагмент = Fragment.instantiate(активность, clazz.getName(), аргументы); ft.add(R.id.container_fragment, фрагмент, тег); } еще { ft.show(фрагмент); } } @Override public void onTabUnselected (вкладка Tab, FragmentTransaction ft) { if (фрагмент!= ноль) { ft.hide(фрагмент); } } @Override public void onTabReselected (вкладка Tab, FragmentTransaction ft) { } } }