Android用户界面开发:Fragment
1:注意事项
3.0以前的Android 版本要使用FragmentActivity 来装载Fragment ,使用到support v4包。 3.0以后的版本可以直接在Activity里面添加Fragment。2:Fragment也有生命周期,继承Fragment 要重新onCreateView方法,另外onResume,onDestroyView 等方法根据需要填写。重写onCreateView()方法:public class Fragment1 extends Fragment{@Override
public View onCreateView(LayoutInflater inflater,ViewGroup container, Bundle savedInstanceState){
// Inflate the layout for this fragmentreturn Inflater.inflate(R.layout.fragment1, container, false); }}
这里使用了LayoutInflater对象从指定的XML文件(本例中是R.layout.fragment1)来构造UI。container参数指定了父ViewGroup,即在其中嵌入该Fragment的活动。savedInstanceState参数使得能够将该Fragment恢复至之前保存的状态。3:在activity中加入Fragment有两种方法:布局和代码动态加入。布局加入和在布局加入view,button等用法一样。
要想向活动中添加Fragment,需要使用<fragment>元素:<LinearLayout xmlns:android="android:orientation="horizontal"
android:layout_width="match_parent" android:layout_height="match_parent"><fragment
android:name=".Fragment1" android:id="@+id/fragment1" android:layout_weight="1" android:layout_width="0px" android:layout_height="match_parent" /> <fragment android:name=".Fragment2" android:id="@+id/fragment2" android:layout_weight="1"android:layout_width="0px"
android:layout_height="match_parent" /></LinearLayout>
可注意到,每个Fragment都需要一个唯一标识符。可以通过android:id或android:tag属性指定。4:在Activity中动态加入Fragment google 教程http://developer.android.com/training/basics/fragments/fragment-ui.html
// 创建一个Fragment实例
HeadlinesFragment firstFragment = new HeadlinesFragment();firstFragment.setArguments(getIntent().getExtras());getSupportFragmentManager().beginTransaction().add(R.id.fragment_container, firstFragment).commit();5:一个Fragment替换另一个Fragment
ArticleFragment newFragment = new ArticleFragment();//要传递给newFragment的信息,可以来自于其它FragmentBundle args = new Bundle();args.putInt(ArticleFragment.ARG_POSITION, position);newFragment.setArguments(args);FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();transaction.replace(R.id.fragment_container, newFragment);transaction.addToBackStack(“xxxxx”);//一个字符串标识transaction.commit();要想点击back可以返回上一个fragment ,transaction.addToBackStack(“xxxxx”);//一个字符串标识,这个必须有。6:Fragment 替换另一个Fragment时 数据传递
例如:点击fragmentA 中的一个按钮 启动fragmentB ,FragmentActivity 是 activityFragment(1)通过Intent传递数据Intent intent = new Intent();//把数据加入intent中intent.putExtra("xxx", xxx);intent.putExtra("xxx", xxx); ......activityFragment .setIntent(intent);//启用事务,完成Fragment的转换。FragmentTransaction transaction = activityFragment.getSupportFragmentManager().beginTransaction();transaction.replace(R.id.xxx, fragmentB);//使用 add() 方法添加一个fragmenttransaction.add(R.id.fragment_container,fragment);add()的第一个参数是fragment要放入的ViewGroup, 由resource ID指定,第二个参数是需要添加的fragment。一旦用FragmentTransaction做了改变,为了使改变生效,必须调用commit()。//不将被替换的fragment加入栈中,点击返回调用系统默认的方法onBackPress()时不会返回上一个fragmenttransaction.addToBackStack("msg_fragment");transaction.commit();(2) 通过setfragment.setArguments(Bundle args)Bundle bundle = new Bundle();//往Bundle中放入数据Bundle.put(xxxx);.....fragmentB.setArgument();//启用事务,完成Fragment的转换。FragmentTransaction transaction = activityFragment.getSupportFragmentManager().beginTransaction();transaction.replace(R.id.xxx, fragmentB);//不将被替换的fragment加入栈中,点击返回调用系统默认的方法onBackPress()时不会返回上一个fragmenttransaction.addToBackStack("msg_fragment");transaction.commit();在fragmentB中 通过fragmentB.getArgument();方法获得Bundle,再取出数据。7:关于Context 的使用
我在fragmentA创建一个自定义的dialog时 出现如下异常06-24 14:34:52.147: E/AndroidRuntime(4853): FATAL EXCEPTION: main06-24 14:34:52.147: E/AndroidRuntime(4853): java.lang.RuntimeException: Unable to resume activity {xxx}: java.lang.RuntimeException: Unable to resume activity {xxxxx.MsgActGroup}: java.lang.RuntimeException: Unable to resume activity {xxxx/com...MsgFragmentAct}: android.view.WindowManager$BadTokenException: Unable to add window -- token android.app.LocalActivityManager$LocalActivityRecord@4054d430 is not valid; is your activity running?情况是这样:fragmentActivity 是ActivityGroup的一个子Activity,fragmenA是fragmentActivity 的一个Fragment。这个异常可以翻译成:fragmentA现在还处于运行状态吗?可能是创建dialog时传入的context 即 fragmentA.getActivity() 即fragmentActivity 有问题。改成fragmentA.getActivity().getParent()。问题得到解决。参考链接:
Google 提供的教程: