专栏首页KK的小酒馆久闻大名的FragmentAndroid应用界面开发

久闻大名的FragmentAndroid应用界面开发

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

<RelativeLayout
    xmlns: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 {
 @Override
 public 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"?>
<RelativeLayout
    xmlns: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">

    <fragment
        android: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" >
 
 <fragment
 android: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(); 

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Service的跨进程开发Android开发高级进阶

    Service的跨进程通信主要由两种Android提供的方法进行,一个是AIDL,通过创建一个AIDL文件来完成,另一个是利用Messenger,发送Messa...

    爱因斯坦福
  • APP启动引导页的制作,用ViewPager实现翻页动画

    这次制作App的引导页,主要用到2个知识“SharedPreferences 和 ViewPager”

    爱因斯坦福
  • 第一个Android应用Android应用界面开发

    给项目取名First Application 主界面命名FirstAty,xml文件命名就自动使用activity_first_aty吧。

    爱因斯坦福
  • Android开发之漫漫长途 XII——Fragment详解

    该文章是一个系列文章,是本人在Android开发的漫漫长途上的一点感想和记录,我会尽量按照先易后难的顺序进行编写该系列。该系列引用了《Android开发艺术探索...

    mafeibiao
  • AndroidStudio制作底部导航栏以及用Fragment实现切换功能

    大家好,我是 Vic,今天给大家带来AndroidStudio制作底部导航栏以及用Fragment实现切换功能的概述,希望你们喜欢

    达达前端
  • 联想V系列存储基于IP的远程镜像实施教程

    V系列存储支持基于FC和IP链路的远程镜像,一般,FC的远程镜像用的较多,而基于IP的镜像,则是一种廉价的方案,今天我就以V3700为例,做基于IP的远程镜像的...

    Mr.Mao Notes
  • Android应用界面开发——Fragment(实现图书详情界面)

    Fragment代表了Activity的子模块,因此可以把Fragment理解成Activity片段。

    trampcr
  • 如何给企业做好基本的网络安全防御工作

    企业防御 这里总结的是企业在做安全防御的统筹方法,并不是具体某个漏洞如何修复~ 信息安全的实质是采取措施保护信息资产,使之不因偶然或者恶意侵犯而遭受破坏...

    用户1467662
  • 「小程序JAVA实战」小程序的视频点赞功能开发(62)

    IT故事会
  • redis面试

    一次请求/响应服务器能实现处理新的请求即使旧的请求还未被响应。这样就可以将多个命令发送到服务器,而不用等待回复,最后在一个步骤中读取该答复。

    大学里的混子

扫码关注云+社区

领取腾讯云代金券