Android 如何通过接口控制另一个片段中片段的视图
我正在构建一个meme生成器应用程序。它有Android 如何通过接口控制另一个片段中片段的视图,android,android-fragments,fragment,communication,Android,Android Fragments,Fragment,Communication,我正在构建一个meme生成器应用程序。它有2个片段 第一个片段下面有2个文本视图和一个图像视图。 第二个片段有两个编辑文本和两个按钮 第一个片段中的ImageView(可单击)有一个占位符图像 1-如果未选择其他图像,我想将第二个片段中提到的视图的可见性更改为“已消失” 2-我想通过检查可绘制文件的名称来实现这一点 我被告知我应该为此使用一个接口 如何使用界面执行订单 下面是我在同一个应用程序中使用的界面示例。我想知道怎样做才能有所不同 public class BottomControlsFr
2个片段
第一个片段下面有2个文本视图
和一个图像视图
。第二个片段有两个编辑文本和两个按钮 第一个片段中的ImageView(可单击)有一个占位符图像 1-如果未选择其他图像,我想将第二个片段中提到的视图的可见性更改为“已消失” 2-我想通过检查可绘制文件的名称来实现这一点 我被告知我应该为此使用一个接口 如何使用界面执行订单 下面是我在同一个应用程序中使用的界面示例。我想知道怎样做才能有所不同
public class BottomControlsFragment extends Fragment {
EditText topEditText, bottomEditText;
Button btnCreate, btnReset;
BottomControlsListener activityCommander;
public interface BottomControlsListener{ void createMeme(String top, String bottom);}
@Override
public void onAttach(Context context) {
super.onAttach(context);
try{activityCommander = (BottomControlsListener) context;}
catch (ClassCastException e){throw new ClassCastException(context.toString());}
}
}您应该使用LocalBroadCast或viewModel,不要使用接口回调通信,当片段管理器想要独立启动片段时,它会导致问题
LocalBroadcastManager
实例在onResume中注册广播接收器,并在onPause
LocalBroadcastManager
实例,在第二帧onResume
中注册操作时,检查第一个片段中的差异图像。有关更多信息,请在谷歌上查看示例更新:如果你想使用界面,正如谷歌文档所说: 建议在片段之间进行通信的方法是创建共享的ViewModel对象。这两个片段都可以通过其包含活动访问ViewModel。片段可以更新ViewModel中的数据,如果数据是使用LiveData公开的,则新状态将被推送到另一个片段,只要它正在观察来自ViewModel的LiveData。要了解如何实现这种通信,请阅读《ViewModel指南》中的“片段间共享数据”部分 我建议你也这样做。这是如何做到的 首先,您需要创建viewModel:
public class SharedViewModel extends ViewModel {
private final MutableLiveData<Item> selected = new MutableLiveData<Item>();
public void select(Item item) {
selected.setValue(item);
}
public LiveData<Item> getSelected() {
return selected;
}
}
使用起来很轻松。如果您有任何问题,请告诉我。这些碎片是否同时可见??或者用第一个替换第二个?它们同时可见。一个是ImageView支架,另一个只是编辑文本和按钮,用于向图像添加标题。可能重复@OnurOzbek我已向anwerI添加了说明。我要求演示。问题不是在真空中“两个片段之间通信”。如何控制另一个片段中的视图?我在YouTube上看到的例子都是关于将文本从一个片段发送到另一个片段的。我想知道在其他片段中控制视图背后的策略。
public class TopImageFragment extends Fragment {
...
public void setMemeText(String top, String bottom){
topTextView.setText(top);
bottomTextView.setText(bottom);
}
...
public class SharedViewModel extends ViewModel {
private final MutableLiveData<Item> selected = new MutableLiveData<Item>();
public void select(Item item) {
selected.setValue(item);
}
public LiveData<Item> getSelected() {
return selected;
}
}
public class FirstFragment extends Fragment {
private SharedViewModel model;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
model = ViewModelProviders.of(getActivity()).get(SharedViewModel.class);
itemSelector.setOnClickListener(item -> {
model.select(item);
});
}
}
public class SecondFragment extends Fragment {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
SharedViewModel model = ViewModelProviders.of(getActivity()).get(SharedViewModel.class);
model.getSelected().observe(this, { item ->
// Update the UI.
});
}
}