Android:使用 1 个活动的主/详细流程(双窗格)

2023-12-21

据报道安卓指南 http://developer.android.com/guide/practices/tablets-and-handsets.html, 双面板可以通过两种方式实现:

  1. 多个片段,one活动
  2. 多个片段,multiple活动

我正在使用第一个案例(Android指南只解释了第二种情况)。

这就是发生的事情7寸平板电脑:

  • 旋转从风景到肖像:仅重新创建单窗格片段
  • 旋转从肖像到风景:重新创建所有 3 个片段(单窗格、双窗格主、双窗格细节)

问题:为什么是单窗格片段(我以编程方式创建,但使用布局中定义的 FrameLayout 作为容器)在双窗格上重新创建?

我在下面报告我的实施情况:

/layout/activity_main.xml:

<FrameLayout
    android:id="@+id/single_pane"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

/layout-w900dp/activity_main.xml:

<LinearLayout
    android:id="@+id/dual_pane"
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <fragment class="com.example.MasterFragment"
        android:id="@+id/master_dual"
        android:tag="MASTER_FRAGMENT_DUAL_PANE"
        android:layout_width="@dimen/master_frag_width"
        android:layout_height="match_parent"/>
    <fragment class="com.example.DetailFragment"
        android:id="@+id/detail_dual"
        android:tag="DETAIL_FRAGMENT_DUAL_PANE"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</LinearLayout>

这是onCreate在主要活动中:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    mDualPane = findViewById(R.id.dual_pane)!=null;

    FragmentManager fm = getFragmentManager();
    if (savedInstanceState==null) {
        // this is a non-UI fragment I am using for data processing purposes
        fm.beginTransaction().add(new NonUiFragment(), DATA_FRAGMENT).commit();
    }
    if (!mDualPane && fm.findFragmentById(R.id.single_pane)==null) {
        fm.beginTransaction().add(R.id.single_pane, new MasterFragment(), MASTER_FRAGMENT_SINGLE_PANE).commit();
    }
}

我发现它是好多了在代码中添加同样适用于双窗格的片段。

因此,不要使用<fragment>,还可以使用<FrameLayout>也适用于双窗格 XML。

/layout-w900dp/activity_main.xml:

<LinearLayout
    android:id="@+id/dual_pane"
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <FrameLayout
        android:id="@+id/master_dual"
        android:layout_width="@dimen/master_frag_width"
        android:layout_height="match_parent"/>
    <FrameLayout
        android:id="@+id/detail_dual"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</LinearLayout>

通过这种方式,您可以使用just onemasterFragment 和 DetailFragment 的实例,因此您不会遇到同一片段有多个实例的问题。

为了做到这一点,在OnCreate您需要将片段添加到容器中,与旧容器分离:

    mDualPane = findViewById(R.id.dual_pane)!=null;

    if (savedInstanceState!=null) {
        mLastSinglePaneFragment = savedInstanceState.getString("lastSinglePaneFragment");
    }

    FragmentManager fm = getSupportFragmentManager();

    if (!mDualPane && fm.findFragmentById(R.id.single_pane)==null) {
        MasterFragment masterFragment = getDetatchedMasterFragment(false);
        fm.beginTransaction().add(R.id.single_pane, masterFragment, MASTER_FRAGMENT).commit();
        if (mLastSinglePaneFragment==DETAIL_FRAGMENT) {
            openSinglePaneDetailFragment();
        }
    }
    if (mDualPane && fm.findFragmentById(R.id.master_dual)==null) {
        MasterFragment masterFragment = getDetatchedMasterFragment(true);
        fm.beginTransaction().add(R.id.master_dual, masterFragment, MASTER_FRAGMENT).commit();
    }
    if (mDualPane && fm.findFragmentById(R.id.detail_dual)==null) {
        DetailFragment detailFragment = getDetatchedDetailFragment();
        fm.beginTransaction().add(R.id.detail_dual, detailFragment, DETAIL_FRAGMENT).commit();
    }

使用这些函数:

public static final String MASTER_FRAGMENT = "MASTER_FRAGMENT";
public static final String DETAIL_FRAGMENT = "DETAIL_FRAGMENT";

