Fragment相关

主要内容:Fragment简介、Fragment的生命周期、Fragment通信、两个Fragment的跳转

Fragment简介

Fragment出现的初衷是为了适应平板,通过Fragment对UI进行模块化的管理,然后根据不用的屏幕尺寸动态的更新界面。Fragment必须被嵌入到Activity中使用,虽然也拥有自己的生命周期,但是其生命周期受到它所在的Activity的控制。只有Activity处于活动状态,我们才能操作Fragment。

一、Fragment的使用

  1. 创建一个类继承自Fragment或者其子类(DialogFragment、ListFragment、PreferenceFragment或者WebViewFragment)。然后实现其中的一些方法:onCreate()、onCreateView()、onStart()、onResume()、onPause()、onStop()等。看实例:
public class fragment_1 extends Fragment {
    public void fragment_1(){    }
    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        super.onCreateView(inflater, container, savedInstanceState);
        View rootView = inflater.inflate(R.layout.fragment_1, container,false);
        return  rootView;
    }
}

2.使用Fragment有两种方式

  • 静态使用:把创建出来的Fragment作为一个控件来使用。直接看代码:
    
    
  • 动态使用:
getSupportFragmentManager()
   .beginTransaction()
   .add(R.id.aty_main, new fragment_1())
   .commit();

二、Fragment相关的常用方法

Fragment是通过FragmentManager来管理的,我们可以通过getFragmentManager()来获得它的实例。在Activity中,我们可以动态的添加、删除、替换以及执行其他动作。这样的每一个动作叫做一个事务。需要通过FragmentTransaction来执行。

  1. 常用的三个类

Fragment 在android.app下和android.support.v4.app.都有对应类。所以引用的时候不同文件下的引用文件要一直,不然会有问题。

import android.app.Fragment;
import android.app.FragmentManager;
import android.app.FragmentTransaction;

2.常用API
获取所在的Activity: getActivity()
获取Fragment:Activity可以调用FragmentManager的findFragmentById()或findFragmentByTag()方法
获取FragmentManager: getFragmentManager() // v4中,getSupportFragmentManager()
FragmentTransaction:fragmentManager.beginTransaction()
ps:下面的一下API是FragmentTransaction中的。
FragmentTransaction transaction = fm.benginTransatcion();//开启一个事务
**transaction.add() **
往Activity中添加一个Fragment
**transaction.remove() **
从Activity中移除一个Fragment,如果被移除的Fragment没有添加到回退栈(回退栈后面会详细说),这个Fragment实例将会被销毁。
transaction.replace()
使用另一个Fragment替换当前的,实际上就是remove()然后add()的合体~
transaction.hide()
隐藏当前的Fragment,仅仅是设为不可见,并不会销毁
transaction.show()
显示之前隐藏的Fragment
detach()
会将view从UI中移除,和remove()不同,此时fragment的状态依然由FragmentManager维护。
attach()
重建view视图,附加到UI上并显示。
transition.addToBackStack(null);
把当前的Fragment添加到返回栈中
transatcion.commit()
做了上面一些列操作当然需要把这个事务提交了,因为上面已经交代过了。对Fragment的操作就是一种事务。
fragmentManager.popBackStack();
当前的Fragment出栈。这里需要注意出栈操作是FragmentManager中的方法。

下面是具体使用场合解析从鸿洋_大神拿来的!强烈推荐他的博客!其实我也关注了他的公众号,不过好像没有太多更新!
a、比如:我在FragmentA中的EditText填了一些数据,当切换到FragmentB时,如果希望会到A还能看到数据,则适合你的就是hide和show;也就是说,希望保留用户操作的面板,你可以使用hide和show,当然了不要使劲在那new实例,进行下非null判断。
b、再比如:我不希望保留用户操作,你可以使用remove(),然后add();或者使用replace()这个和remove,add是相同的效果。
c、remove和detach有一点细微的区别,在不考虑回退栈的情况下,remove会销毁整个Fragment实例,而detach则只是销毁其视图结构,实例并不会被销毁。那么二者怎么取舍使用呢?如果你的当前Activity一直存在,那么在不希望保留用户操作的时候,你可以优先使用detach。

