如果您通过XML而非编程方式来填充Fragment,则无法传递Bundle参数,但是可以通过XML将参数(或者更确切地说,属性)传递给Fragment。
这个过程类似于定义View自定义属性的方式。
除了Android Studio(目前)不会为此过程提供帮助。
假设这是您的Fragment使用参数的方式(我将使用Kotlin,但Java也完全可行):
class MyFragment: Fragment() {
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"/>
请注意 app:screen_name="@string/screen_a"
为了使其正常工作,只需在值文件(fragment_attrs.xml
或选择任何你想要的名称)中添加此内容:
<!
<attr name="screen_name" format="string|reference"/>
<!
<string name="screen_a" translatable="false">ScreenA</string>
<string name="screen_b" translatable="false">ScreeenB</string>
<!
<!
<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属性了 :)
限制:
- Android Studio(截至目前)无法在布局XML中自动完成此类参数
- 您只能传递可定义为Android属性的内容,而不能传递
Parcelable