#Android应用界面开发

第三章学习

####第二部分####


####1.久闻大名的Fragment####

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

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


  • Fragment的子类(很少用)

  • 对话框:DialogFragment

  • 列表:ListFragment

  • 选项设置:PreferenceFragment

  • WebView界面:WebViewFragment


静态添加碎片分为3步:

  1. 创建Fragment的xml布局文件
  2. 自定义Fragment的类,需继承自Fragment或者其子类,重载onCreateView方法,通过inflate.inflate方法将布局文件转化为View类的实例,将View实例返回
  3. 跟普通加载控件一样的方法,添加一个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步:

  1. 创建待添加的碎片实例。
  2. 获取到FragmentManager,在活动中可以直接调用getFragmentManager()方法得到。
  3. 开启一个事务,通过调用beginTransaction()方法开启。
  4. 向容器内加入碎片,一般使用replace()方法实现,需要传入容器的id和待添加的碎片实例。
  5. 提交事务,调用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相关推荐

  1. Fragment之间传递数据的方式

    1.直接调用另一个Fragent对象的方法,两个Fragment之间高度耦合 2.采取接口回调的方式进行数据传递.即在一个fragment中创建一接口以及接口对应的set方法,在另一个fagment中 ...

  2. Android Fragment 调用宿主Activity 里面的方法

    方法 1 : 直接在Fragment 写 MainActivity main = (MainActivity) getActivity();main.xx; // xx 是 MainActivity ...

  3. java.lang.IllegalArgumentException: No view found for id 0x7f07005f (xx) for for fragment xxFragment

    问题的原因的是自己修改id 的时候弄错了修改下id 就好了 我的是用activity 加载fragment 使用的地方如下 ,确定下面的id 是否在布局中 transaction.add(R.id.c ...

  4. overridePendingTransition 方法在Fragment 中使用

    overridePendingTransition  方法在直接卸载Fragment 中无法识别 这个使用可以在前面添加getActivity 即可使用了 getActivity().override ...

  5. Fragment 使用 replace 的方式实现切换 以及切换的时候Fragment 生命周期

    这个主要代码在activity里面 如下 public class ReplaceActivity extends AppCompatActivity implements View.OnClickL ...

  6. Fragment 使用 show 和 hide 的方式实现切换 以及切换的时候Fragment 生命周期

    实现的效果如下图 主要的代码在activity 这里贴出来了 public class ShowActvity extends AppCompatActivity implements View.On ...

  7. ViewPager与Fragment结合使用,以及切换的时候Fragment 的生命周期

    下面要做的效果图下图 首先我们创建一个适配器如下 public class FraPagerAdapter extends FragmentPagerAdapter {private List< ...

  8. Activity 数据传递给Fragment

    下面说的宿主Activity 里面的Fragment 加入现在Fragment 里面 想使用Activity 里面的城市id 方法 1 使用set值 在Fragment 里面写一个set方法 在act ...

  9. Fragment 之间传递数据

    关于Fragment 之间的跳转这里就不再说了 有兴趣的可以看我的这边博客 Fragment 跳转 ,,,点击查看把 Fragment 跳转首先先跳转到宿主的Activity 上 这里以在同一个Act ...

最新文章

  1. Java泛型背后是什么?
  2. 7-2 作业调度算法--短作业优先 (30 分)(思路+详解+vector容器做法)Come Baby!!!!!!!!!!!
  3. Ajax控件之ScriptManager与UpdatePanel用法 by:凉游浅笔深画眉 / Net7Cracker
  4. python错误:ImportError: DLL load failed: 找不到指定的程序,from PyQt6 import QtCore, QtGui, QtWidgets
  5. 腾讯QQ表情生意经:建开放平台 与原创者最高六四分成
  6. 鸟哥私房菜重温笔记4
  7. 程序发生run time error原因及解决方案
  8. 仓库智能化管理:WMS仓储管理系统解决方案
  9. 字符数组与字符串处理函数
  10. 一文打通 Git 任督二脉
  11. 虚拟经济全球化10亿美元生态圈乍现
  12. bl小说里面有个机器人管家_《机器管家》简介
  13. solidity智能合约中tx.origin的正确使用场景
  14. 2021消防设施操作员(中级)岗位考试模拟题库判断自动系统知识部分
  15. 爬虫-实现一个简易的网页采集器
  16. nginx发布vue多页面程序
  17. gearman php扩展 windows,在Debian 6上安装Gearman PHP扩展
  18. manjaro 解决sublime3中文输入问题-subl3
  19. 大话西游2服务器修改,大话西游2移民规则重大调整公告 河北新区迎来改动
  20. 批处理命令 删除文件

热门文章

  1. “扫地机器人双子星”正在坠落之科沃斯
  2. adprw指令教程_三菱FX3U从入门到精通(全套)
  3. Maya---物体跟随曲线动画
  4. 2.x 版本的ZIP4j压缩和解压使用
  5. python图片保存为txt文件_python实现对文件中图片生成带标签的txt文件方法
  6. CEO的1元年薪起源
  7. 计算机无法设置壁纸黑屏,电脑界面为什么无法换壁纸 一直黑屏 但有图标
  8. bzoj1677:求和
  9. java同时引用不同版本同一个jar包
  10. STM32实现按键控制继电器