android fragment 介绍和使用
fragment用了很多遍,可总觉得在理解上还有一些欠缺,就想将自己得理解写下来,看看是否能够完善。
首先,android 有了activity组件,为什么还要fragment呢?我们在开发应用的时候,会发现如今机型尺寸样式非常多,单独使用activity没办法完全适配,这就可能导致要维护两份代码,fragment就是用来解决这样的问题,并且如今的底部栏+fragment和tablayout+fragment,一个activity可以展示多个不同的页面,而且加载速度比activity快很多。你可以把Fragment当成Activity的一个界面的一个组成部分,甚至Activity的界面可以完全由不同的Fragment组成,Fragment拥有自己的生命周期和接收、处理用户的事件,这样就不必在Activity写一堆控件的事件处理的代码了,你可以动态的添加、替换和移除某个。
下面就来介绍一下fragment的生命周期,静态fragment 和动态fragment的使用。
fragment 的生命周期
可见fragment比activity多了几个生命周期方法
onAttach 跟activity关联时调用
onCreateView 创建fragment视图时调用
onActivityCreate activity onCreate返回时调用
onDestroyView fragment 视图销毁时调用
onDetach 跟activity取消关联时调用
静态fragment的使用
activity_main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <fragment android:id="@+id/fg_one" android:name="com.uw.fragmenttest.OneFragment" android:text="one fragment" android:layout_width="match_parent" android:layout_height="match_parent"/> </LinearLayout>
创建一个fragment,重写onCreateView方法,创建布局
public class OneFragment extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // Inflate the layout for this fragment return inflater.inflate(R.layout.fragment_blank, container, false); } }
以上就是fragment的静态用法,启动MainActivity,onefragment布局就会覆盖在上面。
动态fragment的使用
简单用法如下:
FragmentManager fragmentManager = getSupportFragmentManager(); fragmentManager.beginTransaction() .replace(R.id.fg_one,TwoFragment.newInstance("twofragment","")) .addToBackStack(null) .commit();
首先获取FragmentManager ,然后开启事务管理也就是获取FragmentTransaction,api介绍如下
Fragment常用的三个类:
android.app.Fragment 主要用于定义Fragment
android.app.FragmentManager 主要用于在Activity中操作Fragment
android.app.FragmentTransaction 保证一些列Fragment操作的原子性,
a、获取FragmentManage的方式:
getFragmentManager() // v4中,getSupportFragmentManager, fragment 中 getChildFragmentManager
b、主要的操作都是FragmentTransaction的方法
FragmentTransaction transaction = fm.benginTransatcion();//开启一个事务
add 添加fragment
remove 移除fragment,如果fragment没有添加到回退栈,fragment就被销毁了,添加到回退栈,UI视图还是会被销毁
replace 相当于add 和remove的结合体
hide 隐藏fragment,如果想保存fragment视图,则可以配合add、show使用
show 显示fragment
addToBackStack 添加到回退栈。若是想保存fragment都需要将其添加到回退栈
commit 提交事务管理,添加fragment后必须调用commit提交才会生效
detach 会将view从UI中移除,和remove()不同,此时fragment的状态依然由FragmentManager维护。
attach 重建view视图,附加到UI上并显示。
在实际使用中想保存fragment实例,就需要先将它添加到回退栈,并且当实例存在时就不能重复commit,否则会报错,下面介绍一下使用bundle跟activity通信。
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); FragmentManager fragmentManager = getSupportFragmentManager(); fragmentManager.beginTransaction() .replace(R.id.fg_one,OneFragment.newInstance("oneFragment","")) .commit(); } } public class OneFragment extends Fragment { private static final String ARG_PARAM1 = "param1"; private static final String ARG_PARAM2 = "param2"; private String mParam1; private String mParam2; private TextView textView; public static OneFragment newInstance(String param1, String param2) { OneFragment fragment = new OneFragment(); Bundle args = new Bundle(); args.putString(ARG_PARAM1, param1); args.putString(ARG_PARAM2, param2); fragment.setArguments(args); return fragment; } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (getArguments() != null) { mParam1 = getArguments().getString(ARG_PARAM1); mParam2 = getArguments().getString(ARG_PARAM2); } } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_one, container, false); textView = view.findViewById(R.id.tv_content); textView.setText(mParam1); return view; } @Override public void onAttach(Context context) { super.onAttach(context); } @Override public void onDetach() { super.onDetach(); } }
上面的这种写法是android studio创建fragment时自带的模板,好处是可以让fragment 跟activity没有耦合。