草庐IT

android - 带有 fragment 和框架布局的布局被另一个 fragment 和框架布局替换

coder 2023-12-15 原文

编辑:

所以在下面的评论之后,我重新审视并意识到是什么让我陷入困境。

想象一下,我的客户列表和客户详细信息 Activity 由以下内容启动:

public class ClientsMainActivity extends FragmentActivity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //StudioTabOpenHelper db;
        setContentView(R.layout.main_client_activity);
    }
}

所以这很好用,启动我的 main_client_Activity(在下面的布局中定义,当我点击主屏幕上的按钮时我调用这个 Activity ):
Intent intent = new Intent(getActivity(), ClientsMainActivity.class);
startActivity(intent);

问题很简单,ClientsMainActivity不调用 OnCreateView 或任何东西,只是将布局设置为定义我的 Fragment 和我的 ListFragment 的布局。这很好,因为我不想将任何内容传递给 ClientsMainActivity ,但如果我有一个假设的 Activity ,例如:
SessionMainsActivity当他们点击客户端的 session 编辑时调用,那么我不会调用 SessionsMainActivity以相同的方式(启动仅设置为布局的 Activity ),我希望设置该布局,因为它定义了我的 fragment 如何拆分。但我也想将数据传递给它,然后传递给随后的 fragment (比如他们点击哪个 session 进行编辑/处理。

所以我想知道以上是否有道理,我确定这是一件简单的事情,我只是无法解决问题。我没有问题拨打 FragmentActivitie s 来自其他 fragment ,它们占据了整个屏幕,但它有效。所以我想最大的问题是 ClientsMainActivity来自我在网上找到的一些示例,该示例用于向您展示如何将多个 fragment 制作到屏幕上。让我得到所有的东西 FragmentActivity do 是将内容 View 设置为一个布局,它可以完成它看起来的所有工作,所以这就是为什么我不知道如何编码它来做同样的事情,但让我将值传递给布局定义的 fragment 等。 .

结束编辑

所以我在这里使用这个不错的小教程:

http://developer.android.com/guide/topics/fundamentals/fragments.html

它让我走了很长一段路,利用他们所说的主要 Activity 和 fragment_layout.xml,我在左边得到了一个不错的客户列表(这是一个 listfragment),在右边得到了一个细节 fragment 。

然后我添加了在客户端上编辑 session 信息(或编辑客户端详细信息)的功能,这两个都是全屏 fragment 。这很好用。

现在我决定我的 session 编辑 ui 最好再次将信息分成两个 Pane 。

这不像我想的那样工作,就像我说我有一个 main_Activity 在 onCreate 中执行此操作:
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main_client_activity);
}

main_client_activity.xml被定义为两种布局,但一种用于横向平板电脑的布局在这里:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
   android:orientation="horizontal"
   android:layout_width="match_parent"
   android:layout_height="match_parent">

   <fragment class="com.viciousbytes.studiotab.subactivities.ClientListView"
        android:id="@+id/client_list" android:layout_weight="1"
        android:layout_width="0px" android:layout_height="match_parent" />

   <FrameLayout android:id="@+id/client_details" android:layout_weight="1"
        android:layout_width="0px" android:layout_height="match_parent"
        android:background="?android:attr/detailsElementBackground"/>

</LinearLayout>

这一切都很棒!在这种情况下,我将其他所有内容都作为启动自己 fragment 的全屏 Activity 来处理:
EditSessionActivityEditClientActiivyt两者都使用 getSupportFragmentManager().beginTransaction 并且我可以从 .newInstance 调用中将信息传递给它。

我有我的 session_edit.xml用按钮、 TextView 等定义的布局……而且效果很好。这就是我在 SessionEdit 中加载的内容我的 EditSessionActivity“发射”了 fragment 但现在因为我想把它分开,我遇到了一个障碍。上面我定义了一个 client_list 和一个 client_details id,这些占位符在我的屏幕上吗?当我想用完全不同的 fragment 替换那里的内容时,我应该引用那些吗?

或者我是否构建另一个 fragment 布局,称为 fragment_session_layout 之类的东西,它定义了类似的东西:
<?xml version="1.0" encoding="utf-8"?>    
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:orientation="horizontal"
  android:layout_width="match_parent"
  android:layout_height="match_parent">

   <fragment class="com.viciousbytes.studiotab.subactivities.SessionEdit"
        android:id="@+id/session_edit" android:layout_weight="1"
        android:layout_width="0px" android:layout_height="match_parent" />

   <FrameLayout android:id="@+id/invoice_details" android:layout_weight="1"
        android:layout_width="0px" android:layout_height="match_parent"
        android:background="?android:attr/detailsElementBackground" />
</LinearLayout>

抱歉,我不知道在我所问的问题上该用什么标题来命名,基本上是如何两次获得两块 fragment 。在线演示展示了如何做一个(以及一个简单的 ListFragment )。

