详解Android studio 动态fragment的用法
fragment的使用时android的基础,它有两种用法,第一个就是静态的fragment。第二个则是动态的fragment。
静态fragment直接在layout创建你想要的fragment的xml的文件,然后在你的java包里面创建对应fragment的class文件
布局代码如下所示
<?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:text="欢迎来到广西!"/> </linearlayout>
<?xml version="1.0" encoding="utf-8"?> <linearlayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context=".mainactivity"> <button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="去广西" android:id="@+id/bt_anjian1"/> <button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="去广东" android:id="@+id/bt_anjian2"/> <linearlayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" android:id="@+id/ll_rongqi" android:layout_weight="9"> </linearlayout> <fragment android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/fragment_1"/> </linearlayout>
*这里需要注意一下,如果你不给fragment加个id,那你运行app的时候将会发生闪退现象。
package com.example.anyone_fragment_2; import android.os.bundle; import android.view.layoutinflater; import android.view.view; import android.view.viewgroup; import android.widget.button; import androidx.annotation.nonnull; import androidx.annotation.nullable; import androidx.fragment.app.fragment; public class fragment_1 extends fragment { @nullable @override public view oncreateview(@nonnull layoutinflater inflater, @nullable viewgroup container, @nullable bundle savedinstancestate) { view view=inflater.inflate(r.layout.fragment_1,container,false); return view; } }
这样静态fragment算是弄好了,但是这次我们主要讨论动态fragment的用法
首先,我们先在activity_main中写下如下代码
<?xml version="1.0" encoding="utf-8"?> <linearlayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context=".mainactivity"> <button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="去广西" android:id="@+id/bt_anjian1"/> <button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="去广东" android:id="@+id/bt_anjian2"/> <linearlayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" android:id="@+id/ll_rongqi" android:layout_weight="9"> </linearlayout> </linearlayout>
布局效果图是这样的
这里fragment的xml文件和开头所说的静态fragment的那个xml文件的写法是一样的
同理,fragment对应的class文件也是相同的。
package com.example.anyone_fragment_2; import androidx.appcompat.app.appcompatactivity; import androidx.fragment.app.fragment; import androidx.fragment.app.fragmentmanager; import androidx.fragment.app.fragmenttransaction; import android.os.bundle; import android.view.view; import android.widget.button; public class mainactivity extends appcompatactivity implements view.onclicklistener {//有abstract就闪退 private button bt_anjian1,bt_anjian2; private fragment fragment_1,fragmentnow,fragment_2; private fragmentmanager fragmentmanager; private fragmenttransaction fragmenttransaction; @override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_main); chushihua(); shilihua(); } private void chushihua() { bt_anjian1=findviewbyid(r.id.bt_anjian1); bt_anjian2=findviewbyid(r.id.bt_anjian2); bt_anjian1.setonclicklistener(this); bt_anjian2.setonclicklistener(this); } private void shilihua(){ //用于实例化fragment fragment_1=new fragment_1(); fragment_2=new fragment_2(); fragmentnow=fragment_1; fragmentmanager=getsupportfragmentmanager(); fragmenttransaction=fragmentmanager.begintransaction(); //38:只要你要对fragment进行操作就少不了这句 原来的写法是fragmenttransaction fragmenttransaction=fragmentmanager.begintransaction(); fragmenttransaction.add(r.id.ll_rongqi,fragment_1).commit(); } public void onclick(view vv) { fragmenttransaction=fragmentmanager.begintransaction(); switch (vv.getid()) { case r.id.bt_anjian1:if (fragment_1.isadded()) { fragmenttransaction.hide(fragmentnow).show(fragment_1).commit(); } else { fragmenttransaction.hide(fragmentnow).add(r.id.ll_rongqi,fragment_1).commit(); } fragmentnow=fragment_1; break; case r.id.bt_anjian2:if(fragment_2.isadded()) { fragmenttransaction.hide(fragmentnow).show(fragment_2).commit(); } else { fragmenttransaction.hide(fragmentnow).add(r.id.ll_rongqi,fragment_2).commit(); } fragmentnow=fragment_2; break; } } }
下面来分析一些地方
初始化功能函数
private void chushihua() { bt_anjian1=findviewbyid(r.id.bt_anjian1); bt_anjian2=findviewbyid(r.id.bt_anjian2); bt_anjian1.setonclicklistener(this); bt_anjian2.setonclicklistener(this); }
这样写的目的是让代码可读性更好,不至于很混乱。
其次就是实例化我们所写的fragment功能函数
private void shilihua(){ //用于实例化fragment fragment_1=new fragment_1(); fragment_2=new fragment_2(); fragmentnow=fragment_1; fragmentmanager=getsupportfragmentmanager(); fragmenttransaction=fragmentmanager.begintransaction(); //38:只要你要对fragment进行操作就少不了这句 原来的写法是fragmenttransaction fragmenttransaction=fragmentmanager.begintransaction(); fragmenttransaction.add(r.id.ll_rongqi,fragment_1).commit(); }
其中的
fragmentmanager fragmentmanager;
这个是fragment和activity交互所要用到的。
fragmentmanager=getsupportfragmentmanager();
固定写法。
而
private fragmenttransaction fragmenttransaction; fragmenttransaction=fragmentmanager.begintransaction();
是调动fragment操作的api,也必不可少。
fragmenttransaction.add(r.id.ll_rongqi,fragment_1).commit();
是添加fragment所用的语句,在这里就相当于是初始化吧。add(容器id,碎片对象),commit则是提交。
public void onclick(view vv) { fragmenttransaction=fragmentmanager.begintransaction(); switch (vv.getid()) { case r.id.bt_anjian1:if (fragment_1.isadded()) { fragmenttransaction.hide(fragmentnow).show(fragment_1).commit(); } else { fragmenttransaction.hide(fragmentnow).add(r.id.ll_rongqi,fragment_1).commit(); } fragmentnow=fragment_1; break; case r.id.bt_anjian2:if(fragment_2.isadded()) { fragmenttransaction.hide(fragmentnow).show(fragment_2).commit(); } else { fragmenttransaction.hide(fragmentnow).add(r.id.ll_rongqi,fragment_2).commit(); } fragmentnow=fragment_2; break; } }
这里的onclick的名字是不能改变的,否则你button没办法触发。
用传来的形参view vv来获取到我们所点击的按钮来判断操作。
思想就是,如果fragment存在,则只需要把它展示出来即可。isadded嘛,ed过去式,那就是代表存在过咯。
若是没有,则添加就好。
好了,就到这吧,有错误的话希望能指出来,大家一起共同进步!
到此这篇关于详解android studio 动态fragment的用法的文章就介绍到这了,更多相关android studio fragment用法内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!
推荐阅读
-
详解Android Studio3.5及使用AndroidX的一些坑
-
Android Studio将程序打包成APK的步骤详解
-
详解Android activity与fragment之间的通信交互
-
详解Android Studio 3.0的新特性与适配
-
详解Android 在 ViewPager 中使用 Fragment 的懒加载
-
详解Android TableLayout中stretchColumns、shrinkColumns的用法
-
Android中TelephonyManager类的用法案例详解
-
详解Dagger2在Android开发中的新用法
-
Android中Fragment的加载方式与数据通信详解
-
关于Android 6.0权限的动态适配详解