如何在将textView值从其片段移到另一个片段时保存该值,并在完成后取回该值?我试过了(sharedPrefrences,savedInstanceState,show和hide),但是没有任何帮助,都在改变方向时保存了片段状态,但是当我移到其他片段时却没有保存。
一个带有4个按钮的主要活动,每个按钮附加到一个新片段上,代表总共4个片段。
像这样
@Override
protected void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
final Button firstFrag;
firstFrag = findViewById(btn_first_frag);
Button secondFrag;
secondFrag = findViewById(btn_second_frag);
Button thirdFrag;
thirdFrag = findViewById(btn_third_frag);
Button fourthFrag;
fourthFrag = findViewById(btn_fourth_frag);
final SecondFragment secondFragment = new SecondFragment();
firstFrag.setText(getIntent().getExtras().getString("firstPlayer"));
secondFrag.setText(getIntent().getExtras().getString("secondPlayer"));
thirdFrag.setText(getIntent().getExtras().getString("thirdPlayer"));
fourthFrag.setText(getIntent().getExtras().getString("fourthPlayer"));
firstFrag.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
swipeFragments(new FirstFragment());
}
});
secondFrag.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
swipeFragments(new SecondFragment());
SharedPreferences preferences = getSharedPreferences("settings",MODE_PRIVATE);
SharedPreferences.Editor editor = preferences.edit();
editor.putString("value",secondFragment._screen.getText().toString());
String last = preferences.getString("value","0");
secondFragment._screen.setText(last);
}
});
thirdFrag.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
swipeFragments(new ThirdFragment());
}
});
fourthFrag.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
swipeFragments(new FourthFragment());
}
});
}
public void swipeFragments(Fragment fragment) {
getSupportFragmentManager().beginTransaction().add(R.id.container,fragment).commit();
}
我希望我会先保存片段状态,然后再按一个按钮移动到其他片段,并在按上一个片段按钮时保留保存的状态
最佳答案
public final class MyFragment extends Fragment {
private TextView vstup;
private Bundle savedState = null;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.whatever, null);
vstup = (TextView)v.findViewById(R.id.whatever);
/* (...) */
/* If the Fragment was destroyed inbetween (screen rotation), we need to recover the savedState first */
/* However, if it was not, it stays in the instance from the last onDestroyView() and we don't want to overwrite it */
if(savedInstanceState != null && savedState == null) {
savedState = savedInstanceState.getBundle(App.STAV);
}
if(savedState != null) {
vstup.setText(savedState.getCharSequence(App.VSTUP));
}
savedState = null;
return v;
}
@Override
public void onDestroyView() {
super.onDestroyView();
savedState = saveState(); /* vstup defined here for sure */
vstup = null;
}
private Bundle saveState() { /* called either from onDestroyView() or onSaveInstanceState() */
Bundle state = new Bundle();
state.putCharSequence(App.VSTUP, vstup.getText());
return state;
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
/* If onDestroyView() is called first, we can use the previously savedState but we can't call saveState() anymore */
/* If onSaveInstanceState() is called first, we don't have savedState, so we need to call saveState() */
/* => (?:) operator inevitable! */
outState.putBundle(App.STAV, (savedState != null) ? savedState : saveState());
}
/* (...) */
}