【发布时间】:2017-07-20 13:51:39
【问题描述】:
我的应用有一个活动 A 和两个片段 F1 和 F2。
在F1中单击按钮,将F1替换为F2。 我想将 F1 中的数据传输到 F2。为此,我在 F1 中实现了接口,并在 A 中覆盖了它的方法。
但是当将数据从 A 发送到 F2 时,我对 F2 的引用(代码 A 中的 sFragment)仍然为空,因此数据没有发送到 F2 .我在用 F2 替换 F1 时使用提供的 TAG 来引用 F2。
它是否与生命周期有关,例如当我尝试获取尚未创建的 F2 的引用时?
F1
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
View v = inflater.inflate(R.layout.form_fragment1,container,false);
nextB = (Button) v.findViewById(R.id.f1Next);
nextB.setOnClickListener(this);
return v;
}
@Override
public void onClick(View view) {
switch (view.getId()){
case R.id.f1Next:
SFragment fragment = new SFragment();
FragmentManager mManager = getFragmentManager();
FragmentTransaction mTransaction = mManager.beginTransaction();
mTransaction.replace(R.id.fragment_container,fragment,"SecondF"); // SecondF
mTransaction.addToBackStack(null); // this is required to move to the previous fragment
mTransaction.commit();
commListener.PlaceName(data1,data2); //passing value to activity
break;
}
}
interface CommBridge{
void PlaceName(String data1,String data2);
}
@Override
public void onAttach(Context context){
super.onAttach(context);
if (context instanceof CommBridge){
commListener= (CommBridge) context;
}
}
}
一个
@Override
public void PlaceName(String data1, String data2) {
SFragment sFragment=(SFragment) getFragmentManager().findFragmentByTag("SecondF");
if (sFragment != null && sFragment.isInLayout()){
Log.d("STATE","1");
sFragment.setPlace(data1,data2);
}else{
Log.d("STATE","2"); // this is always the case
}
F2
public class SFragment extends Fragment {
String Place2,Place1;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
View v = inflater.inflate(R.layout.form_fragment2,container,false);
return v;
}
void setPlace(String data1, String data2){
place1 = data1;
place2 = data2;
}
}
【问题讨论】:
-
您应该使用
Bundle将数据从一个片段发送到另一个片段。
标签: android android-fragments android-lifecycle fragment-lifecycle