Fragment的内容感觉好多啊,主要需要掌握Fragment静态加载,Fragment动态加载,Fragment的生命周期,Fragment与Activity的交互
1,Fragment的静态加载
在activity的layout文件中声明Fragment,需要特别注意的是《fragment》中的android:name属性指定了在laytout中实例化的Fragemnt类
标示Fragment的方法
android:id 属性提供唯一的id
android:name 属性提供唯一的name
Fragment静态加载比较简单,可以当成普通的控件直接写在activity的布局中,
<LinearLayout android:id="@+id/frame" android:orientation="vertical" android:layout_weight="0.8" android:layout_width="match_parent" android:layout_height="0dp"> <fragment android:layout_width="match_parent" android:layout_height="match_parent" android:name="com.example.lining.myapplication.MyFragment" android:id="@+id/fragment1"> </fragment> </LinearLayout>
然后需要写一个类继承自Fragment,实现里面的onCreateView方法。该方法中加载自定义的MyFragment布局文件。如下方式
public class MyFragment extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { //return super.onCreateView(inflater, container, savedInstanceState); /* 把layout布局文件转换成view resource:要加载的布局文件 container:加载layout的viewgroup attachToRoot:false 不返回viewgroup */ View view = inflater.inflate(R.layout.fragment1,container,false); return view; } }
当然肯定还得有Fragment的布局,
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="New Text" android:id="@+id/fragment1text" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="New Button" android:id="@+id/fragment1btn" /> </LinearLayout>
上面的代码,一个静态加载就可以暂时完成了。
2,动态加载
拽写代码将fragment添加到activity中。add() :添加一个fragment(指定要添加的fragemnt和要插入的view)于此类似的还有remove 和 替换 replace。
处理fragment事务:根据用户的交互情况,对fragemnt进行添加,移除,替换以及执行其他动作,提交给activity的每一套动作成为一个事务
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManaget.beginTransaction();
每一套事务都是同时执行一套变化,可以在一套事务中设置你所有想执行的变化。包括add(),replace,remove 然后提交给activity 。必须调用commit()方法
如果允许用户通过back键返回到前一个fragment调用commit之前可以加入addtobackstack方法
myFragment2 = new MyFragment2(); FragmentManager fragmentManager = getFragmentManager(); FragmentTransaction beginTransaction = fragmentManager.beginTransaction(); beginTransaction.add(R.id.frame,myFragment2); beginTransaction.addToBackStack(null); beginTransaction.commit();
R.id.frame 就是fragment的父view。
3,Fragment的生命周期
开启应用:onAttach->onCreate->onCreateView->onActivityCreated->onStart->onResume
隐藏应用:onPause->onStop
恢复应用:onStart->onResume
切换其他Fragment:onPause->onStop->onDestroyView
返回该Fragment:onCreateView->onActivityCreated->onStart->onResume
退出应用:onPause->onStop->onDestroyView->onDestroy->onDeAttach
4,Fragment与Activity交互
Activity->Fragment : 这个只需要在activity中保存fragment的引用,就可以直接调用fragment的方法,进行传值等等。如果没有保存fragment的引用,那么
就需要通过getFragmentManager.findFragmentByTag()或者findFragmentById()获得任何Fragment实例,然后进行操作。
Fragment->Activity : 在Fragment中可以通过getActivity得到当前绑定的Activity的实例,然后进行操作。
public class MyFragment2 extends Fragment implements View.OnClickListener{
private TextView textView;
private Button btn;
private MyListening myListening;
public interface MyListening
{
void thank(String str);
}
@Override
public void onAttach(Activity activity) {
myListening = (MyListening)activity;
super.onAttach(activity);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
//return super.onCreateView(inflater, container, savedInstanceState);
View view = inflater.inflate(R.layout.fragment1,container,false);
btn = (Button)view.findViewById(R.id.fragment1btn);
btn.setOnClickListener(this);
textView =(TextView) view.findViewById(R.id.fragment1text);
return view;
}
public void setText(String name){
textView.setText(name);
}
@Override
public void onClick(View v) {
myListening.thank("i am fragment");
}
}
然后在Acitvity中实现该接口就行。
@Override public void thank(String str) { Toast.makeText(getBaseContext(),str,Toast.LENGTH_LONG).show(); }