MapFragment在操作栏标签(MapFragment in Action Bar Tabs)

2019-07-17 16:13发布

我想建立一个应用程序,将执行操作栏的选项卡。 有一个标签应包含MapFragment。

我怎样才能实现一个操作栏与标签,其中之一是一个地图碎片下?

你能帮助我如何与此继续?

这是我到目前为止有:

大类

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>

但加入MapFragment thows一个错误:

Error inflating class fragment 
error caused by java.lang.IllegalArgumentException: 
Binary XML file line #2: Duplicate id 0x7f040005, tag null, or parent id 0x1020002 with another fragment for com.google.android.gms.maps.MapFragment 12-28 21:14:07.991: E/AndroidRuntime(26189): at android.app.Activity.onCreateView(Activity.java:4722)

我一直在试图找出如何进行几天,但我真的很困惑。 任何帮助/提示将不胜感激。

另外,怎么样getLastNonConfigurationInstance() 它已被弃用。

Answer 1:

在下面的解决方案,它可以将一个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. 通过覆盖在充气的片段类布局XML文件onCreateView
  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();
    }


Answer 2:

不知道你是否已经解决与否。 你必须添加谷歌Play服务,因为库项目,使其工作。 首先,我尝试添加的jar文件,但没有奏效。



文章来源: MapFragment in Action Bar Tabs