》》setArguments传值:
将Activity的内部值传给对应的Fragment,但是这个方法存在很多局限性,必须在New 一个新的片段的后面跟着这个方法才能传值。
transaction = manager.beginTransaction();
MyFragment_home fragment_home = new MyFragment_home();
//传递数据的过程
Bundle setargs = new Bundle();
setargs.putString("value", "在Activity里的值");
fragment_home.setArguments(setargs);
//transaction.replace(R.id.content, fragment_home);
transaction.commit();
对应的fragment:
package fragments;
import android.app.Fragment;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;
import com.girls.tiffany270.fragment_.R;
/**
* Created by Tiffany270 on 2017/11/9.
*/
public class MyFragment_home extends Fragment {
private Button btnvaluenp;
private TextView tvvalue;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_home, null);
tvvalue = (TextView) view.findViewById(R.id.tvvalue);
//如果你要设置点击事件
btnvaluenp = (Button) view.findViewById(R.id.btnvalue);
btnvaluenp.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//接收的值
Bundle getargs = getArguments();
if(getargs!=null){
String value = getargs.getString("value");
tvvalue.setText("接收到了: "+value);
}
}
});
return view;
}
}
实现的效果
》》通过TAG方法(感觉放初始化片段的位置很微妙)
如果你是静态添加就更方便了,可以通过findbyid直接指定片段,再引用片段里的方法也可以,这里不写了
在Fragment里写一个方法
private String str;
public void setStr(String str){
this.str = str;
}
Main里
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
init();
manager = getFragmentManager();
transaction = manager.beginTransaction();
transaction.add(R.id.content, new MyFragment_shop(),"shop");
transaction.commit();
}
给按钮添加一个方法
public void pass(View view){
MyFragment_shop _shop = (MyFragment_shop) manager.findFragmentByTag("shop");
_shop.setStr("...");
}
回到fragmeng里
if (str!=null){
tvvalue.setText("收到的值 "+str);
}else{
tvvalue.setText("值为空");
}
另外的方法:
》》用接口回调的方法传值:官网的说法如下,也就是fragmeng之间的交互
官网的例子说得很好,有点费解,因为和回调有关,先展示我的例子
在Fragment里定义一个接口
public interface PlayListener {
public void play(String str);
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
// 确认容器 Activity 已实现该回调接口。否则,抛出异常
try {
listener = (PlayListener) activity;
} catch (ClassCastException e) {
throw new ClassCastException(activity.toString()
+ " must implement PlayListener");
}
}
这里接口没有具体实现,我选择点击一个按钮然后将一串字符串穿进去
btn = (Button) view.findViewById(R.id.btn);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
listener.play("这里是paly");
}
});
然后我们在Activity里去实现这个接口并给出具体的指示
public class MainActivity extends Activity implements View.OnClickListener,MyFragment_play.PlayListener{
....
@Override
public void play(String str) {
Log.i("tag",str);
}
这个时候我的控制台会输入你在Fragmeng里传入的字符
然后我们来看官方的例子
在fragment里定义了一个接口,
public class HeadlinesFragment extends ListFragment {
OnHeadlineSelectedListener mCallback;
// 容器 Activity 必须实现该接口
// (译注:“容器 Activity”意即“包含该 Fragment 的 Activity”)
public interface OnHeadlineSelectedListener {
public void onArticleSelected(int position);
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
// 确认容器 Activity 已实现该回调接口。否则,抛出异常
try {
mCallback = (OnHeadlineSelectedListener) activity;
} catch (ClassCastException e) {
throw new ClassCastException(activity.toString()
+ " must implement OnHeadlineSelectedListener");
}
}
这里也是在fragment里,当点击某一个条目的时候触发
@Override
public void onListItemClick(ListView l, View v, int position, long id) {
// 向宿主 Activity 传送事件
mCallback.onArticleSelected(position);
}
转到Activity里,在这个复写的方法里,就可以进行你想进行的操作了,因为fragmeng已经告诉了你用户选择了什么,你只需要对这个动作做出对应的活动即可
public static class MainActivity extends Activity
implements HeadlinesFragment.OnHeadlineSelectedListener{
...
public void onArticleSelected(int position) {
// 用户从 HeadlinesFragment 选择了一篇文章的标题
// 在这里做点什么,以显示该文章
}
}
将你收到的数据做出相应的展示。
ublic static class MainActivity extends Activity
implements HeadlinesFragment.OnHeadlineSelectedListener{
...
public void onArticleSelected(int position) {
// 用户从 HeadlinesFragment 选择了一篇文章的标题
// 在这里做点什么,以显示该文章
ArticleFragment articleFrag = (ArticleFragment)
getSupportFragmentManager().findFragmentById(R.id.article_fragment);
if (articleFrag != null) {
// 若 articleFrag 有效,则表示我们正在处理两格布局(two-pane layout)……
// 调用 ArticleFragment 的方法,以更新其内容
articleFrag.updateArticleView(position);
} else {
// 否则,我们正在处理单格布局(one-pane layout)。此时需要 swap frags...
// 创建 Fragment,向其传递包含被选文章的参数
ArticleFragment newFragment = new ArticleFragment();
Bundle args = new Bundle();
args.putInt(ArticleFragment.ARG_POSITION, position);
newFragment.setArguments(args);
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
// 无论 fragment_container 视图里是什么,用该 Fragment 替换它。并将
// 该事务添加至回栈,以便用户可以往回导航(译注:回栈,即 Back Stack。
// 在有多个 Activity 的 APP 中,将这些 Activity 按创建次序组织起来的
// 栈,称为回栈)
transaction.replace(R.id.fragment_container, newFragment);
transaction.addToBackStack(null);
// 执行事务
transaction.commit();
}
}
}