Fragment 与 Activity 之间的通信

Fragment(碎片)是一种可以嵌入在Activity(活动)当中的UI片段,它能让程序更加合理和充分的利用大屏幕的空间。
既可以从Fragment传送数据到Activity,同样也可以从Activity传送数据到Fragment。接下来让我们了解一下他们是如何互相传递数据的。

从Activity向Fragment传递数据

首先们先来看看如何从Activity向Fragment传递数据,我们采用 Bundle 方式。具体代码如下:

activity_main.xml

   

   
   

  • 首先我们先创建一个Activity 的布局文件,这个布局文件中有两个比较重要的点,一个是TextView,这个是用来显示文本的,主要是用来区分Activity和Fragment的。而FrameLayout是一种布局方式,我们给这个布局起一个名字,这样方便一会我们在写MainActivity的时候调用。
fragment.xml


   
   
  • 可以看到,我们给这个页边一个颜色,用来区分Activity和Fragment。这个fragment布局有三个控件,一个是ID为text的TextView控件,这个控件显示的内容就是一会我们从Activity传过来的数据,Button控件是点击控件,点击之后就可以使从Activity传送到Fragment的数据显示出来,另一个ID为fragment1的控件是区别Activity和Fragment。
MainActivity.java
package com.example.activity_fragment;

import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {
   
   @Override
   protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.activity_main);
       TextView text = (TextView) findViewById(R.id.text);

       //获取FragmentManager
       FragmentManager fragmentManager = getFragmentManager();

       //获取FragmentTransaction
       FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();

       //创建需要添加的Fragment
       final mFragment fragment = new mFragment();

       //创建bundle对象
       Bundle bundle = new Bundle();

       //往Bundle中添加数据
       bundle.putString("xin","My name is 农威能!");

       //把数据设置到Fragment中
       fragment.setArguments(bundle);

       //动态添加Fragment
       //即创建的fragment添加到Activity布局文件中定义的占位符中(FrameLayout)
       fragmentTransaction.add(R.id.fragment, fragment);
       fragmentTransaction.commit();
   }
}
  • 接下来我们写MainActivity的文件,FragmentManager是负责管理fragment并将它们的视图添加到activity的视图层级结构中,bundle.putString("xin","My name is 农威能!");表示往bundle中添加数据,添加的数据就是一会传到Fragment的数据,我们可以看到putString();中有两个参数,第一个参数是表示我们也要传输的数据的ID,这样我们一会需要调用的时候只需要调用这个ID就可以得到这个数据了。
mFragment.java
package com.example.activity_fragment;
import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;

public class mFragment extends Fragment {

    Bundle bundle;
    String xinxi;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState){
        View contentView = inflater.inflate(R.layout.fragment,container,false);
        //设置布局文件


        //contentView.findViewById(R.id.button):利用View对象,找到XML布局中的组件

        Button button = (Button) contentView.findViewById(R.id.button);

        final TextView  text = (TextView) contentView.findViewById(R.id.text);


        //通过getArgument()获取从Activity传过来的全部值
        bundle = this.getArguments();

        //获取某一值
        xinxi = bundle.getString("xin");

        //设置按钮,将设置的值显示出来;
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                //显示传过来的值
                text.setText(xinxi);
            }

        });

        return contentView;
    }
}
  • 最后我们写一个mFragment 文件,这里我们重写onCreateView()方法。
最后的结果如下图:
Fragment 与 Activity 之间的通信_第1张图片
1
Fragment 与 Activity 之间的通信_第2张图片
2

从Fragment 向Activity传递数据

接下来我们采用接口回调的方式从Fragment 向Activity传递数据。

#####activity_main.xml


    

    
fragment.xml



    

- 
  • 上面这两个布局文件跟从Activity传输数据到Fragment的布局文件有着异曲同工之处,都是比较简单。
ICalback.java
package com.example.fragment_activity;

public interface ICallBack {
    void get_message_from_Fragment(String string);
}
  • 我们使用接口回调的方法去实现,所以必须new一个接口。

mFragment.java

import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

public class mFragment extends Fragment {

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup contaner, Bundle
            savedInstanceState) {
        View contenView = inflater.inflate(R.layout.fragment,contaner, false);

        return contenView;
    }

    public static void sendMesage(ICallBack callBack) {
        callBack.get_message_from_Fragment("消息:我来自Fragment");
    }

}
  • 在mFragment中我们只要设置接口回调方法就好了。
MainActivity.java
package com.example.fragment_activity;

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

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Button button = (Button) findViewById(R.id.button);
        final TextView text = (TextView) findViewById(R.id.text);


        FragmentManager fragmentManager = getFragmentManager();

        FragmentTransaction transaction = fragmentManager.beginTransaction();

        mFragment mfragment = new mFragment();
        transaction.add(R.id.fragment,mfragment);
        transaction.commit();

        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mFragment.sendMessage(new ICallBack() {
                    @Override
                    public void get_message_from_Fragment(String string) {
                        text.setText(string);
                    }
                });
            }
        });
    }
}
  • 通过接口回调将消息从fragment发送到Activity。
结果如下图:
Fragment 与 Activity 之间的通信_第3张图片
1
Fragment 与 Activity 之间的通信_第4张图片
2

总结:通过Fragment与Activity相互传输数据的方法中我们可以看到,其实代码大致相同,只不过因为用的方法不一样,所以获取数据的方法才会不一样。Fragment与Activity之间的通信非常有用处,可以大大提高屏幕的空间利用率,我会继续深入学习这一个知识点。

你可能感兴趣的:(Fragment 与 Activity 之间的通信)