gpt4 book ai didi

android - 操作栏选项卡中的 MapFragment

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:26:04 28 4
gpt4 key购买 nike

我正在尝试构建一个将实现操作栏选项卡的应用程序。其中一个选项卡应包含一个 MapFragment。

如何实现带有选项卡的操作栏,其中一个选项卡下方是 map fragment ?

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

这是我目前所拥有的:

主类

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
}
}
}

fragment 类都只是返回一个带有 .xml 布局的充气器。

XML 布局:

main.xml( map 应该在这个 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 会报错:

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() 怎么样?它已被弃用。

最佳答案

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

创建一个实现操作栏功能的 Activity :

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

创建一个包含 map 的 fragment :

  1. 创建一个扩展 Fragment 的类以用作选项卡的 fragment 。阅读 [ 1 ] 以更好地理解 MapFragment。
  2. 创建一个包含 fragment 元素的布局 XML 文件(如 [ 1 ] 中所示)。使用该页面中的 XML 创建布局 XML 文件并在 fragment 类中使用它。
  3. 通过覆盖 onCreateView 在您的 fragment 类中扩充该布局 XML 文件。
  4. 您的应用现在应该在使用您的 fragment 类的选项卡中显示 map ,但是,切换到另一个选项卡并返回 map 选项卡将导致重复的 View ID。要克服这个问题,请继续下一步。
  5. 在您的 fragment 类中,覆盖以下方法以专门销毁底层 GoogleMap 对象,以便在 map 选项卡再次加载您的 fragment 类时可以重新创建它:

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

关于android - 操作栏选项卡中的 MapFragment,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14074625/

28 4 0