我已经完成了上述所有操作,但我无法弄清楚如何将我需要的数据传递到 fragment 中,我在 EditSessionActivity 中使用了它:
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    int clientID = getIntent().getIntExtra(THE_SELECTED_CLIENT, -1);            
    int sessionID = getIntent().getIntExtra(SELECTED_SESSION,-1);
    SessionEdit edits = SessionEdit.newInstance(this.getBaseContext(), false, clientID, sessionID);
    mUIListener = (OnUpdateUI)edits;
    getSupportFragmentManager().beginTransaction().add(android.R.id.content, edits).commit();
}

那行得通,但为了尝试坚持之前的 fragment 示例,我假设我的 EditSessionActivit你有点像制作另一个 MainActivity (因为它像主面板一样有两个面板)。所以我重新编码了 onCreateEditSessionActivity有了这个:
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);      
    setContentView(R.layout.edit_session_fullview);
}

在处理 onCreateView 的 EditSession fragment 中进行了战斗之后,我终于可以工作了,但无法传入数据,因为没有像以前的 onCreate 那样使用对象的实例化其中有 edits=SessionEdit.newInstance(...)
那么,做另一个有两个痛苦的 fragment 布局并在触发正确的操作时启动它是一种很好的做法。还是应该替换两个已经创建的 fragment ?来自我的 main_client_activity.xml不知何故?

最佳答案

我假设编辑客户端和编辑 session 是两个不同的 Activity 。当您从“编辑客户端”切换到“编辑 session ”模式时,“列表”和“详细信息” Pane 都会发生变化吗?

我会使用两个布局文件,而不是尝试重用相同的布局并在其中重新加载 fragment 。

