TabHost中的MapActivity片段开关后消失

问题描述:

我试图在一组选项卡中使用片段显示地图。 我遇到的问题是地图活动消失,如果用户导航到另一个片段,然后回来。 如何在tabhost中的片段中显示MapActivity?TabHost中的MapActivity片段开关后消失

该算法的基础是围绕着如何与片段一MapActivity集成了许多问题(见MapView in a Fragment (Honeycomb)

MainTabActivity有tabhost并使用FragmentManager显示在标签片段。 MapFragment有一个tabhost,并用它来显示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> 

再次 - 我遇到的问题是地图活动消失,如果用户导航到另一个片段,然后回来。 如何在tabhost中的片段中显示MapActivity?

非常感谢。

+0

你最终解决了这个问题吗?我遇到了同样的问题... – Rockmaninoff 2012-03-09 16:39:19

片段我工作围绕这一问题作为的矢量以下...

我有一个班级变量:

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://*.com/a/8126287/447197 – tafty 2012-04-30 17:48:10

如果你在项目中使用ViewPager,呼吁setOffscreenPageLimit()它如下所示:

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

其中片段是你创建

+0

非常感谢!这让我对HOURS感到困惑,我终于找到了解决方案,即在几个开关后我的碎片消失的问题!非常感谢! – Ruuhkis 2012-08-14 16:19:07