2012-01-11 4 views
5

Я пытаюсь отобразить карту в наборе вкладок, используя фрагменты. Проблема, с которой я сталкиваюсь, - это действие карты исчезает, если пользователь переходит к другому фрагменту, а затем обратно. Как я могу отобразить MapActivity в фрагментах в tabhost?MapActivity в TabHost Фрагмент исчезает после переключения табуляции

Основой для этого является из многочисленных вопросов вокруг, как интегрировать MapActivity с фрагментами (см MapView in a Fragment (Honeycomb))

MainTabActivity имеет tabhost и использует FragmentManager для отображения фрагментов в закладках. MapFragment имеет табуст и использует его для отображения MapActivity.
MapFragment использует LocalActivityManager для распространения событий жизненного цикла на содержащуюся активность.

Так MapFragment:

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View view = inflater.inflate(R.layout.map_fragment, container, false); 
     mTabHost = (TabHost) view.findViewById(android.R.id.tabhost); 
     mTabHost.setup(getLocalActivityManager()); 
     Intent intent = new Intent(getActivity(), MapActivityWrapper.class); 
//  intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);//does nothing 
     TabHost.TabSpec tab = mTabHost.newTabSpec("map") 
       .setIndicator("map") 
       .setContent(intent); 
     mTabHost.addTab(tab); 
     return view; 
    } 

MapFragment расположение:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
       android:layout_width="fill_parent" 
       android:layout_height="fill_parent" 
       android:orientation="vertical"> 
    <TabHost xmlns:android="http://schemas.android.com/apk/res/android" 
      android:id="@android:id/tabhost" 
      android:layout_width="fill_parent" 
      android:layout_height="fill_parent"> 
     <LinearLayout android:orientation="vertical" 
       android:layout_width="fill_parent" 
       android:layout_height="fill_parent"> 
      <TabWidget android:id="@android:id/tabs" 
        android:visibility="gone" 
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content"/> 
      <FrameLayout android:id="@android:id/tabcontent" 
        android:layout_width="fill_parent" 
        android:layout_height="fill_parent"/> 
     </LinearLayout> 
    </TabHost> 
</LinearLayout> 

Код в MainTabActivity для изменения вкладки содержание:

private void updateTab(String oldId, String tabId) { 
    FragmentManager fm = getSupportFragmentManager(); 
    Fragment old = fm.findFragmentByTag(oldId); 
    Fragment selected = fm.findFragmentByTag(tabId); 
    FragmentTransaction ft = fm.beginTransaction(); 
    boolean added = false; 
    if (selected == null) { 
     selected = createFragment(tabId); 
    } else { 
     try { 
      ft.remove(selected); 
     } catch (Exception e) { 
      ft.add(android.R.id.tabcontent, selected, tabId); 
      added = true; 
      //exception for removing an unadded fragment... why throw an exception? 
     } 
    } 
    if (old != null) ft.remove(old); 
    if (!added) ft.replace(android.R.id.tabcontent, selected, tabId); 
    if (!creating && !backStackProcessing) ft.addToBackStack(null);//member vars 
    ft.commit(); 
} 

макет MainTabActivity (удален кучу несвязанных макета):

<TabHost xmlns:android="http://schemas.android.com/apk/res/android" 
     android:id="@android:id/tabhost" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:background="#EFEFEF"> 
    <RelativeLayout android:layout_width="fill_parent" 
      android:layout_height="fill_parent"> 
     <FrameLayout android:id="@android:id/tabcontent" 
       android:layout_gravity="top" 
       android:layout_width="fill_parent" 
       android:layout_height="wrap_content" 
       android:background="@color/app_default_bg" 
       android:layout_above="@+id/ad_region" 
       android:layout_below="@+id/quick_action_region"> 
      <FrameLayout android:id="@+id/tab1" 
        android:layout_width="fill_parent" 
        android:layout_height="fill_parent"/> 
      <FrameLayout android:id="@+id/tab2" 
        android:layout_width="fill_parent" 
        android:layout_height="fill_parent"/> 
      <FrameLayout android:id="@+id/map_tab" 
        android:layout_width="fill_parent" 
        android:layout_height="fill_parent"/> 
      <FrameLayout android:id="@+id/tab3" 
        android:layout_width="fill_parent" 
        android:layout_height="fill_parent"/> 
     </FrameLayout> 
     <TabWidget android:layout_width="fill_parent" 
        android:id="@android:id/tabs" 
        android:layout_height="wrap_content" 
        android:layout_alignParentBottom="true" 
        android:layout_alignParentLeft="true"/> 
    </RelativeLayout> 
</TabHost> 

Снова - Проблема, с которой я столкнулась, - это действие карты исчезает, если пользователь переходит к другому фрагменту, а затем обратно. Как я могу отобразить MapActivity в фрагментах в tabhost?

Большое спасибо.

+0

Вы решили решить эту проблему? Я столкнулся с той же проблемой ... – Rockmaninoff

ответ

5

Я работал вокруг этого вопроса, как следует ...

У меня была переменная уровня:

private View mMapViewContainer; 

Я создал таблицу, содержащую карту следующим образом (где MyMapActivity это отображается на вкладке MapActivity и mTabHost является TabHost) в методе onViewCreated моего фрагмента:

// Map tab 
Intent intent = new Intent(getActivity(), MyMapActivity.class); 
Window window = mLocalActivityManager.startActivity(MAP_ACTIVITY_TAG, intent); 
mMapViewContainer = window.getDecorView(); 
mMapViewContainer.setVisibility(View.VISIBLE); 
mMapViewContainer.setFocusableInTouchMode(true); 
((ViewGroup) mMapViewContainer).setDescendantFocusability(ViewGroup.FOCUS_AFTER_DESCENDANTS); 

View tab = getActivity().getLayoutInflater().inflate(R.layout.tab_background, null); 
((TextView) tab.findViewById(R.id.tv_tab_title)).setText(getResources().getString(R.string.map)); 
TabSpec tabSpec = mTabHost.newTabSpec(MAP_TAB_TAG).setIndicator(tab).setContent(new TabContentFactory() { 

    @Override 
    public View createTabContent(String tag) { 
     return mMapViewContainer; 
    } 
}); 
mTabHost.addTab(tabSpec); 

, а затем в фрагментах OnStop() метод я сделал следующее:

@Override 
public void onStop() { 
    super.onStop(); 

    ((ViewGroup) mMapViewContainer.getParent()).removeView(mMapViewContainer); 
} 

Теперь карта вновь отображается, когда пользователь переходит к другому фрагменту, а затем обратно.

+0

Кстати, код, который я использовал для создания моего mMapViewContainer, должен быть зачислен на @ChristopherK в потоке комментариев этого ответа: http://stackoverflow.com/a/8126287/447197 – tafty

3

Если вы использовали ViewPager в проекте, вызовите setOffscreenPageLimit() его, как показано ниже:

this.mViewPager.setOffscreenPageLimit(fragments.size());

где фрагменты является вектор фрагментов, которые вы создали

+0

Большое вам спасибо! Это вызывало меня за ЧАСЫ, и я наконец нашел решение проблемы, где мои фрагменты исчезали после нескольких переключателей! Спасибо большое! – Ruuhkis

Смежные вопросы