Commit 上的数据未保存在共享首选项中
Data not saved in shared preferences on Commit
我正在尝试将片段接收到的数据保存到共享首选项中,以便在重新创建同一片段时可以重用存储在共享首选项中的数据。但不知何故,数据没有被保存,偏好的默认值返回到我的片段。
下面是代码。
实现 SharePreference 的片段
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();
}
}
提前致谢!
而不是streamUrl = playerSettings.getString(streamUrl,"No Link Found");
你应该使用
streamUrl = playerSettings.getString("streamLink","No Link Found");
并且还使用 apply 而不是 commit
您正在使用两个 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();
}
}
您的偏好值键不正确。请注意以下行。
streamUrl = playerSettings.getString(streamUrl,"No Link Found");
使用一些常量值作为键。
private static final String STREAM_URL = "stream_url";
并使用常量作为键,如下所述。
streamUrl = playerSettings.getString(STREAM_URL,"No Link Found");
我试着在这里解释一下:
参考这张图片:
如您所见,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");
}
这是触发的第一个方法。在这里,您正试图从 sharedPref
中获取一个 String
,它应该被命名为 null
。这一点是错误的。 getString
上的第一个参数应该是一个键,并且在任何地方都应该是唯一相同的值。
另一件事是您正在实例化 SharedPreferences
的另一个同名实例,因此移除实例化中的强制转换。
@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
设置为使用相同变量 streamUrl
命名的 sharedPreferences's
值。这意味着:
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"
应该是上面使用的键。
将 commit 替换为 apply 并删除 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();
}
}
希望对您有所帮助。
您的 getUrl(String)
方法未被调用。所以您的共享首选项值未存储,在 playerSettings.getString(streamUrl,"No Link Found");
之前调用它
您还创建了 "SharedPreferences" 的实例两次,从 onCreateView
中删除。使用 editor.apply()
而不是 editor.commit()
。
我正在尝试将片段接收到的数据保存到共享首选项中,以便在重新创建同一片段时可以重用存储在共享首选项中的数据。但不知何故,数据没有被保存,偏好的默认值返回到我的片段。 下面是代码。 实现 SharePreference 的片段
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();
}
}
提前致谢!
而不是streamUrl = playerSettings.getString(streamUrl,"No Link Found");
你应该使用
streamUrl = playerSettings.getString("streamLink","No Link Found");
并且还使用 apply 而不是 commit
您正在使用两个 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();
}
}
您的偏好值键不正确。请注意以下行。
streamUrl = playerSettings.getString(streamUrl,"No Link Found");
使用一些常量值作为键。
private static final String STREAM_URL = "stream_url";
并使用常量作为键,如下所述。
streamUrl = playerSettings.getString(STREAM_URL,"No Link Found");
我试着在这里解释一下:
参考这张图片:
如您所见,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");
}
这是触发的第一个方法。在这里,您正试图从 sharedPref
中获取一个 String
,它应该被命名为 null
。这一点是错误的。 getString
上的第一个参数应该是一个键,并且在任何地方都应该是唯一相同的值。
另一件事是您正在实例化 SharedPreferences
的另一个同名实例,因此移除实例化中的强制转换。
@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
设置为使用相同变量 streamUrl
命名的 sharedPreferences's
值。这意味着:
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"
应该是上面使用的键。
将 commit 替换为 apply 并删除 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();
}
}
希望对您有所帮助。
您的 getUrl(String)
方法未被调用。所以您的共享首选项值未存储,在 playerSettings.getString(streamUrl,"No Link Found");
之前调用它
您还创建了 "SharedPreferences" 的实例两次,从 onCreateView
中删除。使用 editor.apply()
而不是 editor.commit()
。