【Android -- 四大组件】Fragment 与 Activity 之间通信

不断学习,做更好的自己!💪

视频号CSDN简书
欢迎打开微信,关注我的视频号:KevinDev点我点我

一、Activity 之间数据通信

1. Bundle

此方法可以传递基本数据类型和 String 类型的数据,如果传递的是对象就需要进行序列化(Parcelable)。

Bundle bundle = new Bundle();
bundle.putString("name", "chenjy");
bundle.putInt("age", 18);

Intent intent = new Intent(MainActivity.this, SecondActivity.class);
intent.putExtras(bundle);
startActivity(intent);

2. 静态变量/全局变量及Application/Android 系统剪切板

这三种方式其实非常相似,静态变量和全局变量都可以采用 static 的方式来定义,如果采用这种方式还是推荐用一个专门的类结合单体模式进行管理,尽量减少对内存的消耗。

3. EventBus

EventBus 是一款针对 Android 的发布以及订阅事件总线,使用它可以很方便的进行信息传递,而且使用起来很方便。
首先是定义一个消息:

public class Event {
    private String message;
    public Event(){
        message = "EventBus message";
    }

    public void setMessage(String message){
        this.message = message;
    }

    public String getMessage(){
        return message;
    }
}

发送消息:
这里使用了postSticky,这是发送的粘性广播,使用这个发送就可以先发送信息再进行注册,后注册的也能接收到前面发送的广播。当然还有其他的使用方式,可以查查api文档。

EventBus.getDefault().postSticky(new Event());
startActivity(new Intent(MainActivity.this,ReceiveActivity.class));

注册事件的订阅者:

EventBus.getDefault().register(this);

接受粘性广播:

@Subscribe(sticky = true, threadMode = ThreadMode.MAIN)
public void onEventThread(Event event) {
    textView.setText(event.getMessage());
}

二、Fragment 之间数据通信

1. 接口回调

step1. 在Menuragment中创建一个接口以及接口对应的set方法:

//MenuFragment.java文件中
public interface OnDataTransmissionListener {
    public void dataTransmission(String data);
}
public void setOnDataTransmissionListener(OnDataTransmissionListener mListener) {
    this.mListener = mListener;
}

step2: 在MenuFragment中的ListView条目点击事件中进行接口进行接口回调

//MenuFragment.java文件中
lv.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
   @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        /**
         * 方法二:采取接口回调的方式进行数据传递
         */
        if (mListener != null) {
            mListener.dataTransmission(mDatas.get(position));
        }
    }
});

step3: 在MainActivity中根据menuFragment获取到接口的set方法,在这个方法中进行进行数据传递,具体如下:

//在MainActivity.java中
menuFragment.setOnDataTransmissionListener(new MenuFragment.OnDataTransmissionListener() {
    @Override
    public void dataTransmission(String data) {
        mainFragment.setData(data);  //注:对应的mainFragment此时应该要用final进行修饰
    }
});

2. EventBus

三、Fragment 与 Activity 之间数据通信

1. handler方案

public class MainActivity extends FragmentActivity{ 
      //声明一个Handler 
      public Handler mHandler = new Handler(){       
          @Override
           public void handleMessage(Message msg) { 
                super.handleMessage(msg);
                 ...相应的处理代码
           }
     }
     ...相应的处理代码
   } 

    public class MainFragment extends Fragment{ 
          //保存Activity传递的handler
           private Handler mHandler;
           @Override
           public void onAttach(Activity activity) { 
                super.onAttach(activity);
               //这个地方已经产生了耦合,若还有其他的activity,这个地方就得修改 
                if(activity instance MainActivity){ 
                      mHandler =  ((MainActivity)activity).mHandler; 
                }
           }
           ...相应的处理代码
     }

2. 广播方案

3. EventBus方案

4. 接口方案