Fragment生命周期:

一、Fragment的几种状态:
与Activity类似,Fragment也有一下几种状态:

  • 活动状态:当前Fragment位于前台,可见,可获得焦点。
  • 暂停状态:其他Activity位于前台,该Fragment可见,不可获得焦点。
  • 停止状态:不可见,失去焦点。
  • 销毁状态:该Fragment被完全删除或被结束。

二、Fragment的一些生命周期方法:
在Fragment的生命周期中,有一下方法会被回调:

  • onAttach():当Fragment被添加到Activity时被回调,只回调一次。
  • onCreate(Bundle savedStatus):创建Fragment时被回调,一次。
  • onCreateView(): 每次创建、绘制该Fragment的View组件时回调,Fragment将会显示该方法返回的View组件。
  • onActivityCreated():Fragment所在的Activity启动完成后回调。
  • onStart():每次启动或恢复Fragment时被回调。
  • onResume():每次启动或恢复Fragment时被回调,onStart()回调后就会回调此方法。
  • onPause():暂停时回调。
  • onStop():停止Fragment时回调。
  • onDestroyView():销毁Fragment的View组件时回调。
  • onDestroy():销毁Fragment时调用,一次。
  • onDetach():将Fragment从Activity中删除、被替换完成时回到该方法,在onDestroy()之后回调。

三、Fragment生命周期与Activity的生命周期交叉:

Fragment相关_第1张图片

这是补充:onCreateView()的作用是初始化Fragment的一些视图控件,然后把Fragment视图返回给Activity。如果在Fragment中用到了Activity的一些控件或者变量,需要在onActivityCreated()中通过getActivity()方法来取得所在的Activity,然后获取需要的变量,此时都已初始化完成。

四、Fragment传递参数

  1. Fragment与Activity之间的参数传递,有两种方式:
  • 在Fragment中通过getActivity()的方法可以获得所在的Activity,然后就可以获取其中的数据甚至修改其中的数据。
  • 通过Bundle传值
    在Activity中:
AnotherFragment anotherFragment = new AnotherFragment();
Bundle bundle = new Bundle();
bundle.putString("data", "MainActivity 2 anotherFragment!");
anotherFragment.setArguments(bundle);

getSupportFragmentManager().beginTransaction()
            .add(R.id.one, anotherFragment, "another")
            .commit();

接收参数:

Bundle bundle = getArguments();
Toast.makeText(getActivity(), bundle.getString("data"), Toast.LENGTH_LONG).show();

也可以通过接口回调的形式,给Activity回传
在Fragment中声明接口变量,然后在Activity中实现接口。在Fragment的onViewCreated()方法中给对应的接口变量赋值为对应的Activity。并调用接口实现方法,把参数通过接口方法回传回去。

五、两个Fragment之间的跳转
1.从Fragment到Activity的跳转,直接看代码,和Activity的跳转没有太大区别:

Intent intent = new Intent(getActivity(), LoginActivity.class);
startActivity(intent);

2.从Fragment到Fragment的跳转:

LoginFragment loginFg = new LoginFragment();
getFragmentManager()
        .beginTransaction()
        .replace(R.id.main_layout, loginFg, "LoginFragment")
        .addToBackStack(null)
        .commit();

这里需要注意addToBackStack(null)这个方法,假如不把前一个Fragment放到后退栈中,那么这个Fragment就会被销毁。放进去,一般情况下不会被销毁(内存紧张的情况下可能会销毁)。

结束语:这里总结了一下Fragment的基本用法,其实关于FragmentManager,还有相关的replace、add等方法都需要去深究,翻一翻源码。但是现在首要任务是会用这些东西,然后去找一份工作。那些东西还是需要具体用的时候去深究!

你可能感兴趣的:(Fragment相关)