flash网站带后台,com域名查询,获取网站的路径,推广app接单网上一篇文章学到了碎片的创建与生命周期#xff0c;接下来学习碎片的常用操作#xff0c;其中会用到上一篇文章的三个碎片#xff0c;就做一个简单的说明吧#xff1a;LeftFragment#xff08;包含一个按钮#xff09;、RightFragment4#xff08;以粉色为背景的文本接下来学习碎片的常用操作其中会用到上一篇文章的三个碎片就做一个简单的说明吧LeftFragment包含一个按钮、RightFragment4以粉色为背景的文本并在这个碎片中写了所有的回调方法、AnotherRightFragment以紫色为背景的文本
FragementManager
每一个Activity都有一个Fragement Manager用来管理它所包含的Fragement在使用支持库的时候使用getSupport-FragmentManager方法来访问Fragement Manager
添加Fragement到Activity中
知识点部分
Fragment的添加
在上一篇当中提到动态地添加碎片使用是replace()方法但它其实是碎片的替换方法替换当前的 Fragment 为一个新的 Fragment。真正的添加方法为add()。在一个容器当中可以添加多个Fragment它们依次盖在上面类似于FrameLayout。
Fragment的查找
删除与替换的前提都是这个碎片先找到此时我们使用fragmentManager.findFragmentById(R.id.fcv)和fragmentManager.findFragmentByTag(hhh)根据这两个方法查找到最上面的一个如果没有则从BackStack里找并返回最先添加的一个如果没有返回null
Fragment的移除
fragmentTransaction.remove(fragment).commit()方法移除依次移除当前容器最上面的一个Fragment但只是将其从容器中移除backStack里仍然存在使用查找方法仍可以找到只不过它的状态是不可见的需要按下返回键才能彻底移除
Fragment的替换
fragmentTransaction.replace(R.id.fcv, LeftFragment.class, null)当没有addToBackStack会将容器上的所有碎片进行移除添加新的Fragment。此时BackStack里的Fragment仍然存在按下返回键依然会响应到BackStack即弹出BackStack里的Fragment此时我们看到的是替换的碎片但是看着好像什么都没有发生。
Fragment的显示与隐藏
show、hide只是把Fragment显示/隐藏Fragment的生命周期不发生变化相当于View的显示/隐藏
attach、detach把Fragment从容器中移除/装载Fragment的生命周期发生变化执行到onDestroyView其View被销毁但Fragment仍存在
体验
接下来就体验一下吧
首先我们创建一个新的活动其中我们在布局里面放入一个碎片容器以及各种操作的按钮布局文件代码
LinearLayout xmlns:androidhttp://schemas.android.com/apk/res/androidxmlns:apphttp://schemas.android.com/apk/res-autoxmlns:toolshttp://schemas.android.com/toolsandroid:idid/mainandroid:layout_widthmatch_parentandroid:layout_heightmatch_parentandroid:orientationverticaltools:context.FragmentAddandroidx.fragment.app.FragmentContainerViewandroid:layout_widthmatch_parentandroid:layout_heightwrap_contentandroid:layout_marginTop10dpandroid:idid/fcv/Buttonandroid:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:layout_gravitycenterandroid:idid/add1android:textadd1/Buttonandroid:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:layout_gravitycenterandroid:idid/add2android:textadd2/Buttonandroid:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:layout_gravitycenterandroid:idid/remove1android:textremove1/Buttonandroid:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:layout_gravitycenterandroid:idid/remove2android:textremove2/Buttonandroid:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:layout_gravitycenterandroid:idid/replaceandroid:textreplace/Buttonandroid:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:layout_gravitycenterandroid:idid/showandroid:textshow/Buttonandroid:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:layout_gravitycenterandroid:idid/hideandroid:texthide/Buttonandroid:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:layout_gravitycenterandroid:idid/attachandroid:textattach/Buttonandroid:idid/detachandroid:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:layout_gravitycenterandroid:textdetach //LinearLayout主要是在主活动里的代码
public class FragmentAdd extends AppCompatActivity {Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);EdgeToEdge.enable(this);setContentView(R.layout.activity_fragment_add);ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) - {Insets systemBars insets.getInsets(WindowInsetsCompat.Type.systemBars());v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);return insets;});Button buttonadd1 (Button) findViewById(R.id.add1);buttonadd1.setOnClickListener(new View.OnClickListener() {Overridepublic void onClick(View v) {addFragment1(FragmentAdd.this.getCurrentFocus());}});Button buttonadd2 (Button) findViewById(R.id.add2);buttonadd2.setOnClickListener(new View.OnClickListener() {Overridepublic void onClick(View v) {addFragment2(FragmentAdd.this.getCurrentFocus());}});Button buttonremove1 (Button) findViewById(R.id.remove1);buttonremove1.setOnClickListener(new View.OnClickListener() {Overridepublic void onClick(View v) {removefragment1(FragmentAdd.this.getCurrentFocus());}});Button buttonremove2 (Button) findViewById(R.id.remove2);buttonremove2.setOnClickListener(new View.OnClickListener() {Overridepublic void onClick(View v) {removefragment2(FragmentAdd.this.getCurrentFocus());}});Button buttonreplace (Button) findViewById(R.id.replace);buttonreplace.setOnClickListener(new View.OnClickListener() {Overridepublic void onClick(View v) {replacefragment(FragmentAdd.this.getCurrentFocus());}});Button buttonshow (Button) findViewById(R.id.show);buttonshow.setOnClickListener(new View.OnClickListener() {Overridepublic void onClick(View v) {showfragment(FragmentAdd.this.getCurrentFocus());}});Button buttonhide (Button) findViewById(R.id.hide);buttonhide.setOnClickListener(new View.OnClickListener() {Overridepublic void onClick(View v) {hidefragment(FragmentAdd.this.getCurrentFocus());}});Button buttonattach (Button) findViewById(R.id.attach);buttonattach.setOnClickListener(new View.OnClickListener() {Overridepublic void onClick(View v) {attachfragment(FragmentAdd.this.getCurrentFocus());}});Button buttondetach (Button) findViewById(R.id.detach);buttondetach.setOnClickListener(new View.OnClickListener() {Overridepublic void onClick(View v) {detachfragment(FragmentAdd.this.getCurrentFocus());}});}public void addFragment1 (View view) {FragmentManager fragmentManager getSupportFragmentManager();FragmentTransaction fragmentTransaction fragmentManager.beginTransaction();fragmentTransaction.add(R.id.fcv, RightFragment4.class, null, 添加碎片).addToBackStack(hhh).setReorderingAllowed(true).commit();}public void addFragment2 (View view) {FragmentManager fragmentManager getSupportFragmentManager();FragmentTransaction fragmentTransaction fragmentManager.beginTransaction();AnotherRightFragment anotherRightFragment new AnotherRightFragment();fragmentTransaction.add(R.id.fcv, anotherRightFragment).commit();}public void removefragment1 (View view) {FragmentManager fragmentManager getSupportFragmentManager();FragmentTransaction fragmentTransaction fragmentManager.beginTransaction();Fragment fragment fragmentManager.findFragmentById(R.id.fcv);Log.d(查找碎片, 查找的顶端碎片 fragment.toString());fragmentTransaction.remove(fragment).commit();}public void removefragment2 (View view) {FragmentManager fragmentManager getSupportFragmentManager();FragmentTransaction fragmentTransaction fragmentManager.beginTransaction();Fragment fragment fragmentManager.findFragmentByTag(添加碎片);Log.d(查找碎片, 根据Tag查早的碎片 fragment.toString());fragmentTransaction.remove(fragment).commit();}public void replacefragment(View view) {FragmentManager fragmentManager getSupportFragmentManager();FragmentTransaction fragmentTransaction fragmentManager.beginTransaction();fragmentTransaction.replace(R.id.fcv, LeftFragment.class, null).commit();}public void showfragment(View view) {FragmentManager fragmentManager getSupportFragmentManager();FragmentTransaction fragmentTransaction fragmentManager.beginTransaction();Fragment fragment fragmentManager.findFragmentById(R.id.fcv);if (fragment ! null) {fragmentTransaction.show(fragment).commit();}}public void hidefragment(View view) {FragmentManager fragmentManager getSupportFragmentManager();FragmentTransaction fragmentTransaction fragmentManager.beginTransaction();Fragment fragment fragmentManager.findFragmentById(R.id.fcv);if (fragment ! null) {fragmentTransaction.hide(fragment).commit();}}Fragment fragmenthh;public void attachfragment(View view) {FragmentManager fragmentManager getSupportFragmentManager();FragmentTransaction fragmentTransaction fragmentManager.beginTransaction();/*Fragment fragment fragmentManager.findFragmentById(R.id.fcv);*/if (fragmenthh ! null) {fragmentTransaction.attach(fragmenthh).commit();}}public void detachfragment(View view) {FragmentManager fragmentManager getSupportFragmentManager();FragmentTransaction fragmentTransaction fragmentManager.beginTransaction();fragmenthh fragmentManager.findFragmentById(R.id.fcv);if (fragmenthh ! null) {fragmentTransaction.detach(fragmenthh).commit();}}
}添加为所有的按钮注册了点击事件两种不同的添加方式第一种我们添加进去粉色底色的文本按下第二个按钮就会添加进去一个紫色的文本两种添加方式也不同第一个添加方式采用上一篇内容的模拟返回栈内容当你按下第一个按钮会看到这样的界面 此时按下add2按钮采用第二种方式添加碎片界面发生了变化 此时我们只能看到第二个碎片碎片的添加方式是叠加的此时查看到底有多少个碎片 就可以看到此时共有两个碎片在返回栈当中只有一个碎片因为只有第一个按钮是将添加的碎片也加入到返回栈当中此时按下Back按钮会看到页面没有发生任何的变化此时是将返回栈当中的第一个碎片取出来再次按下Back键就会退出这个活动。
思考一下如果我再次按下第一个按钮将第一个碎片再次加入到活动当中此时按下Back键会发生什么按多少次Back按钮才会退出这个活动呢
此时我们明白返回栈当中有两个粉色的碎片当第一次按下Back按钮最上面的粉色碎片就会从返回栈当中移除此时界面为紫色之后返回栈当中就只剩下一个碎片了与上面的情况一样。因此我们一共需要按3次Back按钮才会退出活动。
查找与删除我们依次添加四个碎片此时有两个进入了栈里面此时页面为紫色碎片的样子 此时按下第一个移除键删除的是活动顶部的碎片紫色碎片被移除页面为粉色的碎片查看日志的打印信息 可以看到删除的就是顶部的碎片此时按下remove2会页面没有发生变化但我们知道是因为有两个一样的碎片再次按下remove2会看到页面变回了紫色此时查看打印日志 再次按下remove1我们知道碎片已经移除完毕了此时页面没有任何的碎片再次按下删除键此时不会进行移除操作但会去返回栈寻找最底部即第一次添加的碎片。
替换重新运行程序添加几个碎片到活动当中此时查看含有的碎片
按下replace按钮被替换成了另一个含有按钮的碎片 此时查看有多少个碎片
此时可以看到活动内所有的碎片都被去除由新的碎片替代我们看到栈当中并未有任何的改变栈内只能由Back键进行操作此时活动只剩下这一个碎片。
显示与隐藏
在上篇文章中提到我们给RightFragment4添加了回调方法因此此处使用这个碎片此时按下hide按钮我们看到页面发生了变化由粉色变为了紫色此时打印日志并没有发生任何的变化。再次按下show按钮粉色显示出来了此时打印日志还是没有发生任何的变化。
接下来按下detach按钮页面与按下hide按钮的效果相同此时的打印日志 当我们attach()的时候这个碎片必须是已经创建好的但是未与活动创建联系我们这里将detach的碎片记录下来这个碎片经过detach()方法与活动解除了联系再调用attach()方法此时刚才的碎片又显示出来了
到这里就结束了