//MainActivity实现MainFragment开放的接口 
  public class MainActivity extends FragmentActivity implements FragmentListener{ 
        @override
         public void toH5Page(){ }
       ...其他处理代码省略
   } 

    public class MainFragment extends Fragment{

         public FragmentListener mListener;  
        //MainFragment开放的接口 
        public static interface FragmentListener{ 
            //跳到h5页面
           void toH5Page();
         }

         @Override 
        public void onAttach(Activity activity) { 
              super.onAttach(activity); 
              //对传递进来的Activity进行接口转换
               if(activity instance FragmentListener){
                   mListener = ((FragmentListener)activity); 
              }
         }
         ...其他处理代码省略 
  } 

5. 封装Functions

FunctionException.java

public class FunctionException extends Exception {
    public FunctionException(String msg){
        super();
    }
}

Functions.java

public class Functions {
    /**
     * 带有参数和返回值的 方法
     * @param <Result>
     * @param <Param>
     */
    public static abstract class FunctionWithParamAndResult<Result,Param> extends Function{
        public FunctionWithParamAndResult(String functionName) {
            super(functionName);
        }

        public abstract Result function(Param data);
    }

    /**
     * 没有参数和返回值的方法
     */
    public static abstract class Function{
        public String mFunctionName;
        public Function(String functionName){
            this.mFunctionName = functionName;
        }
    }

    /**
     * 有返回值,没有参数的方法
     * @param <Result>
     */
    public static abstract class FunctionWithResult<Result> extends Function{
        public FunctionWithResult(String functionName) {
            super(functionName);
        }

        public abstract Result function();
    }

    /**
     * 带有参数没有返回值的方法
     * @param <Param>
     */
    public static abstract class  FunctionWithParam<Param> extends Function{
        public FunctionWithParam(String functionName) {
            super(functionName);
        }

        public abstract void function(Param param);
    }

    /**
     * 没有参数和返回值的方法
     */
    public static abstract class  FunctionNoParamAndResult extends Function{
        public FunctionNoParamAndResult(String functionName) {
            super(functionName);
        }

        public abstract void function();
    }

    private HashMap<String,FunctionWithParam> mFunctionWithParam ;
    private HashMap<String,FunctionWithResult> mFunctionWithResult ;
    private HashMap<String,FunctionNoParamAndResult> mFunctionNoParamAndResult ;
    private HashMap<String,FunctionWithParamAndResult> mFunctionWithParamAndResult ;


    /**
     * 添加带参数的函数
     * @param function
     * @return
     */
    public Functions addFunction(FunctionWithParam function){
        if(function == null){
            return this;
        }
        if(mFunctionWithParam == null){
            mFunctionWithParam = new HashMap<>(1);
        }
        mFunctionWithParam.put(function.mFunctionName,function);

        return this;
    }

    /**
     * 添加带返回值的函数
     * @param function 
     * @return
     */
    public Functions addFunction(FunctionNoParamAndResult function){
        if(function == null){
            return this;
        }
        if(mFunctionNoParamAndResult == null){
            mFunctionNoParamAndResult = new HashMap<>(1);
        }
        mFunctionNoParamAndResult.put(function.mFunctionName,function);

        return this;
    }

    /**
     * 添加既有参数又有返回值的函数
     * @param function 
     * @return
     */
    public Functions addFunction(FunctionWithParamAndResult function){
        if(function == null){
            return this;
        }
        if(mFunctionWithParamAndResult == null){
            mFunctionWithParamAndResult = new HashMap<>(1);
        }
        mFunctionWithParamAndResult.put(function.mFunctionName,function);

        return this;
    }

    /**
     * 添加带有返回值的函数
     * @param function
     * @return
     */
    public Functions addFunction(FunctionWithResult function){
        if(function == null){
            return this;
        }
        if(mFunctionWithResult == null){
            mFunctionWithResult = new HashMap<>(1);
        }
        mFunctionWithResult.put(function.mFunctionName,function);

        return this;
    }

    /**
     * 根据函数名,回调无参无返回值的函数
     * @param funcName
     */
    public void invokeFunc(String funcName) throws FunctionException {
        FunctionNoParamAndResult f = null;
        if(mFunctionNoParamAndResult != null){
            f = mFunctionNoParamAndResult.get(funcName);
            if(f != null){
                f.function();
            }
        }

        if(f == null){
            throw new FunctionException("没有此函数");

        }
    }

