久闻大名的Fragment
#Android应用界面开发
第三章学习
####第二部分####
####1.久闻大名的Fragment####
Fragment(碎片),听名字就知道是一种零部件,确实,这是一种寄生于Activity(活动)之中的灵活型Activity,当然,只是种比喻。
它拥有它自己有别于(也相似与)活动的生命周期,基本上onActivityCreate方法以及之前的,就跟活动的onCreate差不多,而onDestroyView以及之后的类似于活动的onDestroy。记不得的时候,重载这些方法,里面加个log就能明白其中的顺序,并不一定要背出来。
Fragment的子类(很少用)
对话框:DialogFragment
列表:ListFragment
选项设置:PreferenceFragment
WebView界面:WebViewFragment
静态添加碎片分为3步:
- 创建Fragment的xml布局文件
- 自定义Fragment的类,需继承自Fragment或者其子类,重载onCreateView方法,通过inflate.inflate方法将布局文件转化为View类的实例,将View实例返回
- 跟普通加载控件一样的方法,添加一个Fragment,将包含包名的Fragment自定义类填入android:name=""属性中。
fragment_one.xml
<RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"></RelativeLayout>
复制代码
FragmentOne.java
public class FragmentOne extends Fragment {@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {View view = inflater.inflate(R.layout.fragment_one, container,false);return view;}
}
复制代码
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:id="@+id/activity_main"android:layout_width="match_parent"android:layout_height="match_parent"><fragmentandroid:id="@+id/fragment1"android:name="com.einsteinford.fragmentdemo.FragmentOne"android:layout_width="match_parent"android:layout_height="0dp"android:layout_weight="1"/></RelativeLayout>
复制代码
此处的inflate与上一篇文章中所用的方法相比,增加了一个参数。
inflate( int resource, ViewGroup root, boolean attachToRoot)
- int resource:布局文件ID
- ViewGroup root:父视图,所有XXXLayout都继承自ViewGroup
- boolean attachToRoot:属性,是否绑定在根视图上
基本上静态就是这种感觉啦,上下各一个Fragment
动态添加碎片主要分为5步:
- 创建待添加的碎片实例。
- 获取到FragmentManager,在活动中可以直接调用getFragmentManager()方法得到。
- 开启一个事务,通过调用beginTransaction()方法开启。
- 向容器内加入碎片,一般使用replace()方法实现,需要传入容器的id和待添加的碎片实例。
- 提交事务,调用commit()方法来完成。
getFragmentManager().beginTransaction().replace(R.id.LinearLayout1, f1).commit();
复制代码
方法也是不难,唯一有疑惑的大概也就replace()参数问题: replace(int containerViewId, Fragment fragment),关于第一个容器的id?
<FrameLayout
android:id="@+id/right_layout"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1" ><fragmentandroid:id="@+id/right_fragment"android:name="com.example.fragmenttest.RightFragment"android:layout_width="match_parent"android:layout_height="match_parent" /></FrameLayout>
复制代码
此处容器就是外面包的那层FrameLayout,如果想实现动态替换Fragment,那就给他包个Layout吧,so easy
其实活动与碎片间的交互也是不难的事
连同一个活动之间的Fragment进行交互也非常简单:
###他们之间的数据传递
①Activit传递数据给Fragment: 在Activity中创建Bundle数据包,调用Fragment实例的setArguments(bundle) 从而将Bundle数据包传给Fragment,然后Fragment中调用getArguments获得 Bundle对象,然后进行解析就可以了
新建时给活动中的容器R.id.replace添加一个Fragment,并将数据通过Fragment中自定义的静态方法传递过去 返回了一个新建好的自定义Fragment,还带着参数。 要用的时候,调用getArguments().getString()方法取出其中对应类型的数据,比如做个点击替换效果,而替换的内容确实是活动传递过去的。
②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提供的那个方法,然后重写抽象方法的时候进行数据 的读取就可以了!!!
大致就是这种意思
- ③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();
复制代码
转载于:https://juejin.im/post/5a5c5de7518825734859ee9e
久闻大名的Fragment相关推荐
- Fragment之间传递数据的方式
1.直接调用另一个Fragent对象的方法,两个Fragment之间高度耦合 2.采取接口回调的方式进行数据传递.即在一个fragment中创建一接口以及接口对应的set方法,在另一个fagment中 ...
- Android Fragment 调用宿主Activity 里面的方法
方法 1 : 直接在Fragment 写 MainActivity main = (MainActivity) getActivity();main.xx; // xx 是 MainActivity ...
- java.lang.IllegalArgumentException: No view found for id 0x7f07005f (xx) for for fragment xxFragment
问题的原因的是自己修改id 的时候弄错了修改下id 就好了 我的是用activity 加载fragment 使用的地方如下 ,确定下面的id 是否在布局中 transaction.add(R.id.c ...
- overridePendingTransition 方法在Fragment 中使用
overridePendingTransition 方法在直接卸载Fragment 中无法识别 这个使用可以在前面添加getActivity 即可使用了 getActivity().override ...
- Fragment 使用 replace 的方式实现切换 以及切换的时候Fragment 生命周期
这个主要代码在activity里面 如下 public class ReplaceActivity extends AppCompatActivity implements View.OnClickL ...
- Fragment 使用 show 和 hide 的方式实现切换 以及切换的时候Fragment 生命周期
实现的效果如下图 主要的代码在activity 这里贴出来了 public class ShowActvity extends AppCompatActivity implements View.On ...
- ViewPager与Fragment结合使用,以及切换的时候Fragment 的生命周期
下面要做的效果图下图 首先我们创建一个适配器如下 public class FraPagerAdapter extends FragmentPagerAdapter {private List< ...
- Activity 数据传递给Fragment
下面说的宿主Activity 里面的Fragment 加入现在Fragment 里面 想使用Activity 里面的城市id 方法 1 使用set值 在Fragment 里面写一个set方法 在act ...
- Fragment 之间传递数据
关于Fragment 之间的跳转这里就不再说了 有兴趣的可以看我的这边博客 Fragment 跳转 ,,,点击查看把 Fragment 跳转首先先跳转到宿主的Activity 上 这里以在同一个Act ...
最新文章
- Java泛型背后是什么?
- 7-2 作业调度算法--短作业优先 (30 分)(思路+详解+vector容器做法)Come Baby!!!!!!!!!!!
- Ajax控件之ScriptManager与UpdatePanel用法 by:凉游浅笔深画眉 / Net7Cracker
- python错误:ImportError: DLL load failed: 找不到指定的程序,from PyQt6 import QtCore, QtGui, QtWidgets
- 腾讯QQ表情生意经:建开放平台 与原创者最高六四分成
- 鸟哥私房菜重温笔记4
- 程序发生run time error原因及解决方案
- 仓库智能化管理:WMS仓储管理系统解决方案
- 字符数组与字符串处理函数
- 一文打通 Git 任督二脉
- 虚拟经济全球化10亿美元生态圈乍现
- bl小说里面有个机器人管家_《机器管家》简介
- solidity智能合约中tx.origin的正确使用场景
- 2021消防设施操作员(中级)岗位考试模拟题库判断自动系统知识部分
- 爬虫-实现一个简易的网页采集器
- nginx发布vue多页面程序
- gearman php扩展 windows,在Debian 6上安装Gearman PHP扩展
- manjaro 解决sublime3中文输入问题-subl3
- 大话西游2服务器修改,大话西游2移民规则重大调整公告 河北新区迎来改动
- 批处理命令 删除文件