我正在使用Android架构组件。我想要的是当用户在Edittext中键入"0“并点击按钮来替换新的片段时,如果键入任何其他内容,则发布Toast错误消息。问题是,当我从新的Fragment(BlankFragment)
返回并再次单击按钮并再次键入"0“并单击时,会多次调用onchange()
,因此会多次创建片段
FragmentExample.class:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
manager = getActivity().getSupportFragmentManager();
viewmModel = ViewModelProviders.of(getActivity(), viewModelFactory)
.get(VModel.class);
View v = inflater.inflate(R.layout.fragment_list, container, false);
b = (Button) v.findViewById(R.id.b);
et = (EditText) v.findViewById(R.id.et);
viewmModel.observeData().observe(getActivity(), new Observer<String>() {
@Override
public void onChanged(@Nullable String s) {
if(s.equals("0")) {
BlankFragment fragment = (BlankFragment) manager.findFragmentByTag(DETAIL_FRAG);
if (fragment == null) {
fragment = BlankFragment.newInstance();
}
addFragmentToActivity(manager,
fragment,
R.id.root_activity_detail,
DETAIL_FRAG
);
} else {
Toast.makeText(getContext(), "Wrong text", Toast.LENGTH_SHORT).show();
}
}
});
b.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
viewmModel.setData(et.getText().toString());
}
});
return v;
}
private void addFragmentToActivity(FragmentManager fragmentManager, BlankFragment fragment, int root_activity_detail, String detailFrag) {
android.support.v4.app.FragmentTransaction transaction = fragmentManager.beginTransaction();
transaction.replace(root_activity_detail, fragment, detailFrag).addToBackStack(detailFrag);
transaction.commit();
}
存储库类:
public class Repository {
MutableLiveData<String> dataLive = new MutableLiveData<>();
public Repository() {
}
public void setListData(String data) {
dataLive.setValue(data);
}
public MutableLiveData<String> getData() {
return dataLive;
}
}
BlankFragment.class:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
listItemViewModel = ViewModelProviders.of(this, viewModelFactory)
.get(VModel.class);
listItemViewModel.setData("");
return inflater.inflate(R.layout.fragment_blank, container, false);
}
发布于 2018-03-07 14:30:33
发布于 2018-05-09 02:33:11
您应该使用LifecycleOwner,而不是使用getActivity
作为片段。
变化
viewModel.observeData().observe(getActivity(), new Observer<String>() {
至
viewModel.observeData().removeObservers(this);
viewModel.observeData().observe(this, new Observer<String>() {
发布于 2018-03-07 07:37:54
您不应该在onCreateView
中创建viewmModel
,而应该在onCreate
中创建,这样就不会在每次创建视图时都向数据添加侦听器。
https://stackoverflow.com/questions/48914311
复制相似问题