保存并检索V4碎片状态



我现在阅读了有关保存和检索片段状态的无数主题。不幸的是,对我没有任何作用,Bundle savedInstanceState总是返回null。我想做的是实施一个"购物车",该购物车记得用户选择的物品。为此,我只想保存一个片段的一个变量,然后将其再次调用后将其检索。

我不仅要使片段在从背包中调用时保留其状态,而且还要从BottomNavigationView打开它时。还是有什么区别?

这是所有片段的父活动类

public class ShopMainViewScreen extends AppCompatActivity implements ShopFragment.OnFragmentInteractionListener, SearchFragment.OnFragmentInteractionListener, ... {
 Fragment mContent;
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.main_activity_layout);
  loadFragment(new ShopFragment());
  mContent = getSupportFragmentManager().findFragmentById(R.id.fragmentplace);
 }
 private BottomNavigationView.OnNavigationItemSelectedListener mOnNavigationItemSelectedListener = new BottomNavigationView.OnNavigationItemSelectedListener() {
  @Override
  public boolean onNavigationItemSelected(@NonNull MenuItem item) {
   Fragment fragment;
   switch (item.getItemId()) {
    case R.id.navigation_home:
     fragment = new ShopFragment();
     loadFragment(fragment);
     return true;
    case R.id.navigation_search:
     fragment = new SearchFragment();
     loadFragment(fragment);
     return true;
    case R.id.navigation_shoppingCart:
     fragment = new CartFragment();
     loadFragment(fragment);
     return true;
    case R.id.navigation_settings:
     fragment = new SettingsFragment();
     loadFragment(fragment);
     return true;
   }
   return false;
  }
 };
 private boolean loadFragment(Fragment fragment) {
  if (fragment != null) {
   getSupportFragmentManager()
    .beginTransaction()
    .replace(R.id.fragmentplace, fragment)
    .addToBackStack(null)
    .commit();
  }
  return false;
 }

这是包含变量的片段(mShoppingCart应该存储和检索(。

public class CartFragment extends Fragment {
 private String mTitle;
 private int mQuantity;
 ArrayList < String > mShoppingCart;
 private OnFragmentInteractionListener mListener;
 @Override
 public void onSaveInstanceState(Bundle savedInstanceState) {
  Log.i("onSaveInstanceState", "entered");
  super.onSaveInstanceState(savedInstanceState);
  savedInstanceState.putStringArrayList("CART", mShoppingCart);
 }
 @Override
 public void onActivityCreated(@Nullable Bundle savedInstanceState) {
  Log.i("onActivityCreated", "entered");
  super.onActivityCreated(savedInstanceState);
  if (savedInstanceState != null) {
   Log.i("SavedInstanceState", " not null");
   mShoppingCart = savedInstanceState.getStringArrayList("CART");
  }
 }
 @Override
 public void onCreate(Bundle savedInstanceState) {
  Log.i("onCreate", "entered");
  super.onCreate(savedInstanceState);
  if (getArguments() != null) {
   mTitle = getArguments().getString("PRODUCTTITLE");
   mQuantity = getArguments().getInt("QUANTITY");
  }
  if (savedInstanceState == null) {
   Log.i("InstanceState", "is null");
   mShoppingCart = new ArrayList < > ();
  }
 }
 @Override
 public View onCreateView(LayoutInflater inflater, ViewGroup container,
  Bundle savedInstanceState) {
  validateCart(mTitle, mQuantity);
  return inflater.inflate(R.layout.shoppingcart_fragment_layout, container, false);
 }
 @Override
 public void onAttach(Context context) {
  super.onAttach(context);
  if (context instanceof OnFragmentInteractionListener) {
   mListener = (OnFragmentInteractionListener) context;
  } else {
   throw new RuntimeException(context.toString() +
    " must implement OnFragmentInteractionListener");
  }
 }
 @Override
 public void onDetach() {
  super.onDetach();
  mListener = null;
 }

任何帮助都将不胜感激。

savedInstanceState仅在配置更改期间或应用程序背景&amp;带回前景。为了保存整个用户会话中购物车的状态,请考虑使用附带的视图模型。如果您希望在多个会话中保留该数据,也可以尝试将其持续到SQLite中。

最新更新