1

Я пытаюсь сохранить данные, полученные фрагментом, в общую настройку, чтобы я мог повторно использовать данные, хранящиеся в общих предпочтениях, при повторном создании одного и того же фрагмента. Но почему-то данные не сохраняются, а значение по умолчанию для моего фрагмента возвращается. Ниже приведен код. Фрагмент реализации SharePreferenceДанные не сохранены в общих настройках в Commit

import android.content.Context; 
import android.content.SharedPreferences; 
import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.TextView; 
import android.widget.Toast; 

public class StreamFragment extends Fragment { 

    public String streamUrl=null; 
    TextView textView; 
    public static final String playerData="pData"; 
    SharedPreferences playerSettings; 
    public StreamFragment(){}; 

    @Override 
    public void onCreate(Bundle state) { 
     super.onCreate(state); 
     SharedPreferences playerSettings = getActivity().getSharedPreferences(playerData, Context.MODE_PRIVATE); 
     streamUrl = playerSettings.getString(streamUrl,"No Link Found"); 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) { 
     View view = inflater.inflate(R.layout.fragment_stream, container, false); 
     playerSettings = getActivity().getSharedPreferences(playerData, Context.MODE_PRIVATE); 
     streamUrl = playerSettings.getString("streamLink","No Link Found"); 
     //getData(); 
     Toast.makeText(getActivity(),"Stream Saved"+streamUrl,Toast.LENGTH_LONG).show(); 
     return view; 
    }  

    public void getUrl(String data) 
    { 
     streamUrl=data; 
     playerSettings = this.getActivity().getSharedPreferences(playerData, Context.MODE_PRIVATE); 
     SharedPreferences.Editor editor = playerSettings.edit(); 
     editor.putString("streamLink", streamUrl); 
     editor.commit(); 
     Toast.makeText(getActivity(),"Stream Saved"+streamUrl,Toast.LENGTH_LONG).show(); 
    } 
} 

Заранее спасибо!

+0

editor.commit(); устарел использовать editor.apply(); –

+0

вы снова создаете экземпляр внутри метода oncreate. Просто запустите «SharedPreferences» внутри метода onCreate. – Nas

+0

@JadavLalit слышал, что apply не отправляет результат успеха –

ответ

0

вы используете два SharedPreferences playerSettings; один во всем мире и один в OnCreate, и вы используете верхний из которых не инициализирован

import android.content.Context; 
    import android.content.SharedPreferences; 
    import android.os.Bundle; 
    import android.support.v4.app.Fragment; 
    import android.view.LayoutInflater; 
    import android.view.View; 
    import android.view.ViewGroup; 
    import android.widget.TextView; 
    import android.widget.Toast; 

    public class StreamFragment extends Fragment { 

     public String streamUrl=null; 
     TextView textView; 
     public static final String playerData="pData"; 
     SharedPreferences playerSettings; 
     public StreamFragment(){}; 

     @Override 
     public void onCreate(Bundle state) { 
      super.onCreate(state); 
      playerSettings = getActivity().getSharedPreferences(playerData, Context.MODE_PRIVATE); 
      streamUrl = playerSettings.getString("streamLink","No Link Found"); 
     } 

     @Override 
     public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) { 
      View view = inflater.inflate(R.layout.fragment_stream, container, false); 
      playerSettings = getActivity().getSharedPreferences(playerData, Context.MODE_PRIVATE); 
      streamUrl = playerSettings.getString("streamLink","No Link Found"); 
      //getData(); 
      Toast.makeText(getActivity(),"Stream Saved"+streamUrl,Toast.LENGTH_LONG).show(); 
      return view; 
     }  

     public void getUrl(String data) 
     { 
      streamUrl=data; 
      playerSettings = this.getActivity().getSharedPreferences(playerData, Context.MODE_PRIVATE); 
      SharedPreferences.Editor editor = playerSettings.edit(); 
      editor.putString("streamLink", streamUrl); 
      editor.commit(); 
      Toast.makeText(getActivity(),"Stream Saved"+streamUrl,Toast.LENGTH_LONG).show(); 
     } 
    } 
+0

, но как этот пример имеет несколько inits? https://developer.android.com/guide/topics/data/data-storage.html#pref –

+0

Можете ли вы объяснить разницу в приведенном выше примере, пожалуйста, я curios: | –

+0

Вы использовали SharedPreferences playerSettings; как переменную класса и используемую везде, проверьте свой код, который теперь инициализируется. –

2

Вместо streamUrl = playerSettings.getString(streamUrl,"No Link Found");

Вы должны использовать

streamUrl = playerSettings.getString("streamLink","No Link Found"); 

А также использовать применять вместо фиксации

+0

, но я прочитал, что commit возвращает мне результат успеха, но Apply wont –

+1

Да, commit действительно возвращает успех. Но хорошая вещь в применении заключается в том, что она асинхронна. –