如果您尝试重用相同的布局,则必须:

  • 更改 @+id/invoice_details类似于 @+id/right_pane .否则,将与 session 相关的内容加载到“invoice_details”占位符中会让人感到困惑。
  • 用另一个 FrameLayout 替换 fragment 定义并加载 ClientListViewSessionListView (或无论如何它被称为)在运行时 fragment 那里。

  • 在我看来,这比拥有另一个布局 xml 文件会增加更多的复杂性。

    所以
  • 获取适用于客户列表和客户详细信息的现有代码
  • 复制所有涉及的部分,并更改需要更改的内容,现在是 session 列表和 session 详细信息
  • 在容易做到的地方删除重复(常用功能属于实用程序类,常用布局元素包含在布局中)。将难以重复数据删除的内容保留原样。
  • 稍后重新评估,当您有更多 fragment 、更多布局和更多经验时。

  • 更新,关于两种不同的方法 fragment 可以嵌入 Activity

    正如 Android 文档所述,您可以通过两种主要方式让 fragment 显示在您的 Activity 中:
  • 在布局的 XML 文件中声明 fragment ( <fragment class=.... /> )
  • 放置占位符 FrameLayout在布局的 XML 文件中并在运行时加载 fragment

  • 当 fragment 不需要接收任何参数时,第一种方法很好。例如,如果检索单个且唯一的客户端列表的逻辑在 fragment 的代码中进行了硬编码。

    第二种方法允许您将参数传递给 fragment ,因此适用于“细节钻取”类型的 fragment 。

    从更新的问题我明白,
  • 每个客户端都有一个单独的 session 列表
  • 正在运行的组件是:EditSessionActivity承载两个 fragment ,一个用于显示 session 列表,另一个用于显示 session 详细信息

  • 如果这是正确的,那么您确实需要以编程方式加载两个 fragment ,因为两者都需要传递参数。所以你的布局会有两个 FrameLayout s。 EditSessionActivity将从 Intent 获取一些参数开始(“我们正在使用哪个 session 列表?”),并使用这些参数加载“ session 列表” fragment 。当用户选择该 fragment 中的列表项时,另一个 fragment 将加载 session 详细信息。

    关于android - 带有 fragment 和框架布局的布局被另一个 fragment 和框架布局替换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6767674/

    有关android - 带有 fragment 和框架布局的布局被另一个 fragment 和框架布局替换的更多相关文章

    1. ruby - 使用 Vim Rails,您可以创建一个新的迁移文件并一次性打开它吗? - 2

      使用带有Rails插件的vim,您可以创建一个迁移文件,然后一次性打开该文件吗?textmate也可以这样吗? 最佳答案 你可以使用rails.vim然后做类似的事情::Rgeneratemigratonadd_foo_to_bar插件将打开迁移生成的文件,这正是您想要的。我不能代表textmate。 关于ruby-使用VimRails,您可以创建一个新的迁移文件并一次性打开它吗?,我们在StackOverflow上找到一个类似的问题: https://sta

    2. ruby-on-rails - Rails - 一个 View 中的多个模型 - 2

      我需要从一个View访问多个模型。以前,我的links_controller仅用于提供以不同方式排序的链接资源。现在我想包括一个部分(我假设)显示按分数排序的顶级用户(@users=User.all.sort_by(&:score))我知道我可以将此代码插入每个链接操作并从View访问它,但这似乎不是“ruby方式”,我将需要在不久的将来访问更多模型。这可能会变得很脏,是否有针对这种情况的任何技术?注意事项:我认为我的应用程序正朝着单一格式和动态页面内容的方向发展,本质上是一个典型的网络应用程序。我知道before_filter但考虑到我希望应用程序进入的方向,这似乎很麻烦。最终从任何

    3. ruby-on-rails - 渲染另一个 Controller 的 View - 2

      我想要做的是有2个不同的Controller,client和test_client。客户端Controller已经构建,我想创建一个test_clientController,我可以使用它来玩弄客户端的UI并根据需要进行调整。我主要是想绕过我在客户端中内置的验证及其对加载数据的管理Controller的依赖。所以我希望test_clientController加载示例数据集,然后呈现客户端Controller的索引View,以便我可以调整客户端UI。就是这样。我在test_clients索引方法中试过这个:classTestClientdefindexrender:template=>

    4. ruby 正则表达式 - 如何替换字符串中匹配项的第 n 个实例 - 2

      在我的应用程序中,我需要能够找到所有数字子字符串,然后扫描每个子字符串,找到第一个匹配范围(例如5到15之间)的子字符串,并将该实例替换为另一个字符串“X”。我的测试字符串s="1foo100bar10gee1"我的初始模式是1个或多个数字的任何字符串,例如,re=Regexp.new(/\d+/)matches=s.scan(re)给出["1","100","10","1"]如果我想用“X”替换第N个匹配项,并且只替换第N个匹配项,我该怎么做?例如,如果我想替换第三个匹配项“10”(匹配项[2]),我不能只说s[matches[2]]="X"因为它做了两次替换“1fooX0barXg

    5. ruby-on-rails - 如果 Object::try 被发送到一个 nil 对象,为什么它会起作用? - 2

      如果您尝试在Ruby中的nil对象上调用方法,则会出现NoMethodError异常并显示消息:"undefinedmethod‘...’fornil:NilClass"然而,有一个tryRails中的方法,如果它被发送到一个nil对象,它只返回nil:require'rubygems'require'active_support/all'nil.try(:nonexisting_method)#noNoMethodErrorexceptionanymore那么try如何在内部工作以防止该异常? 最佳答案 像Ruby中的所有其他对象

    6. ruby - 为什么 SecureRandom.uuid 创建一个唯一的字符串? - 2

      关闭。这个问题需要detailsorclarity.它目前不接受答案。想改进这个问题吗?通过editingthispost添加细节并澄清问题.关闭8年前。Improvethisquestion为什么SecureRandom.uuid创建一个唯一的字符串?SecureRandom.uuid#=>"35cb4e30-54e1-49f9-b5ce-4134799eb2c0"SecureRandom.uuid方法创建的字符串从不重复?

    7. ruby-on-rails - 在 ruby​​ 中使用 gsub 函数替换单词 - 2

      我正在尝试用ruby​​中的gsub函数替换字符串中的某些单词,但有时效果很好,在某些情况下会出现此错误?这种格式有什么问题吗NoMethodError(undefinedmethod`gsub!'fornil:NilClass):模型.rbclassTest"replacethisID1",WAY=>"replacethisID2andID3",DELTA=>"replacethisID4"}end另一个模型.rbclassCheck 最佳答案 啊,我找到了!gsub!是一个非常奇怪的方法。首先,它替换了字符串,所以它实际上修改了

    8. ruby-on-rails - Rails - 从另一个模型中创建一个模型的实例 - 2

      我有一个正在构建的应用程序,我需要一个模型来创建另一个模型的实例。我希望每辆车都有4个轮胎。汽车模型classCar轮胎模型classTire但是,在make_tires内部有一个错误,如果我为Tire尝试它,则没有用于创建或新建的activerecord方法。当我检查轮胎时,它没有这些方法。我该如何补救?错误是这样的:未定义的方法'create'forActiveRecord::AttributeMethods::Serialization::Tire::Module我测试了两个环境:测试和开发,它们都因相同的错误而失败。 最佳答案

    9. ruby - 用 Ruby 编写一个简单的网络服务器 - 2

      我想在Ruby中创建一个用于开发目的的极其简单的Web服务器(不,不想使用现成的解决方案)。代码如下:#!/usr/bin/rubyrequire'socket'server=TCPServer.new('127.0.0.1',8080)whileconnection=server.acceptheaders=[]length=0whileline=connection.getsheaders想法是从命令行运行这个脚本,提供另一个脚本,它将在其标准输入上获取请求,并在其标准输出上返回完整的响应。到目前为止一切顺利,但事实证明这真的很脆弱,因为它在第二个请求上中断并出现错误:/usr/b

    10. ruby - 一个 YAML 对象可以引用另一个吗? - 2

      我想让一个yaml对象引用另一个,如下所示:intro:"Hello,dearuser."registration:$introThanksforregistering!new_message:$introYouhaveanewmessage!上面的语法只是它如何工作的一个例子(这也是它在thiscpanmodule中的工作方式。)我正在使用标准的ruby​​yaml解析器。这可能吗? 最佳答案 一些yaml对象确实引用了其他对象:irb>require'yaml'#=>trueirb>str="hello"#=>"hello"ir

    随机推荐