fragment 传递数据

fragment 依赖于activity 。不是android 四大组件,是一个view,与activity 不可分开,有很多时候,我们用fragment 做界面,甚至拿它充当了activity 。

既然它依赖activity  并 可以充当activity ,那我们就应该有权利在来控制它。那看了谷歌公司是怎么做的。先看一部分代码。
 这里的布局放了两个button 和一个FrameLayout布局 

  **注意FrameLayout 在哪用的 观察id 在下面代码里的出现**

 activity 的 xml

    
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">



    <include
        android:id="@+id/id_ly_bottombar"
        android:layout_width="fill_parent"
        android:layout_height="80dp"
        android:layout_alignParentBottom="true"
        layout="@layout/layout_bar" />

    <FrameLayout
        android:id="@+id/id_content"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_above="@id/id_ly_bottombar" />
LinearLayout>

对fragment 操作有fragment 事物来来处理
注意这几个方法,这是对fragment 在activity 动态 添加 替换 删除
transaction.add();
transaction.replace();
transaction.remove()

 FragmentManager fm = getFragmentManager();  
 FragmentTransaction transaction =fm.beginTransaction();
 BFragment()  bFragment = new BFragment();
 transaction.add(R.id.id_content,BFragment);//注意这里的 id 是bFragment 所在的父布局
 transaction.commit();

接下看我们怎么在activity 和 Fragment 传递数据

和activity一样利用 Bundle
Person 类必须实现 Serializable接口

activity 里写法

 Person person=new Person("姓名","手机");

      OneWithDataFragment  oneWithDataFragment = new OneWithDataFragment();
      //OneWithDataFragment  是我们需要传入数据的Fragment
        Bundle bundle=new Bundle();
         bundle.putSerializable("person",person);
        oneWithDataFragment.setArguments(bundle);
        transaction.commit();

fragment 写法

       Bundle bundle=getArguments();
       Person person=(Person) bundle.getSerializable("person");

        TextView tv=(TextView)view.findViewById(R.id.tv);
        tv.setText(person.getName()+person.getPhone());

fragment 和 fragment 是传递数据

fragment 既然依赖activity 那我们就也利用factivity 来实现。
我们在两个fragment 里都写接口,让 activity 实现这两个接口。

传递数据的fragment
在 传递接口方法里加上参数,在实现类的实现方法里初始化数据

 public interface  intentDataListener{
        void initentData(Person person);
    }

接收数据的fragment
在 接收的接口方法里加上返回值,在实现类的实现方法里将数据返回

 public interface  DataListener{
        Person getIntentData();
    }

下面看具体代码
activity

package com.example.erhu.fragment;

import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;

import com.example.erhu.jsondemo.R;

/**
 * Created by erhu on 16/9/21.
 */
public class AActivity extends AppCompatActivity implements View.OnClickListener,BFragment.DataListener,CFragment.intentDataListener {
    BFragment bFragment;
    CFragment cFragment;
    Person p=new Person("姓名","手机");

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_a);
        findViewById(R.id.one_btn).setOnClickListener(this);
        findViewById(R.id.two_btn).setOnClickListener(this);
        defaultFragment();
    }


    @Override
    public void onClick(View v) {
        FragmentManager fm = getFragmentManager();
        FragmentTransaction transaction =fm.beginTransaction();
        switch (v.getId()){
            case R.id.one_btn:
                if (bFragment==null){
                    bFragment = new BFragment();
                    bFragment.setListener(this);
                }
                transaction.replace(R.id.id_content, bFragment);
                break;

            case R.id.two_btn:
                if (cFragment==null){
                    cFragment = new CFragment();
                    cFragment.setListener(this);
                }
                transaction.replace(R.id.id_content, cFragment);

                break;
        }
        transaction.commit();
    }


    public void defaultFragment(){
        FragmentManager fm = getFragmentManager();
        FragmentTransaction transaction = fm.beginTransaction();
        bFragment = new BFragment();
        bFragment.setListener(this);
        transaction.add(R.id.id_content, bFragment);
        transaction.commit();
    }


    @Override
    public void initentData(Person person) {
        p=person;
    }

    @Override
    public Person getIntentData() {
        return p;
    }



}

要传递数据的fragment

package com.example.erhu.fragment;

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

import com.example.erhu.jsondemo.R;



public class CFragment extends Fragment implements View.OnClickListener{
    View view;


    public  intentDataListener  listener;

    @Nullable
    @Override

    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        view=inflater.inflate(R.layout.fragment_c,null);
        view.findViewById(R.id.cfragment).setOnClickListener(this);
        return view;
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.cfragment:
                if (listener!=null){
                    Person person=new Person("我是碎片传来数据","qqqqqqqq");
                    listener.initentData(person);
                }
            break;
        }
    }




    public interface  intentDataListener{
        void initentData(Person person);
    }


    /**
     *
     * 设置回调接口
     */
    public void setListener(intentDataListener listener) {
        this.listener = listener;
    }


}

接收数据的fragment

package com.example.erhu.fragment;


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

import com.example.erhu.jsondemo.R;

import org.w3c.dom.Text;

public class BFragment extends Fragment implements View.OnClickListener{
    Button   button;
    View view;


    public  DataListener listener;
    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
       view=inflater.inflate(R.layout.fragment_b,null);
        button=(Button)view.findViewById(R.id.bfragment);
        button.setOnClickListener(this);
        return view;
    }




    public interface  DataListener{
        Person getIntentData();
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.bfragment:
                getPersonData();
            break;
        }
    }

    public void getPersonData(){
       Person p= listener.getIntentData();
        TextView tv=(TextView) view.findViewById(R.id.fr_tv);
        tv.setText(p.getName());
    }

    public void setListener(DataListener listener) {
        this.listener = listener;
    }
}

你可能感兴趣的:(fragment 传递数据)