您的位置:首页 > 其它

Fragment的用法(2)

2016-03-12 08:18 330 查看
继我的上一篇博客: Fragment的用法(1)

可以看出,活动(Activity)和碎片(Fragment)都是建立在不同的类中,那么活动和碎片该怎么进行信息交流呢?例如,Fragment该怎么调用Activity类中的方法呢?

其实思路很简单,以上一篇博客的代码为基础,来实现活动与碎片之间的通信。

修改activity_main.xml文件,为之添加一个Button,用于调用FragmentFirst中的方法。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/main_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.fragmenttest.MainActivity" >

<Button
android:id="@+id/main_button"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="调用fragment_first的hint方法" />

</LinearLayout>


为fragment_ first.xml添加一个新的Button,用于调用activity_ main中的方法。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >

<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:text="这是第一个Fragment"
android:textSize="20dp" />

<Button
android:id="@+id/showAnotherFragment"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="跳转到另一个Fragment"
android:textSize="20dp" />

<Button
android:id="@+id/first_button"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="调用activity_main的hint方法" />

</LinearLayout>


分别为MainActivity和FragmentFirst增加一个hint(Context context)方法,用于弹出一个吐司证明方法被调用了。

public void hint(Context context) {
Toast.makeText(context, "MainActivity 的hint方法被调用", Toast.LENGTH_SHORT).show();
}


public void hint(Context context) {
Toast.makeText(context, "FragmentFirst 的hint方法被调用", Toast.LENGTH_SHORT).show();
}


然后,这里先来修改一处小地方。在上一篇博客中,在向MainActivity增添FragmentFirst时,我们调用的是以下方法

getFragmentManager().beginTransaction().add(R.id.main_layout, new FragmentFirst()).commit();


这里我们要调用add方法的另一个重载函数,为FragmentFirst实例指定一个标志”first_fragment”,方便之后获取FragmentFirst实例。

protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if(savedInstanceState==null) {
getFragmentManager().beginTransaction()
.add(R.id.main_layout, new  FragmentFirst(),"first_fragment")
.commit();
}
}


之后就要来思考如何从MainActivity当中调用FragmentFirst中的方法了。

其实,FragmentManager提供了一个类似于findViewById()的方法,用于获取Fragment实例。

在onCreate方法中增添如下代码:

findViewById(R.id.main_button).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
FragmentFirst first = (FragmentFirst) getFragmentManager().findFragmentByTag("first_fragment");
first.hint(MainActivity.this);
}
});


可以看到,findFragmentByTag(“first_ fragment”)中的”first_ fragment”即为之前指定的标志,通过它就获取到了FragmentFirst实例,并调用了hint方法。

运行程序,点击第一个按钮,就可以看到FragmentFirst中的hint方法被调用的提示了。



在FragmentFirst中调用MainActivity中的函数的方法类似。

在FragmentFirst中的onCreate方法增添如下代码:

@Override
public void onClick(View v) {
MainActivity main = (MainActivity) getActivity();
main.hint(getActivity());
}
});


通过getActivity()方法获取与当前Fragment关联的Activity,点击第三个按钮,就可以调用hint方法了。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: