android 活动与碎片进行交互,Android应用界面开发07

本文详细介绍了Android中的Fragment,包括Fragment的生命周期、静态和动态添加方式,以及Fragment与Activity、Fragment之间的数据传递。讲解了如何通过Bundle传递数据,以及通过定义回调接口实现Fragment与Activity的交互。此外,还提及了Fragment之间的数据传递方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Android应用界面开发

第三章学习

第二部分

1.久闻大名的Fragment

Fragment(碎片),听名字就知道是一种零部件,确实,这是一种寄生于Activity(活动)之中的灵活型Activity,当然,只是种比喻。

b5dbd0e776be943b8569e56849eadeea.png

它拥有它自己有别于(也相似与)活动的生命周期,基本上onActivityCreate方法以及之前的,就跟活动的onCreate差不多,而onDestroyView以及之后的类似于活动的onDestroy。记不得的时候,重载这些方法,里面加个log就能明白其中的顺序,并不一定要背出来。

94913f36e5e9eaa86454ecba486803de.png

Fragment的子类(很少用)

对话框:DialogFragment

列表:ListFragment

选项设置:PreferenceFragment

WebView界面:WebViewFragment

静态添加碎片分为3步:

创建Fragment的xml布局文件

自定义Fragment的类,需继承自Fragment或者其子类,重载onCreateView方法,通过inflate.inflate方法将布局文件转化为View类的实例,将View实例返回

跟普通加载控件一样的方法,添加一个Fragment,将包含包名的Fragment自定义类填入android:name=”“属性中。public class Fragmentone extends Fragment {

@Override

public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {

View view = inflater.inflate(R.layout.fragment1, container,false);

return view;

}

}

android:name="com.jay.example.fragmentdemo.Fragmentone"

android:layout_width="match_parent"

android:layout_height="0dp"

android:layout_weight="1" />

聪明的你一定知道我在写哪步,此处的inflate与上一篇文章中所用的方法相比,增加了一个参数。

inflate( int resource, ViewGroup root, boolean attachToRoot)

int resource:布局文件ID

ViewGroup root:父视图,所有XXXLayout都继承自ViewGroup

boolean attachToRoot:属性,是否绑定在根视图上

基本上静态就是这种感觉啦,上下各一个Fragment

0debed96ea5ca43ceeddba97f7e77e96.png

动态添加碎片主要分为5步:

创建待添加的碎片实例。

获取到FragmentManager,在活动中可以直接调用getFragmentManager()方法得到。

开启一个事务,通过调用beginTransaction()方法开启。

向容器内加入碎片,一般使用replace()方法实现,需要传入容器的id和待添加的碎片实例。

提交事务,调用commit()方法来完成。getFragmentManager().beginTransaction().replace(R.id.LinearLayout1, f1).commit();

方法也是不难,唯一有疑惑的大概也就replace()参数问题:

replace(int containerViewId, Fragment fragment),关于第一个容器的id?

android:id="@+id/right_layout"

android:layout_width="0dp"

android:layout_height="match_parent"

android:layout_weight="1" >

android:name="com.example.fragmenttest.RightFragment"

android:layout_width="match_parent"

android:layout_height="match_parent" />

此处容器就是外面包的那层FrameLayout,如果想实现动态替换Fragment,那就给他包个Layout吧,so easy

其实活动与碎片间的交互也是不难的事

1a70665b4304e8885d9f55baba55ff2c.png

连同一个活动之间的Fragment进行交互也非常简单:

他们之间的数据传递

①Activit传递数据给Fragment:

在Activity中创建Bundle数据包,调用Fragment实例的setArguments(bundle) 从而将Bundle数据包传给Fragment,然后Fragment中调用getArguments获得 Bundle对象,然后进行解析就可以了

c35162d1bdd9840f33a171d7e49232d8.png

新建时给活动中的容器R.id.replace添加一个Fragment,并将数据通过Fragment中自定义的静态方法传递过去

c0055f4123a09c68d4d4a26bccafbf6f.png

返回了一个新建好的自定义Fragment,还带着参数。

252e696c3206c2a1ce428e2c9b85ea2d.png

要用的时候,调用getArguments().getString()方法取出其中对应类型的数据,比如做个点击替换效果,而替换的内容确实是活动传递过去的。

8726ed8fdf11a5a7ee68428f59eeaa8e.gif

②Fragment传递数据给Activity

在Fragment中定义一个内部回调接口,再让包含该Fragment的Activity实现该回调接口, Fragment就可以通过回调接口传数据了:

Step 1:定义一个回调接口:(Fragment中)/*接口*/

public interface CallBack{

/*定义一个获取信息的方法*/

public void getResult(String result);

}

Step 2:接口回调(Fragment中)/*接口回调*/

public void getData(CallBack callBack){

/*获取文本框的信息,当然你也可以传其他类型的参数,看需求咯*/

String msg = editText.getText().toString();

callBack.getResult(msg);

}

Step 3:使用接口回调方法读数据(Activity中)/* 使用接口回调的方法获取数据 */

leftFragment.getData(new CallBack() {

@Override

public void getResult(String result) { /*打印信息*/

Toast.makeText(MainActivity.this, "-->>" + result, 1).show();

}

});

总结下方法: ->在Fragment定义一个接口,接口中定义抽象方法,你要传什么类型的数据参数就设置为什么类型;

->接着还有写一个调用接口中的抽象方法,把要传递的数据传过去

->再接着就是Activity了,调用Fragment提供的那个方法,然后重写抽象方法的时候进行数据 的读取就可以了!!!

6cfe40d099468d081d8aaf8d68f51d04.gif

大致就是这种意思

③Fragment与Fragment之间的数据互传

其实这很简单,找到要接受数据的fragment对象,直接调用setArguments传数据进去就可以了 通常的话是replace时,即fragment跳转的时候传数据的,那么只需要在初始化要跳转的Fragment 后调用他的setArguments方法传入数据即可!

如果是两个Fragment需要即时传数据,而非跳转的话,就需要先在Activity获得f1传过来的数据, 再传到f2了,就是以Activity为媒介~

示例代码如下:FragmentManager fManager = getFragmentManager( );

FragmentTransaction fTransaction = fManager.beginTransaction();

Fragmentthree t1 = new Fragmentthree();

Fragmenttwo t2 = new Fragmenttwo();

Bundle bundle = new Bundle();

bundle.putString("key",id);

t2.setArguments(bundle);

fTransaction.add(R.id.fragmentRoot, t2, "~~~");

fTransaction.addToBackStack(t1);

fTransaction.commit();

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值