onSaveInstanceState null во фрагменте каждый раз - PullRequest
0 голосов
/ 04 июня 2018

Я ищу повсюду и ищу решение, но не могу его найти, мне нужна помощь.

У меня есть приложение, в котором есть два действия: действие A и действие B, но в B есть фрагменты, первый фрагмент изB, у меня есть важные данные, которые я не хочу потерять, когда пользователь нажимает назад при переходе к занятию A.

Моя проблема заключается в том, что каждый раз, когда я возвращаюсь к занятию A и перехожу на B, мойДанные становятся пустыми, потому что Android очищает их, поэтому я сделал некоторые поиски и изменения в коде и все еще не нашел решения.Теперь мой код:

ДЕЯТЕЛЬНОСТЬ A

  fbReceive.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {

                startActivity(new Intent(MainActivity.this, OmniActivity.class));

            }
        });

Я звоню B с этой линии, и когда они идут к B, это код:

ACTIVITY B

public class OmniActivity extends BaseActivity {

private View parent_view;

private TabLayout tab_layout;

FragmentOmni fragmentOmni     = new FragmentOmni();

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_omni_om);
    parent_view = findViewById(R.id.container);

    Tools.setSystemBarColor(this, R.color.new_purple_O200);

    openFragment(fragmentOmni);

    initToolbar();
    initComponent();

}

public void openFragment(final Fragment fragment) {

    FragmentManager fragmentManager = getSupportFragmentManager();
    FragmentTransaction transaction = fragmentManager.beginTransaction();
    transaction.replace(R.id.containerView, fragment, fragment.getTag());
    transaction.addToBackStack(null);
    transaction.commit();

}

@Override
public void onBackPressed() {

   Intent intent = new Intent(this, MainActivity.class);
   startActivityForResult(intent, 1);

}

    private void initToolbar() {

    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    toolbar.setNavigationIcon(R.drawable.ic_arrow_back_black_24dp);
    setSupportActionBar(toolbar);
    getSupportActionBar().setTitle("Voltar");
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    toolbar.getNavigationIcon().setColorFilter(getResources().getColor(android.R.color.white), PorterDuff.Mode.SRC_ATOP);

    toolbar.setNavigationOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View view) {

                Intent intent = new Intent(OmniActivity.this, MainActivity.class);
                startActivityForResult(intent, 1);

            }
    });

}

И когда приложение выполняет OpenFragment (), они переходят на этот код из фрагмента:

ФРАГМЕНТ A

public class FragmentOmni extends Fragment {

RecyclerView recyclerView;
MDOmniturn controller;


List<HashMap<String, String>> listproduct;
private ArrayList<Product> producttypelist;
Product tpobjproduct;
private ActionMode actionMode;
private ActionModeCallback actionModeCallback;


private ListProductAdapter lpAdapter;

private NestedScrollView nested_scroll_view;

private ImageButton bt_toggle_input;
private Button      bt_hide_input;
private View        lyt_expand_input;

EditText edOmni, edMani,edEan ;

LinearLayout layoutNoResult;

Handler time;
TextWatcher textexample;


private ProgressBar progressBarProduct;

LinearLayout linearLayout;


public FragmentOmni() {
}

public static FragmentOmni newInstance() {
    FragmentOmni fragment = new FragmentOmni();
    return fragment;
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);


}

@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);

    if(savedInstanceState != null){

        producttypelist = savedInstanceState.getParcelableArrayList("list");

    }

}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

    View root = inflater.inflate(R.layout.fragment_omni, container, false);

    return root;
}

@Override
public void onSaveInstanceState(Bundle outState) {

    outState.putParcelableArrayList("list", producttypelist);

    super.onSaveInstanceState(outState);

}

@Override
public void onViewCreated(View view, Bundle savedInstanceState) {

    if (savedInstanceState != null) {

        producttypelist = savedInstanceState.getParcelableArrayList("list");

    }


    initexpand(view);

    linearLayout = (LinearLayout) view.findViewById(R.id.container);

    edOmni = (EditText) view.findViewById(R.id.edOmni);
    edMani = (EditText) view.findViewById(R.id.edBManifesto);
    edEan  = (EditText) view.findViewById(R.id.edEan);

    progressBarProduct = (ProgressBar) view.findViewById(R.id.progressBarProduct);

    layoutNoResult = (LinearLayout) view.findViewById(R.id.layoutNoResult);
    recyclerView   = (RecyclerView) view.findViewById(R.id.recyclerView);
    recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
    recyclerView.addItemDecoration(new LineItemDecoration(getActivity(), LinearLayout.VERTICAL));
    recyclerView.setHasFixedSize(true);

    controller      = new MDOmniturn(getActivity());
    producttypelist = new ArrayList<>();
    listproduct     = new ArrayList<>();

    addListenerTextChange(edOmni);

    //set data and list adapter
    lpAdapter = new ListProductAdapter(getActivity(), producttypelist);
    recyclerView.setAdapter(lpAdapter);
    lpAdapter.setOnClickListener(new ListProductAdapter.OnClickListener() {
        @Override
        public void onItemClick(View view, Product obj, int pos) {

            if (lpAdapter.getSelectedItemCount() > 0) {

                enableActionMode(pos);

            } else {

                // read the inbox which removes bold from the row
                Product product = lpAdapter.getItem(pos);
                Toast.makeText(getActivity(), "Read: " + product.prd_description, Toast.LENGTH_SHORT).show();

            }

        }

        @Override
        public void onItemLongClick(View view, Product obj, int pos) {
            enableActionMode(pos);
        }
    });

    actionModeCallback = new ActionModeCallback();

}

SaveInstanceState от FRAGMENT A всегда имеет значение NULL, что я делаю не так?

1 Ответ

0 голосов
/ 04 июня 2018

Замените ваш код в следующем порядке

@Override
public void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);

    outState.putParcelableArrayList("list", producttypelist);    
}

Возможно, вы ожидаете данные и в неправильном состоянии.Например, savedInstanceState всегда будет null при первом запуске Activity, которая также указывает на ваш фрагмент, но может быть non-null, если Activity уничтожается во время ротации, потому что onCreate вызывается каждый раз, когда Activityзапускается или перезапускается.

Эта строка transaction.addToBackStack(null); не нужна.Вы можете сохранить состояние фрагмента на его onStop() и onPause() и восстановить onResume() и onCreate().

Вы можете удалить onBackPressed() в Деятельности B сейчас



Кроме того, вы можете использовать общие настройки.При выходе из приложения (onBackPressed, onPause ...) сохраните нужный элемент.Например, высокий балл игры.

 activity.getSharedPreferences(getString(R.string.app_name), 
            Context.MODE_PRIVATE).edit().putInt("score", highScore).apply();

И получение результата будет:

int value = activity.getSharedPreferences(getString(R.string.app_name), 
            Context.MODE_PRIVATE).getInt("score", 0);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...