Активность фрагмента обнуляется при добавлении другого фрагмента - PullRequest
4 голосов
/ 20 марта 2012

Я использовал библиотеку совместимости android.cupport-v4.jar, которую предоставляет Android, обнаружил проблему, я начал создавать TabActivity, содержащее несколько фрагментов на его вкладках.

У меня есть стартовая вкладка с GridView, от слушателя элемента в адаптере я вызываю следующий код:

FragmentManager manager = getSupportFragmentManager();
FragmentTransaction ft = manager.beginTransaction();
ft.add(R.id.relativeLayoutContent, newFragment);
//        ft.replace(R.id.relativeLayoutContent, newFragment);
ft.addToBackStack(null);
ft.commit();

Проблема в том, что когда я открываю новый фрагмент и возвращаюсь к первому, он не касается onAttach, потому что он никогда не был отсоединен, а поскольку новый фрагмент был, действие теперь удерживает последний, но не первый, если я попытаюсь снова щелкнуть элемент, произойдет сбой, сообщающий, что метод getActivity из фрагмента имеет значение null.

Есть ли какое-нибудь решение этой проблемы?

1 Ответ

0 голосов
/ 03 сентября 2014

Я не совсем уверен, чего вы пытаетесь достичь, но я все равно собираюсь сделать на него удар.

Вам следует использовать менеджер фрагментов, чтобы хранить ваши разные фрагменты, но когда вы используете метод add вFragmentTransaction, присвойте своим фрагментам тег, чтобы вы могли легко переключаться между фрагментами.

TabActivity также устарела.Задумывались ли вы об использовании вкладок в панели действий?http://developer.android.com/guide/topics/ui/actionbar.html#Tabs

Вот фрагмент, который я извлек из чего-то, над чем я сейчас работаю:

public void changeFragment(String tag){

    Fragment tmpFragment;
    FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();

    //look to see if we have already added the fragment
    tmpFragment = getFragmentManager().findFragmentByTag(tag);

    //we currently have a fragment, hide it
    if (currentFragment != null){
       fragmentTransaction.detach(currentFragment);
    }

    //did not find the fragment
    if (tmpFragment == null){
      if (tag.equals("map")){
         currentFragment = CustomMapFragment.newInstance();
      } else if (tag.equals("list")){
        currentFragment = ListFragment.newInstance();
      }else {
        //TODO
    }
    //add fragment for 1st time
    fragmentTransaction.add(R.id.content_frame, currentFragment, tag); 
  } else {
    //we found the fragment
    currentFragment = tmpFragment;
    fragmentTransaction.attach(currentFragment);  //show the fragment we found
  }
  fragmentTransaction.commit();
}

Вы можете использовать эти методы для переключения между фрагментами на основе их тега.

...