如何在同一个Activity中的Fragment与Fragment之间传值

如图在Afragment的布局中点击按钮传递值到Bfragment中显示出来。

图一

图二

首先要明确一点Fragment与Fragment传值跟Activity传值有所不一样,不能单纯通过Intent.putExtra和getIntent.getXXXExtra传值和取值,我这里用的是自定义广播,在AFragment里面设置Action并发送广播,通过所在的 xxxActivity注册接收值,在把值设置给BFragment(不能直接在BFragment里面注册接收广播,无法接收到值),我这里是点击A,B,C按钮切换对应的Fragment,当A里面有item也是Fragment的时候(也就是Fragment嵌套Fragment的时候也可以用广播来传值)当然还有其它的方式,代码如下

MainActivity 里面的代码

public class MainActivity extends Activity {

    public Afragment mAFragment;
    protected Bfragment mBFragment;
    protected Cfragment mCFragment;

    public static final String TODETAIL_ACTION = "detail";// 广播action
    private MyBoradcast broadcast;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //初始化Fragment
        mAFragment = new Afragment();
        mBFragment = new Bfragment();
        mCFragment = new Cfragment();

        // 动态注册广播
        IntentFilter filter = new IntentFilter();
        filter.addAction(TODETAIL_ACTION);
        broadcast = new MyBoradcast();
        registerReceiver(broadcast, filter);
    }

    //切换Fragment的方法
    public void replaceView(Fragment f) {
        FragmentManager manager = getFragmentManager();
        FragmentTransaction transaction = manager.beginTransaction();
        transaction.replace(R.id.fl, f);
        transaction.commit();
    }

    //点击A按钮切换mAFragment
    public void AClick(View v) {
        replaceView(mAFragment);
    }
    //点击B按钮切换mBFragment
    public void BClick(View v) {
        replaceView(mBFragment);
    }

    public void CClick(View v) {
        replaceView(mCFragment);
    }

    // 自定义广播接受者
    class MyBoradcast extends BroadcastReceiver {
        private String docId;

        @Override
        public void onReceive(Context context, Intent intent) {
            if (intent.getAction().equals("detail")) {
                docId = intent.getStringExtra("value");
                mBFragment.setDocId(docId);
            }
        }
    }

    @Override
    //解绑广播
    public void onDestroy() {
        unregisterReceiver(broadcast);
        super.onDestroy();
    }
}

Afragment里面的代码

public class Afragment extends Fragment implements OnClickListener {

    public String docId = "12";//要传的值
    private Button btn;


    public void setDocId(String docId) {
        this.docId = docId;
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View view= inflater.inflate(R.layout.storage_view, null);
        btn = (Button)view.findViewById(R.id.btn);
        return view;

    }

    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        btn.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        Intent intent=new Intent();
        intent.putExtra("value", docId);
        //设置Action
        intent.setAction(MainActivity.TODETAIL_ACTION);
        //发送广播
        getActivity().sendBroadcast(intent);
    }
}

Bfragment里面的代码

public class Bfragment extends Fragment {
    private String docId;
    private TextView tv_value;

    public void setDocId(String docId) {
        this.docId = docId;
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        return inflater.inflate(R.layout.sound_view, null);
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        tv_value=(TextView)getActivity().findViewById(R.id.tv_value);
        tv_value.setText(docId);
    }
}

关于传值补充二点

第一 从first Activity传值给sencond Activity里面的Fragment或Fragment的子类Fragment,可以在接收值的Fragment里面

            Intent intent = getActivity().getIntent();
            userName = intent.getStringExtra("userName");即可

第二 Fragment获取当前Activity中的方法或者变量只需((xxActivity)getActivity).xxxvalue 或((xxActivity)getActivity).xxxMethod()

猜你喜欢

转载自blog.csdn.net/qq_34581102/article/details/52827865
今日推荐