2016-04-24 3 views
0

В моем проекте андроида есть фрагмент, в котором он динамически получает данные из другого класса. Я сохраняю эти данные (одну строку и Int) в комплекте, и я хочу, чтобы этот пакет был восстановлен при повороте экрана , Поэтому я использовал метод onSaveInstanceState.сохранение с использованием onSaveInstanceState в фрагменте

В этом фрагменте метод «ответить» получает данные (одну строку и Int) из другого класса. Я могу напечатать эти строки в Logcat в методе ответа.

фрагмент кода:

 public class Images extends android.support.v4.app.Fragment implements Imageinfo { 

private RecyclerView IRecyclerView; 
private RecyclerView.Adapter IAdapter; 
private RecyclerView.LayoutManager ILayoutManager; 

private Context ctx; 

private Bundle bundle=new Bundle(); 

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

    View v =inflater.inflate(R.layout.images, container, false); 

    Log.d("ONCREATE VIEW", "TRUE"); 


    IRecyclerView = (RecyclerView) v.findViewById(R.id.images_tab); 
    IRecyclerView.setHasFixedSize(true); 
    ILayoutManager = new LinearLayoutManager(getContext()); 
    IRecyclerView.setLayoutManager(ILayoutManager); 

    if(savedInstanceState!=null){ 
     Log.d("BUNDLE ADDED NOT NULL", String.valueOf(savedInstanceState.size())); 
     IAdapter = new ImageAdapter(this.getContext(),((fileselect)getContext()).imageset,bundle); 
     IRecyclerView.setAdapter(IAdapter); 
    } 

    else{ 
     Log.d("BUNDLE ADDED NULL", "TRUE"); 
     IAdapter = new ImageAdapter(this.getContext(),((fileselect)getContext()).imageset,null); 
     IRecyclerView.setAdapter(IAdapter); 
    } 

    return v; 

} 




@Override 
public void onSaveInstanceState(Bundle outState) { 
    outState=bundle; 
    Log.d("SAVING TIME", String.valueOf(outState.size())); 
    super.onSaveInstanceState(outState); 


} 
@Override 
public void respond(String str,int type) { 


    if(str!=null) { 
     if (type == 1) { 
      bundle.putString(str, str); 
      Log.d("BUNDLE ADDED", bundle.getString(str)); 
      Log.d("BUNDLE ADDED Size",String.valueOf(bundle.size())); 
     } else { 

      bundle.remove(str); 
      Log.d("BUNDLE REMOVED Size", String.valueOf(bundle.size())); 

     } 
    } 
} 
    } 

ПРОБЛЕМА:

Хотя метод ответа приема данных (одна строка и Int) и сохранение в Bundle, расслоение становится нулевой размер в onSaveInstanceState, когда экран поворачивается. onSaveInstanceState получает вызов, когда я поворачиваю экран, но пучок становится нулевым. Поскольку пакет становится равным нулю, я не смог восстановить две строки.

+0

Проверить здесь http://stackoverflow.com/questions/11831444/onsaveinstancestate-and-fragments – malrok44

+0

onSaveInstanceState становится называется. Но переменная расслоения становится равной нулю. – sandesh

ответ

1

ОК, проблема заключается в том, что вместо добавления содержимого в переменную outstate вы пытаетесь ссылаться на локальную переменную.

Дело в том, что экземпляр класса Images уничтожается при вращении, а также ваша переменная bundle.

Правильный способ добиться того, что вы пытаетесь сделать, это добавить свои строки в переменную outstate в методе onSaveInstanceState, и читать его из savedInstanceState в onCreateView.

Попробуйте это:

@Override 
public void onSaveInstanceState(Bundle outState) { 
    outState.putString("YOUR_STRING_NAME", bundle.getString("YOUR_STRING_NAME")); 
    Log.d("SAVING TIME", String.valueOf(outState.size())); 
    super.onSaveInstanceState(outState); 
} 
+0

Но onSaveInstanceState вызывается непосредственно перед тем, как уничтожить право? Если он вызван до уничтожения, то пакет не должен быть равен нулю, поскольку он еще не уничтожен. Итак, почему я не могу написать outstate = bundle? – sandesh

+0

В лучшем случае у вас будет мертвая ссылка на выходящий фрагмент, который будет храниться на уровне одной из его переменных, но не может работать, поскольку класс FragmentManager от Android создаст новый экземпляр вашего класса «Изображения». Эта новая ссылка будет содержать новую переменную bundle, в которой ничего нет, которая будет использоваться в onCreateView для восстановления и восстановления данных. На данный момент данные пакета являются совершенно новой переменной, и вы не можете ожидать, что данные будут храниться в вашем предыдущем экземпляре Images. – malrok44

+0

Он работает, если мы помещаем строки в связку в onSaveInstanceState. Но мне это не нужно. Мне нужно, чтобы я обновил строковые значения, полученные в методе ответа, в «outstate» bundle в onSaveInstanceState. В любом случае я могу это сделать? – sandesh