(7)Fragment与Activity通信(二)

1.归纳

Fragment的使用场景

在没有Fragment的时候,基本上是一个界面就要新建一个Activity,有了Fragment,就可以使用单个Activity+多个Fragment的方式,可以减少内存消耗,提升性能,且界面显示更灵活。
对于不同界面间有密切的逻辑关系,且界面相似的场景,可以采用单个Activity+多个Fragment的方式,如:
APP的主页面,点击不同的TAB按钮,显示不同的界面。
用户的登录注册模块通常包括三个界面:登录、注册和修改密码,这三个界面的实现。
先展示列表,点击列表项,显示详情这样的两个界面的实现,像订单列表和订单详情界面。

使用setArguments(Bundle bundle)传递参数

为何不用构造传参,请看这篇文章http://blog.csdn.net/tu_bingbing/article/details/24143249

传参步骤归纳:

  1. 在Fragment中定义一个静态方法,供Activity实例化Fragment并传参时调用;
  2. 在Activity中,调用步骤1中新建的静态方法创建一个Fragment实例,并传入需要传递的参数
  3. 在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




猜你喜欢

转载自blog.csdn.net/jdfkldjlkjdl/article/details/79035434
今日推荐