Android子碎片如何销毁自己并回到父碎片活动的方法
2018-01-11 14:42
267 查看
本文首发于我的Hexo博客:https://likianta.coding.me/2018/android-abc/0111133714/
如图所示,Activity内嵌了Fragment,Fragment里面有内嵌了一个子Fragment。现在我们要在点击子碎片中的按钮后使子碎片销毁,并回到父碎片的活动中去。
废话不多说,先看效果图和最终要用到的代码:
在子碎片(ChildFrag.java)中:
在父碎片(ParentFrag.java)中调用“销毁”方法:
主活动是静态布局,所以更简单(这里我用的是v4库的fragment):
父碎片代码如下,点击按钮可装载子碎片,另外还写了一个
如图所示,Activity内嵌了Fragment,Fragment里面有内嵌了一个子Fragment。现在我们要在点击子碎片中的按钮后使子碎片销毁,并回到父碎片的活动中去。
废话不多说,先看效果图和最终要用到的代码:
在子碎片(ChildFrag.java)中:
Fragment fragment = ChildFrag.this.getParentFragment(); // getParentFragment() 是 Android 内置的方法 ParentFrag frag = (ParentFrag) fragment; // 注意一定要进行这个类型转化,使 fragment 泛型变为某个特定的父碎片 frag.finishMyChild(); // 这个方法是在父碎片中定义的,代码见下面
在父碎片(ParentFrag.java)中调用“销毁”方法:
public class ParentFrag extends Fragment { private Fragment child; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.frag_parent, container, false); child = new ChildFrag(); return view; } public void finishMyChild(){ FragmentManager manager = getChildFragmentManager(); FragmentTransaction transaction = manager.beginTransaction(); transaction.remove(child); transaction.commit(); } }
相关布局与代码
MainActivity & activity_main
主布局里面只装了一个父碎片,很简单:activity_main.xml
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout 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" tools:context="com.likianta.androidtest.MainActivity"> <fragment android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/frag_parent" android:name="com.likianta.androidtest.ParentFrag"/> </RelativeLayout>
主活动是静态布局,所以更简单(这里我用的是v4库的fragment):
MainActivity.java
package com.likianta.androidtest; import android.support.v4.app.FragmentActivity; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.view.ViewTreeObserver; import android.widget.Button; import android.widget.ImageView; import android.widget.TextView; public class MainActivity extends FragmentActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } }
ParentFrag & frag_parent
第一个文字view用于显示一串文字;第二个是FrameLayout,我们用它来作为待会儿盛装子碎片的容器;最后底部是一个Button,用于跳转到子碎片活动:frag_parent.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:id="@+id/parent_txt" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="I'm parent frag" android:textSize="32sp" /> <FrameLayout android:id="@+id/container" android:layout_width="match_parent" android:layout_height="300dp" android:layout_marginTop="40dp"> </FrameLayout> <Button android:id="@+id/parent_to_child" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:text="see my child" /> </RelativeLayout>
父碎片代码如下,点击按钮可装载子碎片,另外还写了一个
finishMyChild()方法,将会被用于销毁子碎片:
ParentFrag.java
package com.likianta.androidtest; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentTransaction; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.Button; import android.widget.TextView; /** * Created by Likianta_Dodoora on 2018/1/11 0011. */ public class ParentFrag extends Fragment { TextView txt; private Fragment child; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.frag_parent, container, false); Button button = (Button) view.findViewById(R.id.parent_to_child); txt = (TextView) view.findViewById(R.id.parent_txt); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { FragmentManager manager = getChildFragmentManager(); FragmentTransaction transaction = manager.beginTransaction(); child = new ChildFrag(); transaction.replace(R.id.container, child); transaction.commit(); } }); return view; } public void finishMyChild(){ FragmentManager manager = getChildFragmentManager(); FragmentTransaction transaction = manager.beginTransaction(); transaction.remove(child); transaction.commit(); } }
ChildFrag & frag_child
frag_child.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="300dp" android:layout_height="200dp" android:background="#dfdfdf"> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Hi, I'm child frag" android:textSize="28sp"/> <Button android:id="@+id/child_finish" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:text="finish myself" /> </RelativeLayout>
ChildFrag.java
package com.likianta.androidtest; import android.graphics.PointF; import android.os.Bundle; import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.Button; /** * Created by Likianta_Dodoora on 2018/1/11 0011. */ public class ChildFrag extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.frag_child, container, false); Button button = (Button) view.findViewById(R.id.child_finish); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Fragment fragment = ChildFrag.this.getParentFragment(); // getParentFragment() 是 Android 内置的方法,此方法可返回一个碎片 ParentFrag frag = (ParentFrag) fragment; // 注意一定要进行这个类型转化,使 fragment 泛型变为某个特定的父碎片 // 获得了父碎片实例后,不但可以引用父碎片的变量,还可以使用父碎片的方法: frag.txt.setText("I'm parent frag\nI'M COMING BACK."); //frag.txt.setTextColor(0xff123445); // 改变一下颜色,0x表示整型,ff表示不透明度100%,123445是颜色的十六进制数,一定要这样子写! frag.finishMyChild(); } }); return view; } }
参考
activity嵌套fragment,fragment内嵌fragment之间传值切换fragment - fanfan - CSDN博客 http://blog.csdn.net/zrf1335348191/article/details/51603617相关文章推荐
- 项目管理方法---基层项目经理如何激励自己的团队
- 安卓AndroidStudio如何在同一个手机中安装两个相同的项目+++++自己处理的一些问题解决方法
- 如何防止外界入侵自己的电脑方法二
- 安卓 碎片 如何实现类似 活动 栈的 进栈 出栈
- 如何在ViewController里调用app delegate里自己写的的方法或者系统的方法
- 如何将自己的实体类封装到一个list中,定义自己一系列的方法
- 关于如何在网页中添加自己的QQ客服方法
- dwz中保存数据后回调如何添加自己的回调方法
- STL容器如何正确调用自己的erase方法
- UNIX环境高级编程源代码配置----如何不用作者自己写的apue.h头文件的方法
- 如何知道自己的系统是32位的还是64位的图文方法
- gradle中如何在自己的.c文件中引用三方so的方法
- struts的ui标签,theme(主题)(如何去掉fielderror actionerror actionmessage前的小点,让其按自己要求显示的5种方法)
- Android引入第三方jar包的方法及如何将自己的代码封装成一个jar库
- 在一个活动中调用碎片里的方法,不知道哪里出错了
- Win7如何安装自己喜欢的字体有哪些方法
- [Android新手学习笔记04]-如何销毁一个活动
- 如何调用继承了httpservlet的类中自己写的方法
- 项目管理方法---基层项目经理如何激励自己的团队
- [搜片神器]winform程序自己如何更新自己的方法代码