MapFragment in Action Bar Tabs

MapFragment in Action Bar Tabs

问题描述:

我正在尝试构建一个应用程序来实现Action Bar选项卡。其中一个选项卡应该包含一个MapFragment。MapFragment in Action Bar Tabs

如何使用选项卡实现一个操作栏,其中一个是地图片段?

你能帮我解决这个问题吗?

这是我到目前为止有:

主类

package com.nfc.demo; 

import android.app.ActionBar; 
import android.app.ActionBar.Tab; 
import android.app.Activity; 
import android.app.Fragment; 
import android.app.FragmentTransaction; 
import android.os.Bundle; 

public class NFCDemoActivity extends Activity { 

    Tab selectedTab = null; 

    public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    ActionBar bar = getActionBar(); 
    bar.setDisplayShowHomeEnabled(false); 
    bar.setDisplayShowTitleEnabled(false); 

    bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); 

    bar.setCustomView(R.layout.main); 

    ActionBar.Tab mapTab = bar.newTab().setText("Map"); 
    ActionBar.Tab settingsTab = bar.newTab().setText("Settings"); 
    ActionBar.Tab aboutTab = bar.newTab().setText("About"); 

    MapFragment mapFragment = new MapFragment(); 
    SettingsFragment settingsFragment = new SettingsFragment(); 
    AboutFragment aboutFragment = new AboutFragment(); 

    mapTab.setTabListener(new TabListener(mapFragment)); 
    settingsTab.setTabListener(new TabListener(settingsFragment)); 
    aboutTab.setTabListener(new TabListener(aboutFragment)); 

    Tab selectedTab = (Tab) getLastNonConfigurationInstance(); 

    if (selectedTab == null) { 
     bar.addTab(mapTab, false); 
     bar.addTab(settingsTab, false); 
     bar.addTab(aboutTab, true); 
    } 

    setContentView(R.layout.main); 

    } 

    public Object onRetainNonConfigurationInstance() { 
    return selectedTab; 
    } 

    protected boolean isRouteDisplayed() { 
     return false; 
    } 

    protected class TabListener implements ActionBar.TabListener { 
    private Fragment fragment; 

    public TabListener(Fragment fragment) { 
     this.fragment = fragment; 
    } 

    public void onTabSelected(Tab tab, FragmentTransaction fragmentTransaction) { 
     fragmentTransaction.replace(R.id.mainFragment, this.fragment, null); 
     selectedTab = tab; 
    } 

    public void onTabUnselected(Tab tab, FragmentTransaction fragmentTransaction) { 
     fragmentTransaction.remove(this.fragment); 
    } 

    public void onTabReselected(Tab tab, FragmentTransaction fragmentTransaction) { 
     //do nothing 
    } 
    } 
} 

片段类都只是使用.xml布局返回吹气。

XML布局:

main.xml中(图应该是在这个XML文件)

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:id="@+id/mainFragment" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="horizontal" > 

</LinearLayout> 

的settings.xml和about.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="horizontal" > 

    <TextView 
     android:id="@+id/textView123" 
     android:text="asdfg" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" /> 

</LinearLayout> 

我一直在努力弄清楚如何进行几天,但我真的很困惑。 任何帮助/提示将不胜感激。

另外,如何getLastNonConfigurationInstance()?它已被弃用。

+0

对不起,我想我的问题是:明确。我编辑它,但让我知道是否需要进一步改进。 – hermann

+0

那么,你的整体问题是很清楚的,但是你给我们提供了一堆代码,并没有解释代码的问题。将“MapFragment”放在操作栏选项卡中与将任何其他片段放入操作栏选项卡中没有区别。 – CommonsWare

+0

虽然我似乎无法弄清楚如何去做。一旦我改变了main.xml并添加了一个片段,我得到了由java.lang.IllegalArgumentException引起的错误膨胀类片段错误:二进制XML文件行#2:重复ID为0x7f040005,标记为null,或者父母标识为0x1020002与另一个fragment for com.google.android.gms.maps.MapFragment 12-28 21:14:07.991:E/AndroidRuntime(26189):\t at android.app.Activity.onCreateView(Activity.java:4722)' – hermann

在以下解决方案中,可以将GoogleMap添加到操作栏选项卡/下拉列表中。这样做的关键在于正确设置片段以在切换到操作栏中的另一个片段时销毁MapFragment。

创建一个实现了操作栏功能的活动:

  1. 在Eclipse中创建一个项目,使用标签的主要活动。如果您不这样做,请继续执行步骤2-5。
  2. 创建一个扩展为Activity的类并实现ActionBar.OnNavigationListener
  3. 创建一个布局XML文件,当您在它们之间切换时,它是您的选项卡片段的容器。
  4. 在Activity类中实现/覆盖以下方法:public boolean onNavigationItemSelected(int position, long id)
  5. 在此方法中,在position对象之间切换以确定选定的选项卡,并使用FragmentManager将片段设置为新实例,如下所示:getFragmentManager().beginTransaction().replace(R.id.container, fragment).commit()

创建包含地图片段:

  1. 创建扩展Fragment作为标签的片段用一个类。阅读[1]以更好地理解MapFragment。
  2. 创建一个包含片段元素的布局XML文件(如[1])所示。使用该页面中的XML创建布局XML文件并将其用于片段类中。
  3. 通过覆盖onCreateView来扩展片段类中的布局XML文件。
  4. 您的应用程序现在应该在使用您的片段类的选项卡中显示地图,但切换到另一个选项卡并返回到地图选项卡将导致重复的视图ID。要解决这个问题,请继续下一步。
  5. 在你的片段类,重写下面的方法来专门破坏底层的GoogleMap对象,以便它可以被重新创建时,地图标签加载再次您的片段类:

    @Override 
    public void onDestroyView() { 
     super.onDestroyView(); 
     MapFragment f = (MapFragment) getFragmentManager().findFragmentById(R.id.map); 
     if (f != null) 
      getFragmentManager().beginTransaction().remove(f).commit(); 
    } 
+0

谢谢! onDestroyView是我的代码需要:-) – sourcerebels

+1

现在我正在使用:if(f!= null && f.isResumed())或者在关闭我的应用程序时按下返回按钮时收到异常。 TY – sourcerebels

+1

这个工作,但如果我旋转我的屏幕,我的应用程序崩溃与此异常:导致:java.lang.IllegalStateException:不能执行此操作后onSaveInstanceState – jramoyo

不知道你是否已经解决它。 您必须添加谷歌播放服务作为库项目,使其工作。首先,我尝试添加jar文件,但那不起作用。

+0

如果谷歌播放服务设置不正确,您的地图无法加载。 –