fragment 小结

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();
要想点击 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()
问题解决。

你可能感兴趣的:(fragment 小结)