Fragment提供了把UI分解成不同组成部分的方法,从而使得每一个部分都能在其运行的设备上以正确的形式被展现。
在手机上,列表视图会占据整个屏幕,点击一个列表项将会把用户带到新的屏幕以展示内容。但是在平板电脑上,列表视图只显示一部分,内容也会被同步展示。
Fragment生命周期: 1、onCreate 回调函数:onAttach()第一次与Activity时调用 onCreate()初始化Fragment onCreateView()创建Fragment的视图层级 onActivityCreated()当Host活动已经完成了对其onCreate()调用之后才能调用 2、onStart:当Fragment对于用户可见时调用 3、onResume: 4、onPause: 5、onStop: 6、onDestroy:
和ListView一样,Fragment也有一个三部曲
第一步:创建Fragment布局
在XML布局方面,Fragment和Activity无差异
第二步:加载Fragment布局 public View onCreateView(LayoutInflater inflater,ViewGroup ontainer.Bundle savedInstanceState){ View view = inflater.inflate(R.layout.news,container,true); return view; }
第三步:在Activity中添加Fragment
A、直接在布局文件中添加Fragment <LinearLayout android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="horizontal"> <fragment android:name="com.vijay.ListFragment" android:id="@+id/list" android:layout_weight="1" android:layout_width="0dp" android:layout_height="match_parent" /> </LinearLayout>
B、在Activity运行时添加Fragment //实例化ListFragment的对象 ListFragment listFragment = new ListFragment(); //获得一个FragmentTransaction的实例 FragmentTransation ft = getFragmentManager().beginTransaction(); //添加一个显示详细内容的Fragment ft.add(android.R,id.content,listFragment).commit(); //提交事务 ft.commit();
新知识点:
1、Fragment事务 由于在屏幕上可以一次展示多个Fragment,所以在不转换Activity的情况下添加和移除他们是可能的。要更改Ui中现有的Fragment,必须把他们封装到一个事物Transaction中。Fragment事务与数据库事务类似,对所有会影响到Fragment的操作进行批处理并会同时执行这些操作。 操作如下: FragmentManager fm = getFragmentManager(); FragmentTransation ft = fm.beginTransaction(); ExampleFragment fragment = new ExampleFragment(); ft.add(R.id.fragment_container,fragment); ft.commit(); 这里,一个新的Fragment被添加到UI上。 同时,Fragment也可以通过他们的ID或者通过标签字符串来引用。 fm.findFragmentById(R.id.frag); fm.findFragmentByTag("tag") 注意:Fragment仅当Activity在回复状态时才可以从布局中被添加或者移除。
2、Fragment回退栈 Fragment fm = getFragmentManager(); FragmentTransaction ft = fm.beginTransaction(); ExampleFragment fragment = new ExampleFragment(); ft.add(R.id.fragment_container,fragment); //takes a String name argument,not userd here ft.addToBackStack(null); ft.commit();
3、保存Fragment状态
Android3.2引入了另一个有意思的类:Fragment.SavedState
Fragment之间的通信方式 A、Fragment到Fragment直接通信 FragmentOther fragOther = (FragmentOther)getFragmentManager().findFragmentByTag( "other"); B、Fragment到目标Fragment的设置 mCalledFragment = new CalledFragment(); mCalledFragment.setTargetFragment(this,0); fm.beginTransaction().add(mCalledFragment,"work").commit(); C、目标Fragment到Fragment的通信 TextView tv =(TextView)getTargetFragment().getView().findViewById(R.id.text1); tv.setText("Set from the called fragment");