    /**
     * 根据函数名,回调无参有返回值的函数
     * @param funcName
     */
    public <Result> Result invokeFuncWithResult(String funcName, Class<Result> c) throws FunctionException {
        FunctionWithResult f = null;
        if(mFunctionWithResult != null){
            f = mFunctionWithResult.get(funcName);
            if(f != null){
                if(c != null){
                    return c.cast(f.function());
                }else{
                    return (Result)f.function();
                }

            }
        }

        if(f == null){
            throw new FunctionException("没有此函数");
        }
        return null;
    }

    /**
     * 调用具有参数的函数
     * @param funcName
     * @param param
     * @param <Param>
     */
    public <Param> void invokeFunc(String funcName,Param param)throws FunctionException{
        FunctionWithParam f = null;
        if(mFunctionWithParam != null){
            f = mFunctionWithParam.get(funcName);
            if(f != null){
                f.function(param);
            }
        }


    }

    /**
     * 调用具有参数,同时具有返回值的函数
     * @param funcName
     * @param param
     * @param <Result>
     * @param <Param>
     * @return
     */
    public <Result,Param> Result invokeFuncWithResult(String funcName,Param param,Class<Result> c) throws FunctionException {
        FunctionWithParamAndResult f = null;
        if(mFunctionWithParamAndResult != null){
            f = mFunctionWithParamAndResult.get(funcName);
            if(f != null){
                if(c != null){
                    return c.cast(f.function(param));
                }else{
                    return (Result)f.function(param);
                }
            }
        }

        if( f == null){
            throw new FunctionException("没有此函数");

        }
        return null;
    }

    /**
     * 函数的参数,当函数的参数涉及到多个值时,可以用此类,
     * 此类使用规则:存参数与取参数的顺序必须一致,否则报错
     */
    public static class FunctionParams {

        private Bundle mParams = new Bundle(1);
        private int mIndex = -1;
        private Map mObjectParams = new HashMap(1);

        FunctionParams(Bundle mParams,Map mObjectParams){
            this.mParams = mParams;
            this.mObjectParams = mObjectParams;
        }

        public <Param> Param getObject(Class<Param> p){
            if(mObjectParams == null){
                return null;
            }
            return p.cast(mObjectParams.get((mIndex++) + ""));
        }

        /**
         * 获取int值
         * @return
         */
        public int getInt(){
            if(mParams != null){
                return mParams.getInt((mIndex++) + "");
            }
            return 0;
        }

        /**
         * 获取int值
         * @param defalut
         * @return
         */
        public int getInt(int defalut){
            if(mParams != null){
                return mParams.getInt((mIndex++) + "");
            }
            return defalut;
        }

        /**
         * 获取字符串
         * @param defalut
         * @return
         */
        public String getString(String defalut){
            if(mParams != null){
                return mParams.getString((mIndex++) + "");
            }
            return defalut;
        }

        /**
         * 获取字符串
         * @return
         */
        public String getString(){
            if(mParams != null){
                return mParams.getString((mIndex++) + "");
            }
            return null;
        }



        /**
         * 获取Boolean值
         * @return 默认返回false
         */
        public boolean getBoolean(){
            if(mParams != null){
                return mParams.getBoolean((mIndex++) + "");
            }
            return false;
        }

        /**
         * 该类用来创建函数参数
         */
        public static class FunctionParamsBuilder{
            private Bundle mParams ;
            private int mIndex = -1;
            private Map mObjectParams = new HashMap(1);

            public FunctionParamsBuilder(){

            }

            public FunctionParamsBuilder putInt(int value){
                if(mParams == null){
                    mParams = new Bundle(2);
                }
                mParams.putInt((mIndex++) + "", value);
                return this;
            }

            public FunctionParamsBuilder putString(String value){
                if(mParams == null){
                    mParams = new Bundle(2);
                }
                mParams.putString((mIndex++) + "", value);
                return this;
            }

