我目前正在玩弄与和fragment
相关的生命周期。ViewModel
LiveData
我有2fragments
和. 我在 each 的方法中添加了。 fragmentA
fragmentB
Observer
onCreate
fragment
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
sharedViewModel = ViewModelProviders.of(getActivity()).get(SharedViewModel.class);
sharedViewModel.getText().observe(this, new Observer<CharSequence>() {
@Override
public void onChanged(CharSequence charSequence) {
editText.setText(charSequence);
}
});
}
每个fragment
都有一个按钮,可以LiveData
在共享中更改ViewModel
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
[...]
buttonOk.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
sharedViewModel.setText(editText.getText());
}
});
[...]
}
SharedViewModel
:
public class SharedViewModel extends ViewModel {
private MutableLiveData<CharSequence> text = new MutableLiveData<>();
public void setText(CharSequence input) {
text.setValue(input);
}
public LiveData<CharSequence> getText() {
return text;
}
}
当我单击一个按钮时,我会替换另一个按钮fragment
。
public class MainActivity extends AppCompatActivity {
Fragment fragmentA = new FragmentA();
Fragment fragmentB = new FragmentB();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (savedInstanceState == null) {
getSupportFragmentManager().beginTransaction()
.add(R.id.container_a, fragmentA)
.commit();
}
}
public void switchToA(View v) {
getSupportFragmentManager().beginTransaction()
.replace(R.id.container, fragmentA)
.commit();
}
public void switchToB(View v) {
getSupportFragmentManager().beginTransaction()
.replace(R.id.container, fragmentB)
.commit();
}
}
Replace
导致它被完全销毁并在下次添加时再次fragment
运行它的方法。onCreate
我可以确认onCreate
每个fragment
放置在屏幕上的都调用它并Observer
添加。但是,一旦我替换了 afragment
并重新添加了它,它就完全停止在onChanged
. 甚至是它自己发送的那些。onChanged
只是不再触发。我不明白为什么。
编辑:
我实际上发现类中的后续if
检查LiveData
返回我第二次尝试添加Observer
(在替换fragment
第一个之后):
@MainThread
public void observe(@NonNull LifecycleOwner owner, @NonNull Observer<? super T> observer) {
assertMainThread("observe");
if (owner.getLifecycle().getCurrentState() == DESTROYED) {
// ignore
return;
}
因此,Observer
不再添加。为什么我尝试重新添加时getCurrentState()
返回?DESTROYED
fragment
简而言之:Observer
删除时删除了,但下次添加片段时fragment
不会添加另一个。Observer