美文网首页
Fragment 与 Activity 之间的通信

Fragment 与 Activity 之间的通信

作者: W_Nicotine | 来源:发表于2017-12-03 15:38 被阅读0次

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

    从Activity向Fragment传递数据

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

    activity_main.xml
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
                 android:orientation="vertical"
                 android:layout_width="match_parent"
                 android:layout_height="match_parent">
       <TextView
           android:id="@+id/text"
           android:layout_gravity="center"
           android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:textSize="20dp"
           android:text="我是Activity"/>
    
       <FrameLayout
           android:layout_below="@+id/button"
           android:layout_height="match_parent"
           android:id="@+id/fragment"
           android:layout_width="match_parent"
           />
       
    </LinearLayout>
    
    • 首先我们先创建一个Activity 的布局文件,这个布局文件中有两个比较重要的点,一个是TextView,这个是用来显示文本的,主要是用来区分Activity和Fragment的。而FrameLayout是一种布局方式,我们给这个布局起一个名字,这样方便一会我们在写MainActivity的时候调用。
    fragment.xml
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
                 android:orientation="vertical"
                 android:layout_width="match_parent"
                 android:layout_height="match_parent"
                 android:background="#FF0000">
       <TextView
           android:id="@+id/text"
           android:layout_gravity="center"
           android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:text="等待Activity发送消息"
           android:textSize="20dp"/>
       <Button
           android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:id="@id/button"
           android:layout_gravity="center"
           android:text="点击接收Activity的消息"
           android:layout_centerInParent="true"
           android:textSize="20dp"
          />
       
       <TextView
           android:id="@+id/fragment1"
           android:text="我是fagment"
           android:layout_gravity="center"
           android:textSize="60dp"
           android:textColor="#000000"
           android:layout_width="wrap_content"
           android:layout_height="wrap_content"/>
       
    </LinearLayout>
    
    
    • 可以看到,我们给这个页边一个颜色,用来区分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()方法。
    最后的结果如下图:
    1 2

    从Fragment 向Activity传递数据

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

    #####activity_main.xml
    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent">
        <TextView
            android:id="@+id/text"
    
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="等待Fragment发送消息"
            android:textSize="20dp"/>
    
        <Button
            android:id="@+id/button"
            android:layout_below="@+id/text"
            android:text="点击接收Fragment消息"
            android:layout_centerInParent="true"
            android:textSize="10dp"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"/>
    
        <FrameLayout
            android:layout_below="@+id/button"
            android:id="@+id/fragment"
            android:layout_width="match_parent"
            android:layout_height="match_parent">
    
        </FrameLayout>
    
    </RelativeLayout>
    
    fragment.xml
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
                  android:orientation="vertical"
                  android:layout_width="match_parent"
                  android:layout_height="match_parent">
    
        <TextView
            android:id="@+id/fragment"
            android:text="我是fragment"
            android:gravity="center"
            android:textSize="30dp"
            android:background="#FF0000"
            android:layout_width="match_parent"
            android:layout_height="match_parent"/>
    
    </LinearLayout>- 
    
    • 上面这两个布局文件跟从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。
    结果如下图:
    1 2

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

    相关文章

      网友评论

          本文标题:Fragment 与 Activity 之间的通信

          本文链接:https://www.haomeiwen.com/subject/fzonbxtx.html