如图在Afragment的布局中点击按钮传递值到Bfragment中显示出来。
首先要明确一点Fragment与Fragment传值跟Activity传值有所不一样,不能单纯通过Intent.putExtra和getIntent.getXXXExtra传值和取值,我这里用的是自定义广播,在AFragment里面设置Action并发送广播,通过所在的 xxxActivity注册接收值,在把值设置给BFragment(不能直接在BFragment里面注册接收广播,无法接收到值),我这里是点击A,B,C按钮切换对应的Fragment,当A里面有item也是Fragment的时候(也就是Fragment嵌套Fragment的时候也可以用广播来传值)当然还有其它的方式,代码如下
MainActivity 里面的代码
public class MainActivity extends Activity {
public Afragment mAFragment;
protected Bfragment mBFragment;
protected Cfragment mCFragment;
public static final String TODETAIL_ACTION = "detail";// 广播action
private MyBoradcast broadcast;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//初始化Fragment
mAFragment = new Afragment();
mBFragment = new Bfragment();
mCFragment = new Cfragment();
// 动态注册广播
IntentFilter filter = new IntentFilter();
filter.addAction(TODETAIL_ACTION);
broadcast = new MyBoradcast();
registerReceiver(broadcast, filter);
}
//切换Fragment的方法
public void replaceView(Fragment f) {
FragmentManager manager = getFragmentManager();
FragmentTransaction transaction = manager.beginTransaction();
transaction.replace(R.id.fl, f);
transaction.commit();
}
//点击A按钮切换mAFragment
public void AClick(View v) {
replaceView(mAFragment);
}
//点击B按钮切换mBFragment
public void BClick(View v) {
replaceView(mBFragment);
}
public void CClick(View v) {
replaceView(mCFragment);
}
// 自定义广播接受者
class MyBoradcast extends BroadcastReceiver {
private String docId;
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals("detail")) {
docId = intent.getStringExtra("value");
mBFragment.setDocId(docId);
}
}
}
@Override
//解绑广播
public void onDestroy() {
unregisterReceiver(broadcast);
super.onDestroy();
}
}
Afragment里面的代码
public class Afragment extends Fragment implements OnClickListener {
public String docId = "12";//要传的值
private Button btn;
public void setDocId(String docId) {
this.docId = docId;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view= inflater.inflate(R.layout.storage_view, null);
btn = (Button)view.findViewById(R.id.btn);
return view;
}
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
btn.setOnClickListener(this);
}
@Override
public void onClick(View v) {
Intent intent=new Intent();
intent.putExtra("value", docId);
//设置Action
intent.setAction(MainActivity.TODETAIL_ACTION);
//发送广播
getActivity().sendBroadcast(intent);
}
}
Bfragment里面的代码
public class Bfragment extends Fragment {
private String docId;
private TextView tv_value;
public void setDocId(String docId) {
this.docId = docId;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
return inflater.inflate(R.layout.sound_view, null);
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
tv_value=(TextView)getActivity().findViewById(R.id.tv_value);
tv_value.setText(docId);
}
}
关于传值补充二点
第一 从first Activity传值给sencond Activity里面的Fragment或Fragment的子类Fragment,可以在接收值的Fragment里面
Intent intent = getActivity().getIntent();
userName = intent.getStringExtra("userName");即可
第二 Fragment获取当前Activity中的方法或者变量只需((xxActivity)getActivity).xxxvalue 或((xxActivity)getActivity).xxxMethod()