Состояние фрагмента Android восстанавливается только на кнопке "Назад", а не когда я произвольно выбираю фрагмент из списка

Привет, у меня есть панель просмотра listview, и я показываю фрагменты на основе выбора пользователя в списке.

Вот как я заменяю фрагменты

public void switchFragment(Fragment fragment, boolean addBackStack) {
        try {
            FragmentManager manager = getSupportFragmentManager();
            FragmentTransaction ft = manager.beginTransaction();

            ft.replace(R.id.content, fragment);
            currentFragment = fragment;
           //if (addBackStack)
                ft.addToBackStack(null);
            ft.commit();
        } catch (Exception e) {

        }
    }

Это мой пример кода фрагмента. Теперь, когда я заменяю фрагменты, я сохраняю состояние экземпляра в onpause и восстанавливаю его в onresume, но он работает только при нажатии кнопки возврата. Когда я вручную перехожу назад к фрагменту из списка, состояние фрагмента не восстанавливается. Почему?

public class Fragment1 extends BaseFragment {   

    int currentFragmentInd = 1;  

    private Button startButton;
    private  Button endButton;
    private long savedStartTime;
    private TextView setStartText;
    private TextView setEndText;
    private String starttime;
    private String endtime;

    public int getIndex() {
        MyApplication.getApplication().setCurrentChild(0);
        MyApplication.getApplication().setCurrentGroup(0);
        return currentFragmentInd;
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        if (savedInstanceState !=null)
        {      



        }
    }

    @Override
    public void onResume() {
        super.onResume();
        setStartText= (TextView)getActivity().findViewById(R.id.MAtextView2);
        setEndText= (TextView)getActivity().findViewById(R.id.MAtextView3);
        setEndText.setText(endtime);
        setStartText.setText(starttime);
    }

    @Override
    public void onPause() {
        super.onPause();
        setStartText= (TextView)getActivity().findViewById(R.id.MAtextView2);
        setEndText= (TextView)getActivity().findViewById(R.id.MAtextView3);
        starttime=setStartText.getText().toString();
        endtime=setEndText.getText().toString();

    }

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


    }

    FrameLayout frameLayout;
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View contentView = inflater.inflate(R.layout.layout1, null, false);

        ((MainActivity) getActivity()).openList(0, 0);




        if (savedInstanceState == null) {

        }





        startButton= (Button) contentView.findViewById(R.id.button);
        endButton= (Button) contentView.findViewById(R.id.button2);
        endButton.setEnabled(false);

        setStartText= (TextView)contentView.findViewById(R.id.MAtextView2);
        setEndText= (TextView)contentView.findViewById(R.id.MAtextView3);





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


                    Time now = new Time();
                    now.setToNow();




            }
        });



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

                    Time now = new Time();
                    now.setToNow();

                    setEndText.setText(now.hour+" : "+now.minute);


            }
        });


        return contentView;
    }




}

Ответ 1

Позднее воспроизведение, но может помочь кому-то другому. Это происходит потому, что, когда вы нажимаете элемент listview, вы создаете новый компонент этого фрагмента. "Я предполагаю, что фрагмент, который вы отправляете для switchFragment (фрагмент фрагмента), создается с использованием" нового "ключевого слова." Поэтому этот новый экземпляр фрагмента не содержит ваши старые данные.

Вот как я это решил. Есть, вероятно, лучшие способы, но поскольку никто не ответил, я дам свое решение.

  • Когда вы заменяете фрагмент (ft.replace, fragment), даете ссылку на эту транзакцию: -ft.replace(R.id.content, фрагмент, "FRAGMENT_NAME" );
  • Когда вы добавляете фрагмент в backstack с помощью addToBackStack (null); введите имя вашего фрагмента, где у вас есть null.: -ft.addToBackStack( "FRAGMENT_NAME" );
  • Создайте метод, который сообщает вам, был ли этот фрагмент уже создан и, следовательно, существует в фоновом стеке.:

    public boolean isTagInBackStack(String tag){

        Log.i(TAG, "isTagInBackStack() Start");
        int x;
        boolean toReturn = false;
        int backStackCount = getSupportFragmentManager().getBackStackEntryCount();
        Log.i(TAG, "backStackCount = " + backStackCount);
    
        for (x = 0; x < backStackCount; x++){
            Log.i(TAG, "Iter = " + x +" "+ getSupportFragmentManager().getBackStackEntryAt(x).getName());
            if (tag == getSupportFragmentManager().getBackStackEntryAt(x).getName()){
                toReturn = true;
    
            }
    
        }
    
        Log.i(TAG, "isTagInBackStack() End, toReturn = " + toReturn);
        return toReturn;
    }
    
  • Теперь перед созданием нового экземпляра проверки этого фрагмента в стоп-кадре, если существует элемент backstack с именем "FRAGMENT_NAME" . если он существует, используйте этот элемент (фрагмент) вместо создания нового.

    if (isTagInBackStack("FRAGMENT_NAME")){
        Log.i(TAG, "Tag is in BackStack!!!! frag is = " + getSupportFragmentManager().findFragmentByTag("FRAGMENT_NAME"));
    
        FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
        transaction.replace(R.id.main_activity_container, getSupportFragmentManager().findFragmentByTag("FRAGMENT_NAME"));
        transaction.addToBackStack("FRAGMENT_NAME");
        transaction.commit();
    }else{
        Create the fragment (this happens the first time. 
    }