Fragement
//app包下的使用
静态使用方法
创建Fragment的XML布局
创建Fragment类(将XML布局文件与Fragment类相结合)
重写OnCreateView方法,该方法主要定义Fragment的布局,以View对象的方式返回Fragment的视图()
//生命周期方法,第一次绘制Fragment用户界面时调用
//LayoutInflater inflater表示布局填充器或者加载器,将XML文件转换成View对象
( View view = inflater(R.layout.fraament,null) return view;)//该中方式可以在Fragment类中获取相应的实例
(return inlater.inflate(R.layout.fargment.nul;l))//该方法用于无需获取相应实例的时候
//ViewGroup container表示当前Fragment插入Activity的布局视图对象
//Bundle savedInstanceState表示存储上一个Fragment的信息将Fragment从Activity的布局文件中引入
//android:name=”fragment的包名.类名”
动态使用方法
- 创建Fragment的XML布局文件
- 创建Fragment类(将XML布局文件与Fragment类相结合)
- (Activity)创建Fragment的管理对象
FragmentManager fragmentManager = getSupportFragmentManager(); - (Activity)创建Fragmnet的事务对象并开启
FragmentTransaction transaction = fragmentManager.beginTransaction(); - (Activity)调用事务的动态方法动态的添加、移除、替换Fragment
transaction.add(R.id.acticity_title_layout,new TitleFragment);//将传入的Fragment对象添加到指定位置
transaction.replace(R.id.fragment_floor,fragment);//将指定位置的Fragment对象替换
transaction.replace(oldFragment1,newFragment);//将指定的Fragment对象替换为传入Fragment对象 - (Activity)提交事务
transaction.commit();
<为兼容低版本的设备,可以使用V4包下的Fragment>
- 使用注意事项
使用V4包下的Fragment时需要引入的Activity需要继承FragmentActivity
获取FragmentManager对象时需要调用getSupportManager()方法获取对象
使用V4包下的Fragment时相关的对象需要导入对应的V4包下
生命周期
- onAttach//当Activity和Fragment产生关联时回调的方法
- onCreate//Fragment**第一次**被创建时调用的方法
- onCreateView//Fragment**第一次**绘制用户界面的时候调用
- onActivityCreated//当前Fragment所属Acticity创建成功时调用的方法
- onStart//Fragment**可见**时调用
- onResum//Fragment**获取**界面焦点时调用
- onPause//Fragment**失去**界面焦点时调用
onStop//Fragment**不可见**时调用
<当Fragment被替换时其余Activity的关联被销毁包括其本身,重新切换回来时重新创建关联以及其本身>
<当用户按下Home键退出界面时,Fragment实例与Activity的关联以及其本身不会被销毁,而是会调用onStop方法,回到程序是会调用reStar方法重新成为可见状态>
<当用户点击返回按钮时,Fragment与Activity的关联以及自身都被销毁>
Fragment传值
- Activity向Fragment传值
(Activity)
//创建Bundle类型的容器用于传递数据(指定类型:键值对型容器)
Bundle bundle = new Bundle();
bundle.putString(“info”,info);
//创建一个ResultFragment类实例,用于传递数据
ResultFragment resultFragment = new ResultFragment();
//调用ResultFragment实例的setArguments方法将Bundle数据传入该实例中
resultFragment.setArgument(bundle);
//调用Transaction的增、删、改、查方法时传入Bundle数据
例:transaction.replace.(R.id.layout,bundle) ; transaction.commit();
(Fragment)
//在Fragment类中调用getArgument()方法
Bundle bundle = getArgument();
bundle.getString(info);
Activity向Fragment传值
(1)Fragment中定义传值的回调接口,在生命周期的onAttach()方法中获取接口的实例
//Fragment中定义接口,接口中定义回传数据的函数
例:public interface MyListener{
public abstract void sendMessage( String str );
}
//Fragment中创建接口实例获取Activity从传入的监听接口
例:private MyListener myLitener;
//重写Fragment的onCreate或者onAttach方法获取监听实例
例:public void onCreate(Bundle saveInstanceState){
super.onCreate(saveInstanceState);
mListener = (MyListener) getActivity();(获取Activity中的接口)}
(2)Fragment需要传值的位置调用接口回调方法传值
例:mListener.
(3)Activity实现回调接口重写回调方法获取传递的值
//Activity实现监听接口中的方法,对返回的数据执行相应的数据操作
Activity中的Fragment与Fragment互相传值
(1)可通过将以上两种方式结合的形式,实现Fragment间的传值(略)
(2)可以通过在某个Fragment中获取到同Activity中的其它Fragment实例,实现调用其它Fragment中的类方法
//(Fragment)
例:调用getFragmentManager的findFragmentById的方法获取同一Activity中的其它Fragment实例
OtherFragment otherFragment = (OtherFragment) getFragmentManager().findFragmentById(R.id.otherFragment);
(3)类似于方法2获取同Activity中的其它Fragment的控件实例(首先获得FragmentManager对象,再获取Fragment对象, 再获取Fragment的View对象,再通过View的findViewById方法获取实例)
//(Fragment)
例:TextView textView = getFragmentManager().findFragmentById(R.id.otherFragment)
.getView().findViewById(r.id.textView)
(4)直接调用getActivity()方法获取Activity实例,再调用findViewById()方法直接获取目标控件
//(Fragment)
TextView textView = getActivity().finfViewById(R.id.textView);
ListFragment的应用
<适用于Fragment单纯的展示一个ListView>
(1)myFragment的布局默认包含一个ListView
需要定义一个LsitView(其标签必须指定为系统id:@id/android:list 意为:androidR.id.list)
(2)ListView绑定数据
例:public void onCreateView(LayoutInflater inflater,ViewGroup container,Bundle savedInstanceState){
View view = inflater.inflate(R.layout.fragmentList,null);
list = new ArrayList [String] ();
for( int i =0 ; i<20 ; i++ ){
list.add(“item”+i)}
ArrayAdapter[String] adapter = new ArrayAdapter[String] (getActivity(),android.R.layout.simple_list_item_1,list);
setListAdapter(adapter);
return View ;
}
//设置点击ListView点击事件ListView点击的ListView、View点击的子项、position子项的位置
**public void onListItemClick(ListVew I,View v, int position , long id )
{**
super.onListItemClick(I,v,position,id);
}
(3)myFragment需要继承ListFragment
DialogFragment的应用
(1)创建MyDialogFragment
public class MyDialogFragment extends DialogFragment{
//Fragment
public void onCreateDialog(Bundle savedInstanceState){
AlertDialog.Builde builder = new AlertDialog.Builde
.builder.setTitle(“”);
.builder.setMessage(“”);
.builder.setIcon(R.id.drawable.picture);
.builder.setPositiveButton(“确定”,new OnClickListener(){
@overage
public void onClick(DialogInterface dialog, int which){
}
});
return builder.creater;//返回Dialog对象
}
(2)Activity中调用
MyDialogFragment fragment = new MyDialogFragment();
fragment.show(getFragmentManager(),”dialog”);
//使用MyDialogFragment的好处在于,可以在屏幕横竖屏切换时保存数据,避免Dialog对话框在切换横竖屏时由于销毁重新创建对象时导致的数据丢失,适用于类似创建账户等对话框(避免由于用户的横竖屏切换导致用户输入的数据丢失)