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");

我试着在这里解释一下:

参考这张图片:

如您所见,onCreateonCreateview 之前触发。

让我们分析您的代码:

public class StreamFragment extends Fragment {

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

在这里,您的 streamUrlnull

 @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");

您仍应将 keystreamUrl 替换为 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()