正在开发一个包含 3 个 fragment 的应用程序。当用户决定通过 BottomNavigationView 从 FragmentB 或 FragmentC 切换回 FragmentA 时,我想保留 FragmentA 中的数据。 我的代码可以很好地更改屏幕方向,但由于某种原因,它不会保留 fragment 更改的数据。
为了测试,我只使用了一个应该保留字符串数据的 EditText。
主要 Activity
public class MainActivity extends AppCompatActivity implements
BottomNavigationView.OnNavigationItemSelectedListener {
Fragment Frag = new Fragment();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
BottomNavigationView navigation = findViewById(R.id.navigation);
navigation.setOnNavigationItemSelectedListener(this); // mOnNavigationItemSelectedListener
if (savedInstanceState != null)
{
Frag = getSupportFragmentManager().getFragment(savedInstanceState, "Frag");
}
else
loadFragment(new FragmentA());
}
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem menuItem) {
Fragment fragment = null;
int i = menuItem.getItemId();
if (i == R.id.fragmentA) {
fragment = new FragmentA();
} else if (i == R.id.fragmentB) {
fragment = new FragmentB();
} else if (i == R.id.fragmentC) {
fragment = new FragmentC();
}
return loadFragment(fragment);
}
private boolean loadFragment(Fragment fragment)
{
if (fragment != null)
{
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, fragment).commit();
Frag = fragment;
return true;
}
return false;
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
getSupportFragmentManager().putFragment(outState, "Frag", Frag);
}
}
fragment A
public class FragmentA extends Fragment {
EditText editText;
String string;
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (savedInstanceState != null)
{
string = savedInstanceState.getString("Text", "");
}
}
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
// return super.onCreateView(inflater, container, savedInstanceState);
LayoutInflater layoutInflater = getActivity().getLayoutInflater();
View view = layoutInflater.inflate(R.layout.fragmentA, container, false);
editText = view.findViewById(R.id.centerText);
editText.setText(string);
return view;
}
@Override
public void onSaveInstanceState(@NonNull Bundle outState) {
super.onSaveInstanceState(outState);
string = editText.getText().toString();
outState.putString("Text", string);
}
}
我希望当用户从 FragmentB 或 FragmentC 切换回 FragmentA 时 editText 保留数据。 我已经为这个问题苦苦挣扎了一段时间,尝试了不同的方法但没有成功。
最佳答案
您可以保留对 fragment 的引用,而不是像这里那样每次都创建新的引用:
if (i == R.id.fragmentA) {
fragment = new FragmentA();
} else if (i == R.id.fragmentB) {
fragment = new FragmentB();
} else if (i == R.id.fragmentC) {
fragment = new FragmentC();
}
您还可以使用ViewPager
,它不仅允许您在屏幕之间滑动,还可以设置viewPager.setOffscreenPageLimit(i);
,这意味着 fragment 除非它们离屏幕太远,否则不会重新创建。
关于java - 在Fragment切换中保留数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53208722/