Android 提交时未将数据保存在共享首选项中

Android 提交时未将数据保存在共享首选项中,android,android-fragments,sharedpreferences,storage,android-preferences,Android,Android Fragments,Sharedpreferences,Storage,Android Preferences,我试图将片段接收到的数据保存到共享首选项中,以便在重新创建相同片段时可以重用存储在共享首选项中的数据。但不知何故,数据并没有得到保存,而preference的默认值被返回到我的片段中。 下面是代码。 实现共享偏好的片段 提前谢谢 而不是streamUrl=playerSettings.getString(streamUrl,“未找到链接”) 你应该使用 streamUrl = playerSettings.getString("streamLink","No Link Found"); 也可以

我试图将片段接收到的数据保存到共享首选项中,以便在重新创建相同片段时可以重用存储在共享首选项中的数据。但不知何故,数据并没有得到保存,而preference的默认值被返回到我的片段中。 下面是代码。 实现共享偏好的片段


提前谢谢

而不是
streamUrl=playerSettings.getString(streamUrl,“未找到链接”)

你应该使用

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

也可以使用apply代替commit

代替
streamUrl=playerSettings.getString(streamUrl,“未找到链接”)

你应该使用

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

也可以使用apply而不是commit

您使用的是两个SharedReferences播放器设置;一个全局,一个在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();
        }
    }

您正在使用两个SharedReferences播放器设置;一个全局,一个在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");

首选项值的键不正确。请注意下面的一行

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");
    }
这是第一个被激发的方法。这里您试图从
SharedRef
获取一个
字符串,该字符串应命名为
null
。这一点是错误的。
getString
上的第一个参数应该是一个键,并且对于相同的值,在任何地方都应该是唯一的

另一件事是,您正在使用相同的名称显示另一个istance of
SharedReferences
,因此请删除IStantation中的强制转换

  @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
设置为
SharedReferences的
值,该值使用相同的变量
streamUrl
命名。这意味着:

streamUrl /*which is currently null*/ = playerSettings.getString(null, "No Link Found");
您仍应将
streamUrl
替换为
静态唯一字段

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”

将提交替换为应用并删除IStation,因为它已完成

现在。。说它应该是这样的:

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();
    }
}

希望这能对你有所帮助。

我试着在这里解释一下这一点:

请参阅此图:

如您所见,
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");
    }
这是第一个被激发的方法。这里您试图从
SharedRef
获取一个
字符串,该字符串应命名为
null
。这一点是错误的。
getString
上的第一个参数应该是一个键,并且对于相同的值,在任何地方都应该是唯一的

另一件事是,您正在使用相同的名称显示另一个istance of
SharedReferences
,因此请删除IStantation中的强制转换

  @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
设置为
SharedReferences的
值,该值使用相同的变量
streamUrl
命名。这意味着:

streamUrl /*which is currently null*/ = playerSettings.getString(null, "No Link Found");
您仍应将
streamUrl
替换为
静态唯一字段

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”

将提交替换为应用并删除IStation,因为它已完成

现在。。说它应该是这样的:

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,“未找到链接”)之前调用它
此外,您还创建了两次“SharedReferences”实例,从
onCreateView
中删除。请使用
editor.apply()
而不是
editor.commit()
您的
getUrl(String)
方法未调用。因此您的共享首选项值未存储,在
playerSettings.getString(streamUrl,“未找到链接”)之前调用它

此外,您还创建了两次“SharedReferences”实例,从
onCreateView
中删除。使用
editor.apply()
而不是
editor.commit()

editor.commit();不推荐使用use editor.apply();您再次在oncreate方法中创建实例。只需在onCreate方法中重新调用“SharedReferences”。@Jadavlat听说apply不会发送成功结果您在哪里调用
getUrl()
方法?@VivekMishra使用interfaceeditor.commit()调用片段;不推荐使用use editor.apply();您再次在oncreate方法中创建实例。只需在onCreate方法中重新调用“SharedReferences”。@Jadavlat听说apply不发送成功结果您在哪里调用
getUrl()
方法?@VivekMishra使用接口调用片段但我读到commit返回成功结果,而apply wontYes,commit返回成功结果。但是apply的优点是它是异步的。为什么不使用androidstudio建议您使用的东西,而不是您已经使用过的东西呢?应用是正确的解决方案。提交正在工作。。。然而,@santosh解决了主要问题,但我读到commit返回成功结果,而Apply wontYes,commit返回成功。但是apply的优点是它是异步的,为什么不使用androidstudio建议您使用的东西呢