Android官方培训课-Fragment间的通信

来源:互联网 发布:网络互动活动 编辑:程序博客网 时间:2024/04/27 22:41

Author : jianlong.zhang
Date : 6/6/2017
Desc : 官方培训课程学习,Communicating with other fragment(fragment之间的通信)。
Thanks: Goole 官方培训教程


Tab:
* 这节官方课程其实用处不是很大,因为我们可能会用第三方通信。
* new fragment实例的时候要使用无参函数
* 想要传递参数,要是用setArguments()来传递

这里简单介绍一下官方的思路。

  1. 利用接口实现发信Fragment与Activity通 信将要传递的内容通过接口传递给Activity.
  2. 再由activity启动收信Fragment时,将信作为收信Fragment的Arguments,传递给收信Fragment.
  3. 收信fragment启动后在onCreateView()方法中,通过getAguments获取信得内容。

发信接口

  • 在发信fragment中创建 接口。
 interface MessageHandler {        void handMessage(String message);    }
  • 让activity 实现接口
  • 将信 作为arguments 设置给收信Fragment
  SecFragment instance = new SecFragment();        Bundle bundle = new Bundle();        bundle.putString(MESSAGE, message);        instance.setArguments(bundle);
  • 收信fragment 接收信
        String message = getArguments().getString(MESSAGE);

完整代码如下:

  • 发信fragment
package com.zhouzhouwang88.shoppingclient.test;import android.content.Context;import android.os.Bundle;import android.support.annotation.Nullable;import android.support.v4.app.Fragment;import android.text.TextUtils;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.Button;import android.widget.EditText;import com.zhouzhouwang88.shoppingclient.R;/** * A simple {@link Fragment} subclass. */public class FirstFragment extends Fragment implements View.OnClickListener {    public static String TAG = "FirstFragment";    private EditText contentEd;    private Button sendBtn;    private MessageHandler callBack;    @Override    public void onClick(View v) {        if (TextUtils.isEmpty(contentEd.getText().toString())) {            callBack.handMessage("没有输入值");            return;        }        callBack.handMessage(contentEd.getText().toString());    }    interface MessageHandler {        void handMessage(String message);    }    @Override    public void onAttach(Context context) {        super.onAttach(context);        callBack = (FragmentStudyActivity) context;    }    public static FirstFragment instance() {        return new FirstFragment();    }    @Override    public View onCreateView(LayoutInflater inflater, ViewGroup container,                             Bundle savedInstanceState) {        // Inflate the layout for this fragment        return inflater.inflate(R.layout.fragment_first, container, false);    }    @Override    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {        super.onViewCreated(view, savedInstanceState);        contentEd = (EditText) view.findViewById(R.id.ed_content);        sendBtn = (Button) view.findViewById(R.id.btn_send_content);        sendBtn.setOnClickListener(this);    }}
  • activity实现接口
package com.zhouzhouwang88.shoppingclient.test;import android.os.Bundle;import android.support.v4.app.Fragment;import android.support.v4.app.FragmentActivity;import android.util.Log;import android.view.View;import android.widget.Button;import android.widget.FrameLayout;import com.zhouzhouwang88.shoppingclient.R;public class FragmentStudyActivity extends FragmentActivity implements View.OnClickListener, FirstFragment.MessageHandler {    private FrameLayout fragmentContainer;    private Button showFirstBtn, showSecBtn;    private FirstFragment mFirstFragment;    private SecFragment mSecFragment;    private String message;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_fragment_study);        fragmentContainer = (FrameLayout) findViewById(R.id.fl_fragment_container);        showFirstBtn = (Button) findViewById(R.id.btn_show_first);        showSecBtn = (Button) findViewById(R.id.btn_show_sec);        showFirstBtn.setOnClickListener(this);        showSecBtn.setOnClickListener(this);        mFirstFragment = FirstFragment.instance();        if (null != fragmentContainer) {            mFirstFragment.setArguments(getIntent().getExtras());            getSupportFragmentManager()                    .beginTransaction()                    .add(fragmentContainer.getId(), mFirstFragment, FirstFragment.TAG)                    .commitAllowingStateLoss();        }    }    @Override    public void onClick(View v) {        switch (v.getId()) {            case R.id.btn_show_first:                showSelectFragment(FirstFragment.instance());                break;            case R.id.btn_show_sec:                showSelectFragment(SecFragment.instance(message));                break;        }    }    private <T extends Fragment> void showSelectFragment(T fragment) {        if (fragment.isAdded()) {            return;        }        getSupportFragmentManager()                .beginTransaction()                .replace(fragmentContainer.getId(), fragment)                .addToBackStack(null)//允许fragment回退                .commitAllowingStateLoss();    }    @Override    public void handMessage(String message) {        this.message = message;    }}
  • 收信fragment
package com.zhouzhouwang88.shoppingclient.test;import android.os.Bundle;import android.support.annotation.Nullable;import android.support.v4.app.Fragment;import android.util.Log;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import com.zhouzhouwang88.shoppingclient.R;/** * A simple {@link Fragment} subclass. */public class SecFragment extends Fragment {    public static String TAG = "SecFragment";    public static final String MESSAGE = "MESSAGE";    public static SecFragment instance() {        return new SecFragment();    }    public static SecFragment instance(String message) {        SecFragment instance = new SecFragment();        Bundle bundle = new Bundle();        bundle.putString(MESSAGE, message);        instance.setArguments(bundle);        return instance;    }    @Override    public void onCreate(@Nullable Bundle savedInstanceState) {        super.onCreate(savedInstanceState);    }    @Override    public View onCreateView(LayoutInflater inflater, ViewGroup container,                             Bundle savedInstanceState) {        // Inflate the layout for this fragment        String message = getArguments().getString(MESSAGE);        Log.d(TAG, message);        return inflater.inflate(R.layout.fragment_sec, container, false);    }}
原创粉丝点击