Фрагмент Android: как сохранить экземпляр

Привет, у меня есть фрагмент, который загружает фрагмент карты и извлекает разные данные с сервера. Я хочу сохранить состояние/экземпляр моих фрагментов, не уничтожая и не заменяя его. Я знаю о onSaveInstanceState(Bundle outState), но я не понял, как применить его в моем случае (я также читал о цикле фрагментов). Вот код для действия, которое заменяет (использует замену) каждый из фрагментов при нажатии на элемент меню:

public class Menu extends Activity {
    private void displayView(int position) {
            // update the main content by replacing fragments

            switch (position) {
            case 0:
                fragment = new HomeFragment();
                break;
            case 1:

                // map is here !!
                fragment = new TestMap();
                break;
            case 2:
                fragment = new PhotosFragment();
                break;
            case 3:
                fragment = new CommunityFragment();
                break;
            case 4:
                fragment = new PagesFragment();
                break;
            case 5:
                fragment = new WhatsHotFragment();
                DatabaseHandler db = new DatabaseHandler(getApplicationContext());
                db.resetTables();
                Intent i = new Intent(getApplicationContext(), Login.class);
                //Intent i = new Intent(getApplicationContext(), MainActivity.class);
                startActivity(i);

                // closing this screen
                finish();
                break;

            default:
                break;
            }



if (fragment != null) {
FragmentManager fragmentManager = getFragmentManager();
                    fragmentManager.beginTransaction().replace(R.id.frame_container, fragment).commit();


                    // update selected item and title, then close the drawer
                    mDrawerList.setItemChecked(position, true);
                    mDrawerList.setSelection(position);
                        setTitle(navMenuTitles[position]);
                        mDrawerLayo

ut.closeDrawer(mDrawerList);
                } 
    ...
    }

вот фрагмент карты:

public class TestMap extends Fargment{
....
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
            context = getActivity();
            if(inst != null) {
                // Remove the view from the parent
                ((ViewGroup)inst.getParent()).removeView(inst);
                // Return it
                return inst;
            }
            else{
            final View myFragmentView = inflater.inflate(R.layout.activity_main, container, false);

            try {
                // Loading map and retrives locations from server 
                initilizeMap();

            } catch (Exception e) {
                Log.e("ERROR", "ERROR IN CODE: " + e.toString());
                e.printStackTrace();
            }
            inst = myFragmentView;
            return myFragmentView;
            }
     }

...


public void onDestroyView() 
     {
             super.onDestroyView(); 
             Fragment fragment = (getFragmentManager().findFragmentById(R.id.map));  
             FragmentTransaction ft = getActivity().getFragmentManager().beginTransaction();
             ft.remove(fragment);
             ft.commit();
     }
...
}

Следовательно, кто-нибудь знает, как сохранить фрагмент, который уже запущен в начале, не всегда заменяя и уничтожая его каждый раз, когда я меняю фрагменты? Заранее спасибо.


person Estarossa    schedule 11.04.2014    source источник
comment
Вы можете хранить экземпляры этих фрагментов в хеш-таблице.   -  person Kanak Sony    schedule 11.04.2014


Ответы (1)


Зависит от того, что вы хотите делать с данными и фрагментом:

  1. Вы хотите перестроить фрагмент с предыдущими данными?
  2. Вы хотите сохранить экземпляр в памяти и снова открыть его?

Для случая 1 я бы посоветовал вам использовать более постоянное хранилище данных и сохранять данные в onStop фрагмента. Затем вы можете проверить onCreateView, чтобы увидеть, существуют ли данные, и загрузить данные обратно, если они существуют. Вы можете легко использовать sharePref для этого, и для чтения и записи требуется 3 строки кода. Я бы предложил это, если данные - это только местоположение и некоторые строки. Вы можете дополнительно расширить это, используя временную метку для данных хранилища, если она слишком длинная, вы можете игнорировать предыдущие данные и загрузить их снова, что полезно для данных о местоположении.

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

    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(mContext);
    String previousData = prefs.getString("locationData"), null);
    if(previousData != null)
    {
       //Do something with data.
    }
    else {
       try {
          // Loading map and retrives locations from server 
          initilizeMap();
       } catch (Exception e) {
          Log.e("ERROR", "ERROR IN CODE: " + e.toString());
          e.printStackTrace();
       }
    }
}
@Override
public void onStop()
{
    Log.i(TAG, "onStop");
    super.onStop();
    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
    SharedPreferences.Editor editor = prefs.edit();
    editor.putString("locationData"), [your data]);
}

Использование onSaveInstanceState для сохранения данных предназначено для изменения конфигурации, а не для уничтожения фрагмента (с использованием замены транзакции). http://developer.android.com/reference/android/app/Fragment.html#setRetainInstance(boolean)

Для случая 2 вы можете просто использовать отображение и скрытие своего фрагмента, чтобы он не был уничтожен, но тогда вам нужно изменить макет, чтобы иметь более 1 контейнера. http://developer.android.com/reference/android/app/FragmentTransaction.html Я не рекомендую делать это таким образом, если ваша активность не предназначена для одновременного отображения нескольких фрагментов.

person uDevel    schedule 11.04.2014