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

xiaoxiao2021-02-27  227

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


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

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

利用接口实现发信Fragment与Activity通 信将要传递的内容通过接口传递给Activity.再由activity启动收信Fragment时,将信作为收信Fragment的Arguments,传递给收信Fragment.收信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); } }
转载请注明原文地址: https://www.6miu.com/read-13701.html

最新回复(0)