Fragment的数据传递

Fragment的数据传递


现在有一个需求:一个Activity下有两个Fragment, AFragment 和 BFragment ,AFragment中有一个按钮,点击之后就跳转到BFragment,并且向BFragment发送一个字符串。
最简单的写法就是
在AFragment中:

 @Override
    public void onClick(View v) {
        BFragment bFragment=new BFragment();
        Bundle bundle=new Bundle();
        bundle.putString("key","helloworld");
        bFragment.setArguments(bundle);
                  getActivity().getSupportFragmentManager().beginTransaction().replace(R.id.fl_container,bFragment).commit();
    }

在BFragment中:

mArguments=getArguments.getString("key");

这样写是可以的 。但是Fragment的复用性就很差了。为了提高Fragment的复用性,就应降低Fragment和Activity的耦合,而且不应在Fragment里面操作别的Fragment。
代码重新组织如下:

package com.example.guang.aboutfragment;


import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;


/**
 * A simple {@link Fragment} subclass.
 */
public class AFragment extends Fragment implements View.OnClickListener {


    public AFragment() {
        // Required empty public constructor
    }

    @Override
    public void onClick(View v) {
        if(getActivity() instanceof AFragmentCallback){
            ((AFragmentCallback)getActivity()).callback("hello world");
        }
    }

    public interface AFragmentCallback{
        void callback(String s);
    }


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View view=inflater.inflate(R.layout.fragment_a, container, false);
        Button btn=(Button)view.findViewById(R.id.btn_a);
        btn.setOnClickListener(this);
        return view;

    }

}
package com.example.guang.aboutfragment;

import android.support.v4.app.FragmentTransaction;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

public class MainActivity extends AppCompatActivity implements AFragment.AFragmentCallback{

    private AFragment aFragment;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        aFragment = new AFragment();
        FragmentTransaction trans=getSupportFragmentManager().beginTransaction();
        trans.add(R.id.fl_container,aFragment);
        trans.commit();
    }


    @Override
    public void callback(String s) {
        FragmentTransaction trans=getSupportFragmentManager().beginTransaction();
        trans.replace(R.id.fl_container,BFragment.newInstance(s));
        trans.addToBackStack(null);
        trans.commit();

    }
}
package com.example.guang.aboutfragment;


import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import com.orhanobut.logger.Logger;


/**
 * A simple {@link Fragment} subclass.
 */
public class BFragment extends Fragment {

    private String mArgument;
    public static final String ARGUMENT="BFragment_argument";
    public BFragment() {
        // Required empty public constructor
    }




    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        Bundle bundle=getArguments();
        if(bundle!=null){
            mArgument=bundle.getString(ARGUMENT);
        }
        Logger.d(mArgument);
        return inflater.inflate(R.layout.fragment_b, container, false);
    }

    public static BFragment newInstance(String s){
        Bundle bundle=new Bundle();
        bundle.putString(ARGUMENT,s);
        BFragment bf=new BFragment();
        bf.setArguments(bundle);
        return bf;
    }

}

虽然这样写感觉代码比原来复杂了好多,但是这样降低了耦合度,方便了复用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值