Activity与Fragment,以及Fragment与Fragment之间的数据通讯

Activity和Fragment无疑是Android开发中使用最多的组件,如果Activity使用了多个Fragment,需要在Activity与Fragment,以及Fragment与Fragment之间进行数据通讯,这是开发时经常遇到的需求问题,其实在我没整理这篇blog前也遇到过这样的数据通讯需求,下面是后来整理的用接口回调的方式实现Fragment与Fragment之间,以及用Bundler实现Activity与Fragment之间数据通讯,希望能对大家有帮助.

  • 通过接口回调,实现Fragment与Fragment之间数据通讯,逻辑如下:
1.创建一个接口,并在接口里面创建用于处理回调的函数,函数上面声明一个参数,参数的数据类型是Fragment之间通讯的数据类型
2.在一个Fragment中创建用于注册回调的函数,函数上面声明一个参数,参数的数据类型是接口的类型
3.在另外的一个Fragment中创建一个内部类,并且将内部类实现回调的接口并实现接口中的函数,然后在外部类中通过第一个Fragment的类名直接调用第一个Fragment中用于注册回调的函数,将自己内部类的对象作为参数传递
4.实现数据传递时,只要第一个Fragment调用接口中处理数据的函数,那另外一个Fragment就会收到传递的数据

Activity(左边和右边各显示一个Fragment):

public class MainActivity extends Activity {
    private FragmentManager mManager;
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // 获取Fragment管理者
        mManager= getFragmentManager();

        // 默认左边边显示的Fragment
        FragmentTransaction leftTr= mManager.beginTransaction();
        LeftFragment leftFragment = new LeftFragment();
        leftTr.replace(R.id.fl_left, leftFragment);
        leftTr.commit();

        // 默认右边显示的Fragment
        FragmentTransaction rightTr = mManager.beginTransaction();
        RightFragment rightFragment= new RightFragment();
        rightTr.replace(R.id.fl_right, rightFragment);
        rightTr.commit();
    }
}

处理回调的接口:

public interface DataListener {
    //处理数据的函数,接口的实现类必须实现此函数
    void onData(String data);
}

左边的Fragment:

public class LeftFragment extends Fragment {
    public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState{
        View inflate = inflater.inflate(R.layout.left_fragment, null);

        //调用右边RightFragment的setOnDataListener函数注册接口回调
        RightFragment.setOnDataListener(new OnDataListener());

        return inflate;
    }

    //用于实现回调的类,实现的是处理回调的接口,并实现接口里面的函数
    class OnDataListener implements DataListener{
        //实现接口中处理数据的函数,只要右边的Fragment调用onData函数,这里就会收到传递的数据
        public void onData(String data) {
            Toast.makeText(getActivity(), "data="+data, 0).show();
        }
    }
}

右边的Fragment:

public class RightFragment extends Fragment {
    private static DataListener mDataListener;
    private EditText mEdData;
    private Button mBtnPut;
    public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {
        View inflate = inflater.inflate(R.layout.right_fragment, null);

        mEdData = (EditText) inflate.findViewById(R.id.ed_data);
        mBtnPut= (Button) inflate.findViewById(R.id.btn_put);

        mBtnPut.setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
                String data = mEdData.getText().toString();
                //调用接口中处理数据的函数,这里实际是多态的方式调用的是实现类的函数
                mDataListener.onData(data);
            }
        });
        return inflate;
    }

    //创建注册回调的函数
    public static void setOnDataListener(DataListener dataListener){
        //将参数赋值给接口类型的成员变量
        mDataListener = dataListener;
    }
}

以上是所有的代码,至于Activity与Fragment之间通讯,可以沿用上面的逻辑去实现.

  • 但是还可以用另外一种方法,就是用官方提供的Bundler去实现Activity传递数据到Fragment.
    Activity(传递数据):
public class MainActivity extends Activity {
    private FragmentManager mManager;
    private  Button mBtnPutData;
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        mBtnPutData = (Button) findViewById(R.id.btn_putData);

        //默认显示的Fragment
        mManager= getFragmentManager();
        FragmentTransaction transaction = mManager.beginTransaction();
        RightFragment fragment = new RightFragment();
        transaction.replace(R.id.fl_content, fragment);
        transaction.commit();

        //向RightFragment传值
        mBtnPutData.setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
                FragmentTransaction transaction = mManager.beginTransaction();
                RightFragment fragment = new RightFragment();
                //创建Bundle对象
                Bundle bundle = new Bundle();
                //向Bundle输入数据
                bundle.putInt("data", 100);
                //对fragment设置Bundle参数
                fragment.setArguments(bundle);
                transaction.replace(R.id.fl_content, fragment);
                transaction.commit();
            }
        });
    }
}

Fragment(接收数据)

public class RightFragment extends Fragment{
    private EditText mEtData;
    public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {
        View  inflate = inflater.inflate(R.layout.right_fragment, container,false);
        mEtData = (EditText) inflate.findViewById(R.id.et_data);
        //获取Activity传递的Bundle对象
        Bundle bundle = getArguments();
        if(bundle != null){
            //从bundle里面获取key为data的int类型数值
            int data = bundle.getInt("data");
            //将值设置到控件上
            et_data.setText("data="+data);
        }
        return inflate;
    }
}

————————–完 毕————————–

你可能感兴趣的:(Android)