保存和检索v4片段状态

时间:2019-05-07 12:09:06

标签: java android android-fragments

到目前为止,我已经阅读了无数有关保存和检索Fragments状态的主题。不幸的是,对我没有任何帮助,Bundle savedInstanceState始终返回null。我想做的是实现一个“购物车”,该购物车会记住用户选择的商品。为此,我只想保存Fragment的一个变量,并在再次调用Fragment时检索它。

我不仅要使片段在从后向堆栈中调用时保持其状态,而且还希望在从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;
 }

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

savedInstanceState仅在配置更改或应用程序后台运行并回到前台时才被水化。要在整个用户会话中保存购物车的状态,请考虑使用附加到父活动的view model。如果您希望跨多个会话保留该数据,也可以尝试将购物车保留在SQLite中。