            public FunctionParamsBuilder putBoolean(boolean value){
                if(mParams == null){
                    mParams = new Bundle(2);
                }
                mParams.putBoolean((mIndex++) + "", value);
                return this;
            }

            public  FunctionParamsBuilder putObject(Object value){

                if(mObjectParams == null){
                    mObjectParams = new HashMap(1);
                }
                mObjectParams.put((mIndex++) + "", value);
                return this;
            }

            public FunctionParams create(){
                FunctionParams instance = new FunctionParams(mParams,mObjectParams);
                return instance;
            }
        }

    }
}

使用

public class FirstFragment extends BaseFragment {
    public static FirstFragment newInstance() {
        return new FirstFragment();
    }

    /**
     * 没有参数没有返回值的函数
     */
    public static final String FUNCTION_NO_PARAM_NO_RESULT = "FUNCTION_NO_PARAM_NO_RESULT";
    /**
     * 没有参数有返回值的函数
     */
    public static final String FUNCTION_NO_PARAM_HAS_RESULT = "FUNCTION_NO_PARAM_HAS_RESULT";
    /**
     * 有参数没有返回值的函数
     */
    public static final String FUNCTION_HAS_PARAM_NO_RESULT = "FUNCTION_HAS_PARAM_NO_RESULT";
    /**
     * 有参数有返回值的函数
     */
    public static final String EVENT_HAS_PARAM_HAS_RESULT = "EVENT_HAS_PARAM_HAS_RESULT";

    /**
     * 具有多个参数的函数
     */
    public static final String FUNCTION_HAS_MORE_PARAM = "FUNCTION_HAS_MORE_PARAM";

    /**
     * 具有多个参数的函数
     */
    public static final String FUNCTION_HAS_MORE_PARAM_Bundle = "FUNCTION_HAS_MORE_PARAM_Bundle";

    private Button mBut1, mBut2, mBut3, mBut4;
    private TextView mResult;

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

    @Override
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        mBut1 = (Button) getView().findViewById(R.id.click1);
        mBut2 = (Button) getView().findViewById(R.id.click2);
        mBut3 = (Button) getView().findViewById(R.id.click3);
        mBut4 = (Button) getView().findViewById(R.id.click4);
        mResult = (TextView) getView().findViewById(R.id.result);

        mBut1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                try {
                    mFunctions.invokeFunc(FUNCTION_NO_PARAM_NO_RESULT);
                } catch (FunctionException e) {
                    e.printStackTrace();
                }
            }
        });

        mBut2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String result = null;
                try {
                    result = mFunctions.invokeFuncWithResult(FUNCTION_NO_PARAM_HAS_RESULT, String.class);
                } catch (FunctionException e) {
                    e.printStackTrace();
                }
                mResult.setText(result);
            }
        });
        mBut3.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                try {
                    mFunctions.invokeFunc(FUNCTION_HAS_PARAM_NO_RESULT, 100);
                } catch (FunctionException e) {
                    e.printStackTrace();
                }
            }
        });
        mBut4.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                List<String> re = null;
                try {
                    re = mFunctions.invokeFuncWithResult(EVENT_HAS_PARAM_HAS_RESULT, 100, List.class);
                } catch (FunctionException e) {
                    e.printStackTrace();
                }
                if (re != null) {
                    String st = "";
                    for (int i = 0; i < re.size(); i++) {
                        st += re.get(i)+" ";
                    }
                    mResult.setText(st);
                }
            }
        });

        getView().findViewById(R.id.click5).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                try {
                    mFunctions.invokeFunc(FUNCTION_HAS_MORE_PARAM, new Functions.FunctionParams.FunctionParamsBuilder().putString("你好")
                            .putString("我是fragment").putInt(200).create());
                } catch (FunctionException e) {
                    e.printStackTrace();
                }
            }
        });

        getView().findViewById(R.id.click6).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                try {
                    Bundle b = new Bundle();
                    b.putString("p","你好activity");
                    b.putString("p1","我是fragment");
                    b.putInt("p2", 200);
                    mFunctions.invokeFunc(FUNCTION_HAS_MORE_PARAM_Bundle,b);
                } catch (FunctionException e) {
                    e.printStackTrace();
                }
            }
        });
    }

