FragmentMap + вкладка ActionBar

Я пытался вставить MapView в ActionBarTab, но я не смог решить проблему, даже погуглив.

Вот основная деятельность:

@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) {
        }
    }
}
Другие вопросы по тегам