主要内容:Fragment简介、Fragment的生命周期、Fragment通信、两个Fragment的跳转
Fragment简介
Fragment出现的初衷是为了适应平板,通过Fragment对UI进行模块化的管理,然后根据不用的屏幕尺寸动态的更新界面。Fragment必须被嵌入到Activity中使用,虽然也拥有自己的生命周期,但是其生命周期受到它所在的Activity的控制。只有Activity处于活动状态,我们才能操作Fragment。
一、Fragment的使用
- 创建一个类继承自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作为一个控件来使用。直接看代码:
<fragment android:layout_width="wrap_content" android:layout_height="wrap_content" android:name="com.example.wly.fragmentdetail.fragment_1" />
- 动态使用:
getSupportFragmentManager()
.beginTransaction()
.add(R.id.aty_main, new fragment_1())
二、Fragment相关的常用方法
Fragment是通过FragmentManager来管理的,我们可以通过getFragmentManager()来获得它的实例。在Activity中,我们可以动态的添加、删除、替换以及执行其他动作。这样的每一个动作叫做一个事务。需要通过FragmentTransaction来执行。
- 常用的三个类
Fragment 在
android.app
下和android.support.v4.app.
都有对应类。所以引用的时候不同文件下的引用文件要一直,不然会有问题。
import android.app.Fragment;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
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的生命周期交叉:
这是补充:onCreateView()的作用是初始化Fragment的一些视图控件,然后把Fragment视图返回给Activity。如果在Fragment中用到了Activity的一些控件或者变量,需要在onActivityCreated()中通过getActivity()方法来取得所在的Activity,然后获取需要的变量,此时都已初始化完成。
四、Fragment传递参数
- 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")
接收参数:
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)
这里需要注意addToBackStack(null)这个方法,假如不把前一个Fragment放到后退栈中,那么这个Fragment就会被销毁。放进去,一般情况下不会被销毁(内存紧张的情况下可能会销毁)。
结束语:这里总结了一下Fragment的基本用法,其实关于FragmentManager,还有相关的replace、add等方法都需要去深究,翻一翻源码。但是现在首要任务是会用这些东西,然后去找一份工作。那些东西还是需要具体用的时候去深究!