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);
}
}