FirstActivity.java

public class FirstActivity extends BaseActivity {
    @Override
    public void setFunctionsForFragment(int fragmentId) {
        super.setFunctionsForFragment(fragmentId);
        switch (fragmentId) {
            case R.id.fragment_main:
                FragmentManager fm = getSupportFragmentManager();
                BaseFragment fragment = (BaseFragment) fm.findFragmentById(fragmentId);
                fragment.setFunctions(new Functions().addFunction(new Functions.FunctionNoParamAndResult(FirstFragment.FUNCTION_NO_PARAM_NO_RESULT) {
                    @Override
                    public void function() {
                        Toast.makeText(FirstActivity.this, "成功调用无参无返回值方法", Toast.LENGTH_LONG).show();
                    }
                }).addFunction(new Functions.FunctionWithResult<String>(FirstFragment.FUNCTION_NO_PARAM_HAS_RESULT) {
                    @Override
                    public String function() {
                        Toast.makeText(FirstActivity.this, "成功调用无参有返回值方法", Toast.LENGTH_LONG).show();
                        return "恭喜你,调我成功!";
                    }
                }).addFunction(new Functions.FunctionWithParam<Integer>(FirstFragment.FUNCTION_HAS_PARAM_NO_RESULT) {
                    @Override
                    public void function(Integer o) {
                        Toast.makeText(FirstActivity.this, "成功调用有参无返回值方法 参数值=" + o, Toast.LENGTH_LONG).show();
                    }
                }).addFunction(new Functions.FunctionWithParamAndResult<List, Integer>(FirstFragment.EVENT_HAS_PARAM_HAS_RESULT) {

                    @Override
                    public List function(Integer data) {
                        Toast.makeText(FirstActivity.this, "成功调用有参有返回值方法 参数值=" + data, Toast.LENGTH_LONG).show();
                        List<String> result = new ArrayList<String>();
                        result.add("1");
                        result.add("2");
                        result.add("3");
                        return result;
                    }
                }).addFunction(new Functions.FunctionWithParam<Functions.FunctionParams>(FirstFragment.FUNCTION_HAS_MORE_PARAM) {

                    @Override
                    public void function(Functions.FunctionParams functionParams) {
                        if (functionParams != null) {

                            Toast.makeText(FirstActivity.this, "成功调用多个参数的方法 参数值=" + functionParams.getString()+" 参数1="+functionParams.getString()+" 参数2="+functionParams.getInt(), Toast.LENGTH_LONG).show();
                        }
                    }
                }).addFunction(new Functions.FunctionWithParam<Bundle>(FirstFragment.FUNCTION_HAS_MORE_PARAM_Bundle) {

                    @Override
                    public void function(Bundle bundle) {
                        if(bundle != null){
                            Toast.makeText(FirstActivity.this, "成功调用多个参数的方法 参数值=" + bundle.getString("p")+" 参数1="+bundle.getString("p1")+" 参数2="+bundle.getInt("p2"), Toast.LENGTH_LONG).show();

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

布局文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent" android:layout_height="match_parent">

    <fragment
        android:name="com.hk.netdemo.fragment.FirstFragment"
        android:id="@+id/fragment_main"
        android:layout_width="match_parent"
        android:layout_height="match_parent"></fragment>
</LinearLayout>
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent" android:layout_height="match_parent"
    android:orientation="vertical">

    <TextView
        android:id="@+id/result"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:text="视察的结果"/>
    <Button
        android:id="@+id/click1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="调用activity方法(没有参数与返回值)"/>
    <Button
        android:id="@+id/click2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="调用activity方法(没有参数有返回值)"/>
    <Button
        android:id="@+id/click3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="调用activity方法(有参数没有返回值)"/>
    <Button
        android:id="@+id/click4"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="调用activity方法(有参数有返回值)"/>
    <Button
        android:id="@+id/click5"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="调用activity方法(有多个参数没有返回值)"/>
    <Button
        android:id="@+id/click6"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="调用activity方法(有多个参数没有返回值)"/>
</LinearLayout>

四、问题点

4.1 Activity 如何传递数据到 Fragment?

答:采用 Bundle 方式。

  • 步骤1:Activity 的布局文件
<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:id="@+id/fragment_container"
        android:layout_width="match_parent"
        android:layout_height="500dp"/>
</LinearLayout>
  • 步骤2:设置 Fragment 的布局文件
<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="@color/colorAccent"
    >

    <TextView
        android:id="@+id/fragment"
        android:text="我是fragment"
        android:layout_gravity="center"
        android:textSize="30dp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        />

    <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发送消息" />

    <Button
        android:id="@+id/button"
        android:layout_gravity="center"
        android:text="点击接收Activity消息"
        android:layout_centerInParent="true"
        android:textSize="20dp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
</LinearLayout>
  • 步骤3:设置 Activity 的类文件
public class Activity2Fragment extends AppCompatActivity {

    TextView text;

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

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

        // 步骤1:获取FragmentManager
        FragmentManager fragmentManager = getFragmentManager();

        // 步骤2:获取FragmentTransaction
        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();

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

        // 步骤4:创建Bundle对象
        // 作用:存储数据,并传递到Fragment中
        Bundle bundle = new Bundle();

        // 步骤5:往bundle中添加数据
        bundle.putString("message", "I love Google");

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

        // 步骤7:动态添加fragment
        // 即将创建的fragment添加到Activity布局文件中定义的占位符中(FrameLayout)
        fragmentTransaction.add(R.id.fragment_container, fragment);
        fragmentTransaction.commit();


    }
}
  • 步骤4:设置 Fragment 的类文件
public class mFragment extends Fragment {
    Button button;
    TextView text;
    Bundle bundle;
    String message;

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

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

        // 步骤1:通过getArgments()获取从Activity传过来的全部值
        bundle = this.getArguments();

        // 步骤2:获取某一值
        message = bundle.getString("message");

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

                // 显示传递过来的值
                text.setText(message);

            }
        });

        return contentView;
    }
}

4.2 Fragment 如何传递数据到 Activity ?

答:采用 接口回调 方式。

  • 步骤1:在Activity的布局文件定义1占位符(FrameLayout)
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="scut.carson_ho.fragment_2_activity.MainActivity">

    <TextView
        android:id="@+id/text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="20dp"
        android:text="等待Fragment发送消息" />

    <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_container"
        android:layout_width="match_parent"
        android:layout_height="500dp"/>

</RelativeLayout>
  • 步骤2:设置 Fragment 的布局文件
<?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:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@color/colorAccent"/>

</LinearLayout>
  • 步骤3:设置回调接口
public interface ICallBack {
    void get_message_from_Fragment(String string);

}
  • 步骤4:设置 Fragment 的类文件
public class mFragment extends Fragment {

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

    // 设置 接口回调 方法
    public void sendMessage(ICallBack callBack){

        callBack.get_message_from_Fragment("消息:我来自Fragment");

    }
}
  • 步骤5:设置 Acticvity 的类文件
public class MainActivity extends AppCompatActivity {

    Button button;
    TextView text;

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

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

        // 步骤1:获取FragmentManager
        FragmentManager fragmentManager = getFragmentManager();

        // 步骤2:获取FragmentTransaction
        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();

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

        // 步骤4:动态添加fragment
        // 即将创建的fragment添加到Activity布局文件中定义的占位符中(FrameLayout)
        fragmentTransaction.add(R.id.fragment_container, fragment);
        fragmentTransaction.commit();


        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                // 通过接口回调将消息从fragment发送到Activity
                fragment.sendMessage(new ICallBack() {
                    @Override
                    public void get_message_from_Fragment(String string) {
                            text.setText(string);
                    }
                });

            }
        });
    }


}
  • 3
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 9
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Kevin-Dev

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值