private MasterFragment getDetatchedMasterFragment(boolean popBackStack) {
    FragmentManager fm = getSupportFragmentManager();
    MasterFragment masterFragment = getSupportFragmentManager().findFragmentByTag(MASTER_FRAGMENT);
    if (masterFragment == null) {
        masterFragment = new MasterFragment();
    } else {
        if (popBackStack) {
            fm.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
        }
        fm.beginTransaction().remove(masterFragment).commit();
        fm.executePendingTransactions();
    }
    return masterFragment;
}

private DetailFragment getDetatchedDetailFragment() {
    FragmentManager fm = getSupportFragmentManager();
    DetailFragment detailFragment = getSupportFragmentManager().findFragmentByTag(DETAIL_FRAGMENT);
    if (detailFragment == null) {
        detailFragment = new DetailFragment();
    } else {
        fm.beginTransaction().remove(detailFragment).commit();
        fm.executePendingTransactions();
    }
    return detailFragment;
}

private void openSinglePaneDetailFragment() {
    FragmentManager fm = getSupportFragmentManager();
    fm.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
    DetailFragment detailFragment = getDetatchedDetailFragment();
    FragmentTransaction fragmentTransaction = fm.beginTransaction();
    fragmentTransaction.replace(R.id.single_pane, detailFragment, DETAIL_FRAGMENT);
    fragmentTransaction.addToBackStack(null);
    fragmentTransaction.commit();
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android:使用 1 个活动的主/详细流程(双窗格) 的相关文章

  • 单击应用程序的启动图标时会发生什么?

    单击应用程序的启动图标时会发生什么 是否总是发送新意图 或者结果有时与从最近的任务恢复任务相同 如果发送意图 它何时被发送到新活动实例的 onCreate 方法以及何时通过现有活动的 onNewIntent 进行路由 假设意图通过任务中现有
  • com.android.ddmlib.AdbCommandRejectedException:设备离线(即使设备已连接)

    将 Android Studio 更新到 2 1 2 后 当我进行更改时 我多次收到以下错误 com android ddmlib AdbCommandRejectedException 设备离线 安装 APK 时出错 问题是设备从未连接且
  • 无法实例化接收器 com.parse.GcmBroadcastReceiver

    我正在编写一个使用 GCM 通知和解析推送的离子应用程序 这个应用程序正在使用这些插件 com ionic keyboard 1 0 3 Keyboard com phonegap plugins PushPlugin 2 4 0 Push
  • Android 滚动视图无法以编程方式创建。

    我想在我的应用程序中使用滚动视图 我尝试将文本视图添加到滚动视图中 但除了滚动视图的背景颜色之外 我看不到任何渲染的内容 我是这样做的 public class MyView extends ViewGroup ScrollView myS
  • 对齐卡片视图中的项目

    我希望我的卡片如下所示 我保持这样的布局
  • 如何在默认浏览器或webview中打开按钮点击url

    我怎样才能打开一个网址webview或者点击按钮后在默认浏览器中 目前 当我单击btn1按钮 它提示我从手机中选择一个浏览器 我想在默认浏览器或其他浏览器中打开此网址webview 这是我的java代码 public class myact
  • 防止 FragmentPagerAdapter 中的 WebView 重新加载?

    我有一个 FragmentPagerAdapter 用于显示大约 6 个选项卡 所有选项卡都从 Web 服务器加载数据 其中一个选项卡包含一个从我的服务器加载图像的 WebView 生成图像的服务器端成本很高 因此我想减少重新加载 WebV
  • 屏幕滚动时 GridView 内的项目会重复

    我使用 GridView 来显示一组用户可以选择的类别 网格的每个项目都由一个 ImageView 和一个 TextView 组成 两者都是从服务器检索的 当触摸一个项目时 另一个活动就会启动 我以为一切都很顺利 直到我注意到当我滚动屏幕时
  • Android 中的垂直和水平滚动视图

    我真的很累了寻找垂直和水平滚动视图的解决方案 我读到框架中没有任何视图 布局实现此功能 但我需要这样的东西 我需要在其他布局中定义一个布局 子布局必须实现垂直 水平滚动才能移动 最初实现了一个逐像素移动布局的代码 但我认为这不是正确的方法
  • Android系统每个应用程序的通知限制

    这可能偏离主题 但我找不到任何相关内容 Android应用程序可以显示的通知数量有限制吗 我在收到 100 条通知后遇到问题 没有文件明确说明这一点 注意 显示 100 条通知并不是一个好主意 但由于某些原因这是必需的 In API23 包
  • 开始使用 Honeycomb 进行 Android 开发 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何通过子 POJO 的属性过滤复合 ManyToMany POJO?

    我有两个像这样的房间实体 Entity public class Teacher implements Serializable PrimaryKey autoGenerate true public int id ColumnInfo n
  • jQuery mobile - 仅在侧面板关闭时才允许滚动?

    我不希望用户在任何侧边栏打开时滚动 一旦关闭 他们应该滚动 我使用了下面的代码 但它不适用于 Android 移动设备 document bind panelopen function e data body css overflow hi
  • 如何在kotlin中使用Coroutine每秒调用一个函数

    我刚刚创建了一个应用程序 其中我的函数 getdata 每秒调用一次以从服务器获取新数据 而 updateui 函数将更新 UI 中的视图 我在我的应用程序中不使用任何异步任务或协程 我想这样做 请告诉我我怎样才能做到这一点 这是我的代码
  • mgwt - 以编程方式改变方向

    是否可以在 gwt mgwt 应用程序中更改强制执行特定的屏幕方向 可以说我希望用户始终以横向模式使用应用程序 这取决于 是作为phonegap应用程序 而不是在浏览器内部 如果您作为 Web 应用程序运行 则不需要t get any co
  • 在 Android Studio 4.0(Canary) 中找不到预览窗口在哪里

    我正在浏览有关在 Android Studio 4 0 Canary 中运行的 Jetpack 的教程 请参阅下面的链接文章 https developer android com jetpack compose tutorial http
  • 停止前台运行的服务的正确方法是什么

    我正在尝试停止作为前台服务运行的服务 当前的问题是当我打电话时stopService 通知仍然保留 因此 在我的解决方案中 我添加了一个接收器 我正在将其注册到onCreate 在 的里面onReceive 我调用的方法stopforegr
  • 读/写带有特殊字符的.txt文件

    I open Notepad Windows 并写 Some lines with special characters Special 并前往另存为 someFile txt 与Encoding set to UTF 8 在Java中我有
  • android 媒体播放器 - 如何禁用范围请求? (Nexus 7 上的音频流中断)

    我有一个音频流应用程序 它运行本地代理服务器 本地代理服务器与互联网流媒体源建立 http 连接 在本地获取并缓冲流数据 然后 在应用程序内部 我使用 MediaPlayer 连接到本地代理服务器 使用方法 mediaPlayer setD
  • Fragment 的 onSaveInstanceState() 永远不会被调用

    我试图将数据保存在片段的 onSaveInstanceState 中 但该方法从未被调用 有人可以帮忙吗 public class MyFragment extends Fragment Override public View onCre

随机推荐

  • 在 Flutter 中显示 SnackBar

    我想显示一个simple SnackBar颤振内部的有状态小部件 我的应用程序创建了新实例MaterialApp有一个名为的有状态小部件MyHomePage 我尝试展示SnackBar in showSnackBar 方法 但它失败了The
  • ADFS 2012 R2 是否支持 Auth2 资源所有者密码凭据流程

    我想确认ADFS支持oAuth 2 0完全支持所有流量oAuth 2 0 i e 三足oAuth 2 足 oAuth 隐式流 我问这个是因为我尝试使用资源所有者密码流 2 legged Oauth 这是我的代码 using HttpClie
  • 删除数据网格行 (WPF)

    应用程序的主窗口有数据网格 它是从数据库填充的 从数据表绑定数据网格 数据网格有 3 列
  • AWS Code Commit Slack 集成 - 显示作者和提交详细信息

    我刚刚设置了 AWS codecommit 的 Slack 集成 我只收到存储库名称和分支 另外我还想知道是谁做出了这个提交和提交消息 我确实尝试设置输入变压器规则 现在它显示了 Amazon EventBridge 中的两个角色 我在下面
  • jQuery UI 可排序在 iPAD 中不起作用

    我正在使用 jquery UI 可排序功能 这在浏览器中运行良好 但在 iPAD 等触摸设备中 它不起作用 下面是我正在使用的代码
  • 如何设置JTable中特定单元格的值?

    我只是想知道如何update specific cell in JTable 就像我想将单元格 1 1 设置为具有值Test Value 我的代码是这样的 但对我不起作用 String s Test Value tableName setV
  • 在 Blackberry 10 应用程序中禁用网络安全会产生什么影响?

    In 另一个问题 https stackoverflow com q 17419494 527559处理 blackberry10 中拒绝跨源 XHR 调用的错误 建议通过禁用网络安全来解决该问题 但禁用网络安全到底意味着什么 如果我使用这
  • 快速合并 AAsset-视频数组

    我想合并 AVAsset arrayVideos成一个视频并将其保存在相机胶卷中 Raywenderlich com 有一个很棒的tutorial https www raywenderlich com 94404 play record
  • Java 应用程序在用户闲置 10 分钟后导致屏幕显示无响应

    我编写了一个 Java 应用程序 允许用户编写鼠标 键盘输入脚本 JMacro http jmacro org 链接不重要 仅供好奇 我个人使用该应用程序在夜间睡觉时自动执行在线游戏中的角色动作 不幸的是 我早上总是回到电脑前 发现它没有反
  • Google 地图 iOS API 密钥不起作用

    我有一个简单的 iOS 应用程序 我正在其中集成 Google 地图 但是 当显示我的地图视图时 我提供的 API 密钥会导致出现以下几条错误消息 ClientParametersRequest failed 3 attempts rema
  • 在C++中设置本地环境变量

    如何在 C 中设置环境变量 他们不需要保留过去的程序执行 它们只需要在当前进程中可见 偏好与平台无关 但对于我的问题 只需要在 Win32 64 上工作 Thanks NAME putenv change or add an environ
  • 将多行合并为一行,多对多

    使用 SQL Server 我有以下表格 数据 CUS 访问 Cus ID Cus Vis ID 1 01 1 02 2 01 and CUS EVENT Cus Event ID Cus ID Cus Vis ID 001 1 01 00
  • 将巨大的 40000 页 pdf 拆分为单页,itextsharp,内存不足异常

    我收到了包含大量数据的巨大 PDF 文件 目前的 PDF 大小为 350 MB 大约有 40000 页 当然 如果能得到更小的 PDF 就好了 但这就是我现在必须处理的 我可以在 acrobat reader 中打开它 加载时会有一些延迟
  • jQuery 和伪元素

    我尝试动态更改 CSS 中定义的元素的位置 after 使用这个 function div after css top 20px 但这不起作用 有什么方法可以改变位置吗 你不能 内容创建者 after or before不是 DOM 的一部
  • 如何使用 docker-compose 而不是使用 docker 桥从 docker 容器连接到 localhost:9092

    我正在我的上运行 Kafka 服务器本地机器在端口 9092 上 我正在运行一项服务使用 docker compose 的 docker 容器需要向kafka服务器发送消息 我尝试使用 localhost 和 IP 在服务代码中编写我的生产
  • 如何生成表示 rrule 对象的人类可读字符串?

    我的应用程序允许用户定义对象的调度 并将它们存储为 rrule 我需要列出这些对象并显示类似 每日下午 4 30 的内容 有什么可用的东西可以 漂亮地格式化 rrule 实例吗 您只需提供一个 str 方法 每当需要将对象呈现为字符串时就会
  • SQLite 返回日期超过一周的记录

    我正在为图书库制作一个程序 在 sqlite 数据库中有一个图书表 其中包括该书上次取出的日期 我需要一个查询来显示过期的书籍 到目前为止我的代码如下 def findOverdueBooks event findRecords c exe
  • NuxtJS分布式静态页面生成

    有没有办法将静态页面生成过程拆分到多台机器上 我目前正在使用 NuxtJS 静态生成约 150k 页面 生成这些页面需要相当长的时间 约 1 小时 如果您已经在使用有效负载密钥 https nuxtjs org docs configura
  • 如何读取PHP中的注释块?

    我正在做一些自制的自动化文档 因为我有一个布局不是很标准的代码库 我想知道最好的方法是读取 PHP 文件并获取注释块的内容 我能想到的唯一方法是打开文件并逐行读取它 但我认为也许有一些内置的魔法可以为我解析文档 类似于反射函数 每个文件的基
  • Android:使用 1 个活动的主/详细流程(双窗格)

    据报道安卓指南 http developer android com guide practices tablets and handsets html 双面板可以通过两种方式实现 多个片段 one活动 多个片段 multiple活动 我正