Fragment的使用小结(二)

上篇文章简单的介绍了Fragment的创建和使用,Fragment的生命周期和Fragment常用方法 (Fragment的使用小结(一)),下面重点总结Fragment与Activity间的通信。

一.Fragment与Activity互相通信

Activity向动态加载的Fragmen传递数据

方案一:在Activity中创建Bundle数据包,把要传的值放到Bundle里,并调用Fragment的setArgument(Bundle bundle)方法,然后在Fragment中 通过getArguments() 得到 bundle对象,获取传入的数据。(在加载Fragment之前传递数据)

MainActivity.java

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mEditText = (EditText) findViewById(R.id.et_data);
        // 1. 获取Fragment管理器.
        mFm = getFragmentManager();
        // 2. 开启Fragment处理事务.
        mTransaction = mFm.beginTransaction();
        // 3. 进行Fragment操作
        mTransaction.add(R.id.container, new FirstFragment());
        // 4. 进行事务的提交
        mTransaction.commit();

    }
    public void createFragment(View view){
        FirstFragment firstFragment = new FirstFragment();
        Bundle bundle =  new Bundle();
        mText = mEditText.getText().toString().trim();
        if (mEditText!=null) {
            bundle.putString("text", mText);
        }
        firstFragment.setArguments(bundle);
        mTransaction = mFm.beginTransaction();
        mTransaction.replace(R.id.container, firstFragment);
        mTransaction.commit();
    }

FirstFragment.java

 @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        /** * resource:Fragment需要加载的布局文件
         * root:加载layout的父ViewGroup
         * attactToRoot:false,不返回父ViewGroup
         * */

        View mRootView = inflater.inflate(R.layout.fragment_first , container , false);
        TextView text = (TextView) mRootView.findViewById(R.id.tv_data);
        Bundle bundle = getArguments();
        if (bundle!=null) {
            text.setText(bundle.getString("text"));
        }
        return mRootView;
    }

方案二:使用Handler机制,首先在Activity中定义一个方法用来设置Handler对象,然后在在Fragment中的回调函数onAttach()中得到Fragment所在Activity,调用此方法设置Handler,最后在Activity中发送消息给Fragment中的Hanlder进行数据传递(在加载Fragment之后传递数据)

MainActivity.java

public class MainActivity extends FragmentActivity {
    private Handler mHandler;
    private EditText mEditText;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mEditText = (EditText) findViewById(R.id.et_data);
    }

    //设置Handler对象
    public void setHandler(Handler handler) {
        mHandler = handler;
    }

    public void click(View view) {
        FirstFragment firstFragment = new FirstFragment();
        FragmentManager fm = getSupportFragmentManager();
        FragmentTransaction ft = fm.beginTransaction();
        ft.replace(R.id.container, firstFragment);
        ft.commit();

    }

    public void getData(View view) {
        Message message = new Message();
        message.obj = mEditText.getText().toString().trim();
        message.what = 1;
        mHandler.sendMessage(message);
    }


}

FirstFragment.java

public class FirstFragment extends Fragment {
    private MainActivity mActivity;
    private TextView mText;

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View mView = inflater.inflate(R.layout.fragment_first, container, false);
        mText = (TextView)mView.findViewById(R.id.tv_data);
        return mView;
    }
    public Handler mHandler = new Handler(){
        @Override
        public void handleMessage(Message msg) {
            switch (msg.what) {
                case 1:
                    mText.setText((String)msg.obj);
            }
        }
    };

    @Override
    public void onAttach(Activity activity) {
//        Fragment所在Activity
        super.onAttach(activity);
        mActivity = (MainActivity) activity;
        mActivity.setHandler(mHandler);
    }
}

Activity向静态加载的Fragment传递数据

a、如果你Activity中包含自己管理的Fragment的引用,可以通过引用直接访问所有的Fragment的public方法
b、如果Activity中未保存任何Fragment的引用,那么没关系,每个Fragment都有一个唯一的TAG或者ID,可以通过getFragmentManager.findFragmentByTag()或者findFragmentById()获得任何Fragment实例,然后进行操作。
注:如果在Fragment中需要Context,可以通过调用getActivity(),如果该Context需要在Activity被销毁后还存在,则使用getActivity().getApplicationContext()。

方案:首先通过静态方式加载Fragment,然后在Fragment中创建数据用来接收传来的数据,设置get和set方法,接着在Activity中通过findFragmentById或者findFragmentByTag方式找到fragment,并通过set方法传递数据,最后在fragment中通过get 方法获取数据。
MainActivity.java

public class MainActivity extends FragmentActivity {
    private FragmentManager mFragmentManager;
    private SecondFragment mFragment;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mFragmentManager = getSupportFragmentManager();
        mFragment = (SecondFragment) mFragmentManager.findFragmentById(R.id.fragment_second);
        mFragment.setTextData("Activity传过来的文本");

    }

}

SecondFragment.java

public class SecondFragment  extends Fragment {
    public String mTextData;

    private TextView mTv;

    public String getTextData() {
        return mTextData;
    }
    public void setTextData(String textData) {
        mTextData = textData;
    }
    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_second, container, false);
        mTv = (TextView) view.findViewById(R.id.tv_data);
        return view;
    }
    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        mTv.setText(getTextData());
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值