+0

Да. Применить - это правильный путь. – Mahonster

1

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

streamUrl = playerSettings.getString(streamUrl,"No Link Found"); 

Используйте некоторое постоянное значение как ключ.

private static final String STREAM_URL = "stream_url"; 

и использование постоянной как ключ, как указано ниже.

streamUrl = playerSettings.getString(STREAM_URL,"No Link Found"); 
2

Я пытаюсь объяснить точку здесь:

Обратитесь к данному изображению:

enter image description here

Как вы можете видеть, onCreate обжигают до onCreateview.

Позволяет анализировать код:

public class StreamFragment extends Fragment { 

    public String streamUrl=null; 
    TextView textView; 
    public static final String playerData="pData"; 
    SharedPreferences playerSettings; 
    public StreamFragment(){}; 

Здесь, ваш streamUrl является null.

@Override 
    public void onCreate(Bundle state) { 
     super.onCreate(state); 
     /*SharedPreferences -- no needed*/playerSettings = getActivity().getSharedPreferences(playerData, Context.MODE_PRIVATE); 
     streamUrl = playerSettings.getString(/*streamUrl -- replace with a key value*/,"No Link Found"); 
    } 

Это первый способ выстрела. здесь вы пытаетесь получить String от sharedPref, который должен называться null. Этот момент неверен. первый параметр на getString должен быть a ключ, и должен быть уникальным везде для того же значения.

Другое дело, что вы пытаетесь объяснить другое значение SharedPreferences с тем же именем, поэтому удалите бросок в istantiation.

@Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) { 
     View view = inflater.inflate(R.layout.fragment_stream, container, false); 
     //playerSettings = getActivity().getSharedPreferences(playerData, Context.MODE_PRIVATE); -- they are already istantiated 
     streamUrl = playerSettings.getString(/*streamUrl -- replace with a key value*/,"No Link Found"); 
     //getData(); 
     Toast.makeText(getActivity(),"Stream Saved"+streamUrl,Toast.LENGTH_LONG).show(); 
     return view; 
    }  

Теперь вы настраиваете streamUrl к значению sharedPreferences's им с той же переменной streamUrl .this означает:

streamUrl /*which is currently null*/ = playerSettings.getString(null, "No Link Found"); 

Вы все еще должны заменить key от streamUrl к static unique field.

public void getUrl(String data) 
{ 
    streamUrl=data; 
    //playerSettings = this.getActivity().getSharedPreferences(playerData, Context.MODE_PRIVATE); -- already done above 
    SharedPreferences.Editor editor = playerSettings.edit(); 
    editor.putString("streamLink", streamUrl); 
    //editor.commit(); --replace with apply 
    Toast.makeText(getActivity(),"Stream Saved"+streamUrl,Toast.LENGTH_LONG).show(); 
} 

}

Это должно быть точка, где вы сохраняете значение, поэтому "streamLink" должен быть ключ, используемый выше.

Replace коммит применять и удалить istantiation, потому что это уже сделано

Теперь .. сказал, что это, как это должно выглядеть следующим образом:

import android.content.Context; 
import android.content.SharedPreferences; 
import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.TextView; 
import android.widget.Toast; 

public class StreamFragment extends Fragment { 

    public String streamUrl=null; 
    TextView textView; 
    public static final String playerData="pData"; 
    public static final String valueKey="streamLink"; 
    SharedPreferences playerSettings; 
    public StreamFragment(){}; 

    @Override 
    public void onCreate(Bundle state) { 
     super.onCreate(state); 
     playerSettings = getActivity().getSharedPreferences(playerData, Context.MODE_PRIVATE); 
     streamUrl = playerSettings.getString(valueKey,"No Link Found"); 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) { 
     View view = inflater.inflate(R.layout.fragment_stream, container, false); 

     streamUrl = playerSettings.getString(valueKey,"No Link Found"); 
     //getData(); 
     Toast.makeText(getActivity(),"Stream Saved"+streamUrl,Toast.LENGTH_LONG).show(); 
     return view; 
    }  

    public void getUrl(String data) 
    { 
     streamUrl=data; 

     SharedPreferences.Editor editor = playerSettings.edit(); 
     editor.putString(valueKey, streamUrl); 
     editor.apply(); 
     Toast.makeText(getActivity(),"Stream Saved"+streamUrl,Toast.LENGTH_LONG).show(); 
    } 
} 

Надеется, что это может помочь вам.

1

Ваш getUrl(String) способ не называется. Таким образом, ваше общее значение привилегии не сохраняется, вызывается до playerSettings.getString(streamUrl,"No Link Found"); Также вы создаете экземпляр «SharedPreferences» два раза, удалите из onCreateView. Используйте editor.apply() вместо editor.commit().

 Смежные вопросы

  • Нет связанных вопросов^_^