我有两个片段:FragmentA和FragmentB。这两个片段的代码基本相同,如下所示:
public class FragmentB extends Fragment{
private TextView textView;
private EditText editText;
private Button button;
boolean visible = true;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState){
final View rootView = inflater.inflate(R.layout.test_fragment, container, false);
if (textView != null)
Log.e("FragmentB", "Text was: " + textView.getText().toString());
textView = (TextView) rootView.findViewById(R.id.textView);
editText = (EditText) rootView.findViewById(R.id.editText);
button = (Button) rootView.findViewById(R.id.button);
((TextView)rootView.findViewById(R.id.fragment)).setText("Fragment B");
button.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v){
Log.e("FragmentB", "Set text: " + editText.getText());
textView.setText(editText.getText());
visible = !visible;
textView.setVisibility(visible ? View.VISIBLE : View.INVISIBLE);
}
});
Log.e("FragmentB", "Text now: " + textView.getText());
return rootView;
}
}为了在这两个片段之间切换,我调用fragmentTransaction.replace(R.id.main_content_frame, currentFragment);,其中currentFragment是在应用程序启动时创建的同一个实例。问题是,每当我按下FragmentB中的按钮以隐藏TextView,切换到FragmentA,然后返回到FragmentB,TextView就会再次可见,尽管我仍然希望被隐藏。另外,如果我再重复一次,那么TextView中的文本也会被重置,但是只有在来回两次之后才会被重置。
在片段之间切换时,我如何保持它们的状态?
我尝试过使用onSaveInstanceState()和onViewStateRestored(),但是onViewStateRestored()一直被调用,Bundle设置为null。为什么会发生这种事?
以下是代码:
@Override
public void onViewStateRestored(Bundle savedInstanceState){
Log.e("FragmentB", "Bundle: " + savedInstanceState);
super.onViewStateRestored(savedInstanceState);
try{
textView.setText(savedInstanceState.getString("text"));
}catch (NullPointerException e){
e.printStackTrace();
}
Log.e("FragmentB", "Bundle: " + savedInstanceState);
Log.e("FragmentB", "onViewStateRestored");
}
@Override
public void onSaveInstanceState(Bundle outState){
super.onSaveInstanceState(outState);
outState.putString("text", textView.getText().toString());
Log.e("FragmentB", "onSaveInstanceState");
}发布于 2017-03-09 06:56:10
使用replace会破坏被替换的片段。因此,每次切换片段时,都会创建一个新片段。使用hide和show会对你更好。
fragmentTransaction.add(fragmentA).add(fragmentB).commit();
fragmentTransaction.show(fragmentA).hide(fragmentB).commit();发布于 2017-03-09 07:11:12
试着使用:
fragmentTransaction.add(R.id.main_content_frame, currentFragment);而不是:
fragmentTransaction.replace(R.id.main_content_frame, currentFragment);https://stackoverflow.com/questions/42688042
复制相似问题