当前位置: 首页 > 知识库问答 >
问题:

如果我在 XML 布局中声明一个片段,如何向其传递捆绑包?

龚浩宕
2023-03-14

我有一个活动,我用一个片段替换了它。该活动采用了一个Intent,该Intent包含一些关于该活动应该显示的数据的额外信息。

既然我的活动只是一个完成同样工作的片段的包装器,那么如果我用XML的标签声明这个片段,我该如何把它捆绑到这个片段上呢?

如果我要使用FragmentTransact将片段放入ViewGroup,我将有机会在片段构造函数中传递此信息,但我想知道片段在XML中定义的情况。

共有3个答案

郭翰翮
2023-03-14

您不能传递Bundle(除非您以编程方式而不是通过XML膨胀您的片段),但您可以通过XML将参数(或者更确切地说是属性)传递给片段。

该过程类似于定义视图自定义属性的过程。除了AndroidStudio(目前)不协助你的过程中。

假设这是您使用参数的片段(我将使用 kotlin,但它在 Java 中也完全有效):

class MyFragment: Fragment() {

    // your fragment parameter, a string
    private var screenName: String? = null

    override fun onAttach(context: Context?) {
        super.onAttach(context)
        if (screenName == null) {
            screenName = arguments?.getString("screen_name")
        }
    }
}

你想做这样的事情:

<fragment
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/myFragment"
    android:name="com.example.MyFragment"
    app:screen_name="@string/screen_a"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"/>

请注意< code > app:screen _ name = " @ string/screen _ a "

要使它工作,只需将它添加到一个值文件中(< code>fragment_attrs.xml或选择您想要的任何名称):

<!-- define your attribute name and type -->
<attr name="screen_name" format="string|reference"/>

<!-- define a bunch of constants you wanna use -->
<string name="screen_a" translatable="false">ScreenA</string>
<string name="screen_b" translatable="false">ScreeenB</string>

<!-- now define which arguments your fragment is gonna have (can be more then one) -->
<!-- the convention is "FragmentClassName_MembersInjector" -->
<declare-styleable name="MyFragment_MembersInjector">
    <attr name="screen_name"/>
</declare-styleable>

几乎完成了,您只需要在片段中读取它,所以添加方法:

override fun onInflate(context: Context?, attrs: AttributeSet?, savedInstanceState: Bundle?) {
    super.onInflate(context, attrs, savedInstanceState)
    if (context != null && attrs != null && screenName == null) {
        val ta = context.obtainStyledAttributes(attrs, R.styleable.MyFragment_MembersInjector)
        if (ta.hasValue(R.styleable.MyFragment_MembersInjector_screen_name)) {
            screenName = ta.getString(R.styleable.MyFragment_MembersInjector_screen_name)
        }
        ta.recycle()
    }
}

瞧,片段中的XML属性:)

局限性:

    < li>Android Studio(截至目前)不在布局XML中自动完成此类参数 < li >您不能传递< code>Parcelable,而只能传递可以定义为Android属性的内容
姜胤
2023-03-14

这不是一种封装的方式,但是我最终从父活动中“拉出”了这个包:

Bundle bundle = getActivity().getIntent().getExtras();
东郭存
2023-03-14

既然我的活动只是一个完成同样工作的片段的包装器,那么如果我用XML的标签声明这个片段,我该如何把它捆绑到这个片段上呢?

你不能。

但是,欢迎您在< code>FragmentManager上调用< code>findFragmentById()来检索膨胀后的片段,然后在片段上调用一些方法来将数据与其相关联。虽然这显然不可能是< code>setArguments(),但是您的片段可以通过其他方式(< code > onSaveInstanceState()、< code > setRetainInstance(true)等)安排在配置更改后保留数据本身。).

 类似资料:
  • 问题内容: 我有一个被片段替换的活动。该活动采用了一个意图,该意图具有有关该活动应该显示哪些数据的一些额外信息。 现在,我的Activity只是一个Fragment的包装器,它可以完成相同的工作,如果我使用标记在XML中声明该片段,如何将其捆绑到Fragment上呢? 如果要使用FragmentTransaction将Fragment放入ViewGroup中,我将有机会在Fragment构造函数中

  • 问题内容: 我有以下代码: 如何编写第5行以及目标意图中的getExtra 问题答案: 你需要有实现的界面,你将需要实现的和合适的构造函数,一个作为参数。请参阅接口文档。 要将列表放入中,请使用: 要使列表脱离目标活动,请使用:

  • 在我的应用程序中,我有两个片段,分别是fragmentA和FragmentB。当我点击fragmetA中的按钮时,fragmentB中会打开一个列表。现在,当我从fragmentB中的列表中选择一个项目时,我希望将结果传递给fragmentA。我只对所有片段使用一个TabActivity。当列表项在fragmentB中被选中时,我将从堆栈中弹出fragmentB,以便直接返回fragmentA。

  • 问题内容: 我试图以与定义视图布局相同的方式在XML中定义片段的布局。 这可能吗?我尝试了几种方法,但似乎都没有用。 我的活动布局如下所示(main.xml): 现在,由于我不太喜欢通过原始Java代码生成布局,因此我尝试按以下方式定义片段(fragment_lommeregner.xml): 难道我做错了什么?如何通过XML定义片段的布局? 问题答案: 片段的工作原理与活动类似,因为您需要一个J

  • 有没有办法防止捆绑包被标记为“ACTIVE”,如果其 DS 组件之一无法初始化? 例如,如果我要实现<code>BundleActivator方法中抛出<code>BundleException 在我的方法中使用声明性服务,如果由于任何原因无法初始化,我可能会抛出异常。但我发现,这样做并不能阻止捆绑包被标记为“活动”。我还假设一个组件的故障不会阻止捆绑包中的其他组件变为活动组件? 例如,如果我有几

  • 我有两个活动,在活动1中有碎片,在活动2中有碎片 fragment1和fragment2扩展自FragmentActivity1,activity2扩展自AppCompatActivity 我想将字符串值从fragment1发送到fragment2,而不获取空值。我希望你能理解这个问题。谢谢

  • 我的屏幕上有一个按钮,我需要在单击按钮时传递布尔值。 在这里,当点击按钮时,它会启动一个片段并打开另一个屏幕,我只需要显示一个按钮。 同样,如果我从另一个片段导航,那么同一个按钮需要显示所有屏幕视图。 我可以沿着这个发送一个布尔值吗?它将如何在另一个片段中检索?