我一直在Fragment
's之间工作,使用FragmentManager
's在我的项目中保持导航抽屉的视图。
我想要的是从Fragment
a中获得一个字符串,并在Fragment
b上的TextView
上显示它,因为我不使用Intent
's,我不知道如何做到这一点。有人能帮帮我吗?
下面是我的一段代码,用来解释我如何在我的项目中更改视图。
Button button = (Button) view.findViewById(R.id.btn_next);
button.setOnClickListener(new View.OnClicklistener(){
@Override
public void onClick(View v){
Fragment frag_A = new ViewClassB();
FragmentManager fm = getSupportFragmentManager();
fm.beginTransaction()
.replace(R.id.container, frag_A)
.commit();
}
});
我有一个主类,有一个xml片段视图称为容器,有我显示活动的内容。
下面是该XML的一个示例:
<android.support.v4.widget.DrawerLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.ViewClassA"
>
<FrameLayout android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:background="#fff"
xmlns:android="http://schemas.android.com/apk/res/android">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceLarge"
android:text="Welcome"
android:id="@+id/text1"
android:layout_gravity="center"
android:layout_marginTop="20dp"
android:textColor="#52D5EC" />
</LinearLayout>
</FrameLayout>
</android.support.v4.widget.DrawerLayout>
这就是我在项目中显示内容的方式。在视图类B中,我只是做了一个onCreateView
来膨胀元素并使用它们。
再次,我需要的是传递一个字符串从Fragment A
到Fragment B
。我没有使用意图。
来自Fragment
文档:
通常你会希望一个片段与另一个片段通信,例如根据用户事件更改内容。所有片段到片段的通信都是通过相关的活动完成的。两个fragment不应该直接通信。
可以使用Bundle
将数据从一个Fragment传递到另一个Fragment:
MyFragment myFragment = new MyFragment();
Bundle args = new Bundle();
args.putString(<KEY>, <VALUE>);
myFragment.setArguments(args);
在接收端:
String value = getArguments().getString(<KEY>, <DEFAULT_VALUE>);
在片段之间共享内容的方式取决于您的偏好。有很多选项,所以选择一个你觉得更舒服的:
- 将字符串存储在包含片段的活动中。该活动将作为第一个片段的回调,因此当它发生变化时,它可以接收这个字符串。由于活动是在它们之间进行交换的活动,因此只需将值放在一个bundle中,以便为第二个片段提供第一个片段的字符串值。(对我来说,这不是最好的选择,但取决于你)
- 将字符串存储在第一个片段中,并提供一个getter以便activity可以获取它。当需要在片段之间交换时,只需获取第一个片段的值并将其提供给第二个片段。
- 如果这两个片段生活在一起(看起来在你的应用程序中不是这样),干净的选择是创建一个接口,由使用String的片段实现,并由提供String的片段使用。只需让一个片段通过这个接口认识另一个片段(而不是片段本身)。
现在,这里有一些代码。把一个bundle放到一个fragment上:
Bundle bundle = new Bundle();
bundle.putString("someString", stringValue);
fragment.putArguments(bundle);
要在fragment中获取这个bundle的值:fragment.getArguments().getString("someString");
要获得当前片段,是在您的容器使用方法FragmentManager#findFragmentById
或FragmentManager#findFragmentByTag