1.归纳
Fragment的使用场景
在没有Fragment的时候,基本上是一个界面就要新建一个Activity,有了Fragment,就可以使用单个Activity+多个Fragment的方式,可以减少内存消耗,提升性能,且界面显示更灵活。
对于不同界面间有密切的逻辑关系,且界面相似的场景,可以采用单个Activity+多个Fragment的方式,如:
APP的主页面,点击不同的TAB按钮,显示不同的界面。
用户的登录注册模块通常包括三个界面:登录、注册和修改密码,这三个界面的实现。
先展示列表,点击列表项,显示详情这样的两个界面的实现,像订单列表和订单详情界面。
使用setArguments(Bundle bundle)传递参数
为何不用构造传参,请看这篇文章http://blog.csdn.net/tu_bingbing/article/details/24143249
传参步骤归纳:
- 在Fragment中定义一个静态方法,供Activity实例化Fragment并传参时调用;
- 在Activity中,调用步骤1中新建的静态方法创建一个Fragment实例,并传入需要传递的参数
- 在Fragment中的onCreateView(或者onCreate)方法中通过getArguments()方法取值
2.一个小例子
ContentFragment
package com.xzy.fragmentbasicdemo.fragment; import android.os.Bundle; import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; import com.xzy.fragmentbasicdemo.R; /** * A simple {@link Fragment} subclass. */ public class ContentFragment extends Fragment { private static final String TAG = "ContentFragment"; public static final String ARGUMENT = "argument"; public static final String RESPONSE = "response"; private String mArguments; public ContentFragment() { } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_content, container, false); /** * 取值 * */ Bundle bundle = getArguments(); if (bundle != null) { mArguments = bundle.getString(ARGUMENT); } /** * 赋值 * */ TextView textView = view.findViewById(R.id.tv_test); textView.setText(mArguments); return view; } /** * 实例化并传值 * * @param param 需要传递的参数 * @return ContentFragment */ public static ContentFragment newInstance(String param) { Bundle bundle = new Bundle(); bundle.putString(ARGUMENT, param); ContentFragment contentFragment = new ContentFragment(); contentFragment.setArguments(bundle); return contentFragment; } }Activity
package com.xzy.fragmentbasicdemo; import android.os.Bundle; import android.support.v4.app.FragmentActivity; import android.support.v4.app.FragmentManager; import com.xzy.fragmentbasicdemo.fragment.ContentFragment; /** * 测试fragment的一些用法: * 1.传参 */ public class MainActivity extends FragmentActivity { private ContentFragment mContentFragment; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); FragmentManager fm = getSupportFragmentManager(); /** * 在activity_main的根布局添加ID属性,值为id_fragment_container * */ mContentFragment = (ContentFragment) fm.findFragmentById(R.id.id_fragment_container); if (mContentFragment == null) { /** * 实例化并传值 * */ mContentFragment = ContentFragment.newInstance("xuzhuyun"); fm.beginTransaction().replace(R.id.id_fragment_container, mContentFragment).commit(); } } }
3.参考文章
- http://blog.csdn.net/xjbclz/article/details/51842328
- http://blog.csdn.net/tu_bingbing/article/details/24143249
- http://blog.csdn.net/vrinux/article/details/44086649