java - 在Fragment切换中保留数据

标签 java android fragment retain onsaveinstancestate

正在开发一个包含 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/

相关文章:

java - android studio 无法解析import com.google.android.gms.location.places.Place;

android - 在 Fragment 中初始化 YouTube 播放器

java - 您能解释一下流的概念吗?

Java Matcher 组输出问题

java - 将 JTable 写入 Excel

Android:更改 fragment 中的layout.xml

java - Fragment和Activity之间的通信

java - 如何根据 XML Parsing using SAX Parser 中子标记的值跳过父标记

android - 第二次点击 EditText 上的键盘

android - SDK或ADT如何为Android应用包的Res​​ources生成SHA1-Digest