操作栏选项卡中的 MapFragment

2023-11-25

我正在尝试构建一个将实现操作栏选项卡的应用程序。其中一个选项卡应包含 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
    }
  }
}

Fragment 类都只是返回一个带有 .xml 布局的 inflater。

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抛出一个错误:

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 添加到操作栏选项卡/下拉列表中。做到这一点的关键在于正确设置您的片段,以便在切换到操作栏中的另一个片段时销毁 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();
    }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

操作栏选项卡中的 MapFragment 的相关文章

随机推荐

  • 如何在 JavaScript 中获取两个日期之间的差异?

    我正在创建一个应用程序 它可以让您定义带有时间范围的事件 我想在用户选择或更改开始日期时自动填写结束日期 但是 我不太清楚如何获得两个时间之间的差异 以及如何使用该差异创建新的结束日期 在 JavaScript 中 可以通过调用将日期转换为
  • Font Awesome 未出现在 Internet Explorer 8 中

    我们最近开发了一个网站 其设计强烈依赖 Font Awesome 我们使用 before content 及其提供的 CSS 的标准实现 由于某些原因 Font Awesome 未在 IE8 中显示 我花了相当多的时间进行故障排除并尝试各种
  • jQuery:如何在元素显示时调用函数

    我想在 div 显示时 显示后 调用一个函数 有谁知道我该怎么做 我尝试使用类似的东西 someDiv bind show function alert example 但我不确定我是否以正确的方式做到这一点 或者是否可能实现这一点 有任何
  • Java 可以在运行时创建变量吗?

    例如 假设我想 提取 String fruits Pear Banana Apple 分成三个独立的变量 例如 for int i 0 i fruits length i of course there s no eval in Java
  • 如何在 Java 中表示一个范围?

    假设一个整数应该在以下范围内 0 2147483647 我想检查整数变量是否落在这个范围内 我知道它可以通过一个简单的 if else 语句来完成 但是有没有更有效的方法来检查它是否在范围内 我宁愿不这样做 if foo gt 0 foo
  • 用于正确对齐列的 Shell 脚本

    我有一个 3 列 制表符分隔的文件 例如 activity log manager Manager reserve rm hreserver rm log manager Manager mo apprv mgr1 Approving Ma
  • keras.load_model() 无法识别 Tensorflow 的激活函数

    我使用保存了 tf keras 模型tf keras save model功能 为什么tf keras load model抛出异常 代码示例 import tensorflow as tf from tensorflow import k
  • 页面上存在一个或多个错误

    收到 页面上存在一个或多个错误 但无法找到确切的错误 这是截图 Edit 1 我正在尝试上传尺寸为 1536 x 2048 像素的 iPad 屏幕截图 以获取最大高分辨率肖像 全屏 并锁定 但出现奇怪的错误 如下所示 注意 我尝试从 chr
  • 从 HTML
    到 Microsoft Word

    我有一个 HTMLfigure img and figcaption标签 我想将它们转换为 Microsoft Word 文档 所引用的图像img应该插入到Word文档中 并且figcaption应转换为其标题 也保留图号 我尝试用 Wor
  • 如何使用公钥加密字符串并使用私钥解密?

    我想用服务器上的密钥加密密码并在服务器端解密加密的密码 这是我在我的应用程序中使用的代码 To change this license header choose License Headers in Project Properties
  • 增加android模拟器的内存容量?

    如何增加Android模拟器的内存容量 我有一个 16MB 的二进制文件 我必须解析它 但是当我第二次执行时它说 Installation error INSTALL FAILED INSUFFICIENT STORAGE 有人可以帮忙吗
  • 我怎样才能在vim中快速输入像“==========”这样的行

    我正在编辑重组文本文件 我经常需要在一行中放置一些字符 例如 并且我希望该行的长度与前一行匹配 我应该如何在 vim 中执行此操作 a long long title Thanks 另一个可行的方法 yypv r
  • C# FileStream:写入大文件的最佳缓冲区大小?

    假设我正在将几个文件写入磁盘 大小在 2MB 到 5GB 之间 FileStream 的合理缓冲区值是多少 使用几兆字节的缓冲区大小是否明智 或者我应该坚持使用千字节缓冲区 默认缓冲区大小为 4 KiB 另外 请看这里 NET 的顺序文件编
  • NSWidgetExtensionContext openURL Swift

    我一直在尝试实现一个按钮来从其小部件打开我的 iOS 应用程序 我意识到这个问题已经在论坛上被打败了 但我找不到我收到的具体错误的解释 也许你们中一些更有经验的 iOS 开发人员可以对此做出一些解释 我正在使用 XCode 8 1 和 Sw
  • 如何定义类型参数不能为 Any 的 scala 方法

    在下面的示例中 我想定义一个contains无法编译的方法a and b不属于同一基本类型 In contains1暗示 如果a is Seq Int b 是String T导出为Any 并且它可以编译 这不是我想要的 In contain
  • Vim:通过 ssh 访问系统剪贴板 - Linux 到 OS X

    我是 Linux 用户 经常需要通过 SSH 在远程 OS X 服务器上工作 我更喜欢 vim neovim 编辑器 但我在通过 SSH 向系统剪贴板复制 粘贴时遇到问题 当我尝试复制行时 yy它保存在远程 OS X 剪贴板上 有没有办法将
  • 为什么需要使用 docker 将“pam_loginuid”设置为其“可选”值?

    为了运行 ssh 守护进程服务 pam loginuid必须将 etc pam d sshd 中的条目设置为可选 如官方示例适用于 Ubuntu 13 10 对于以前版本的 Ubuntu 此条目是可选的吗 它在 Ubuntu 13 10 之
  • 行尾有“^M”字符

    当我在 Unix 环境中运行特定的 SQL 脚本时 我在 SQL 脚本的每一行末尾看到一个 M 字符 因为它回显到命令行 我不知道 SQL 脚本最初是在哪个 SQL 脚本上创建的 造成这种情况的原因是什么以及如何解决 这是由 DOS Win
  • 如何用分隔符分割 pandas 列并选择首选元素作为替换

    我有以下熊猫数据框 import pandas as pd df pd DataFrame gene 1 foo blabla 2 bar lalala 3 qux trilil 4 woz hohoho cell1 5 9 1 7 cel
  • 操作栏选项卡中的 MapFragment

    我正在尝试构建一个将实现操作栏选项卡的应用程序 其中一个选项卡应包含 MapFragment 如何实现带有选项卡的操作栏 其中一个选项卡下有一个地图片段 你能帮我解决这个问题吗 这是我到目前为止所拥有的 主班 package com nfc