【发布时间】:2019-10-08 15:42:04
【问题描述】:
好的,我有一个简单的问题。以下是在 Fragment 之间进行通信的一种非常简单且基本的方法,但我从未见过有人使用它。我想知道使用这种方法有什么缺点。如果有人有任何cmets,请在答案中告诉我。谢谢
public class MyActivity extends Activity {
FragmentOne fragmentOne;
FragmentTwo fragmentTwo;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
private void showFragment(Fragment fragment) {
getSupportFragmentManager().beginTransaction().replace(R.id.fragment, fragment).commit();
}
public void showFragmentOne() {
if(fragmentOne == null){
fragmentOne = FragmentOne();
}
showFragment(fragmentOne);
}
public void showFragmentTwo(String name) {
if(fragmentTwo == null)
fragmentTwo = new FragmentTwo();
fragmentTwo.setData(name);
showFragment(fragmentTwo);
}
}
片段一的代码:
public class FragmentOne extends Fragment {
private MyActivity myActivity;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
super.onCreateView(inflater, container, savedInstanceState);
myActivity = getActivity() instanceOf MyActivity ? (MyActivity) getActivity() : null;
button.setOnClickListener(() -> {
if(myActivity != null)
myActivity.showFragmentTwo(editText.getText().toString()); //assuming there's an edit text
}
return inflater.inflate(R.layout.fragment_one, container, false);
}
以及 fragmentTwo 的代码
public class FragmentTwo extends Fragment {
private String name;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
textView.setText(name); //assuming there's a textview
return inflater.inflate(R.layout.fragment_two, container, false);
}
public void setData(String name){
this.name = name;
}
}
附:请忽略缩进等,我没有复制这段代码,我实际上输入了整个内容。
【问题讨论】:
-
主要缺点是您将片段和活动硬连接在一起。从那时起,
FragmentOne不能用于不同的活动(会有一个 NPE),这对我来说违背了将其作为片段开始的目的:你可以只使用视图布局。 -
同意,但其他活动也可以有一个 FragmentOne 对象,并且 FragmentOne 可以有多个活动对象并根据哪个活动托管它来执行方法。在我的应用程序中,用户登录后,他总是在进行一项活动。除此之外还有什么?
标签: java android android-activity fragment communication