1
:注意事项
3.0
以前的
Android
版本要使用
FragmentActivity
来装载
Fragment
,使用到
support v4
包。
3.0
以后的版本可以直接在
Activity
里面添加
Fragment
。
2
:
Fragment
也有生命周期,继承
Fragment
要重新
onCreateView
方法,另外
onResume
,onDestroyView 等方法根据需要填写。
3
:在
activity
中加入
Fragment
有两种方法
:
布局和代码动态加入。布局加入和在布局加入
view
,
button
等用法一样。
4
:在
Activity
中动态加入
Fragment google
教程 http://developer.android.com/training/basics/fragments/fragment-ui.html
// 创建一个Fragment实例
HeadlinesFragment firstFragment = new HeadlinesFragment();
// In case this activity was started with special instructions from an Intent,
// pass the Intent's extras to the fragment as arguments
firstFragment.setArguments(getIntent().getExtras());
// Add the fragment to the 'fragment_container' FrameLayout
getSupportFragmentManager().beginTransaction()
.add(R.id.fragment_container, firstFragment).commit();
5:一个
Fragment
替换另一个
Fragment
ArticleFragment newFragment = new ArticleFragment();
//要传递给
newFragment
的信息,可以来自于其它
Fragment
Bundle args = new Bundle();
args.putInt(ArticleFragment.ARG_POSITION, position);
newFragment.setArguments(args);
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
// Replace whatever is in the fragment_container view with this fragment,
// and add the transaction to the back stack so the user can navigate back
transaction.replace(R.id.fragment_container, newFragment);
transaction.addToBackStack(“xxxxx”);//一个字符串标识
// Commit the transaction
transaction.commit();
Bundle args = new Bundle();
args.putInt(ArticleFragment.ARG_POSITION, position);
newFragment.setArguments(args);
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
// Replace whatever is in the fragment_container view with this fragment,
// and add the transaction to the back stack so the user can navigate back
transaction.replace(R.id.fragment_container, newFragment);
transaction.addToBackStack(“xxxxx”);//一个字符串标识
// Commit the transaction
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);
//不将被替换的fragment加入栈中,点击返回调用系统默认的方法onBackPress()时不会返回上一个fragment
transaction.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()时不会返回上一个fragment
transaction.addToBackStack("msg_fragment");
transaction.commit();
在
fragmentB
中 通过
fragmentB.getArgument()
;方法获得
Bundle
,在取出数据。
7
:关于
Context
的使用
我在
fragmentA
创建一个自定义的
dialog
时 出现如下异常
06-24 14:34:52.147: E/AndroidRuntime(4853): FATAL EXCEPTION: main
06-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()
问题解决。