【问题标题】:Data not saved in shared preferences on Commit提交时未保存在共享首选项中的数据
【发布时间】:2017-05-23 16:27:11
【问题描述】:

我正在尝试将片段接收到的数据保存到共享首选项中,以便在重新创建同一片段时可以重用存储在共享首选项中的数据。但不知何故,数据没有被保存,默认值的首选项返回到我的片段。 下面是代码。 实现 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();
    }
}

提前致谢!

【问题讨论】:

  • editor.commit();不推荐使用 editor.apply();
  • 您再次在 oncreate 方法中创建实例。只需在 onCreate 方法中移除“SharedPreferences”即可。
  • @JadavLalit 听说apply没有发送成功结果
  • 你在哪里调用你的getUrl()方法?
  • @VivekMishra 使用接口调用片段

标签: android android-fragments sharedpreferences storage android-preferences


【解决方案1】:

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

你应该使用

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

并且也使用 apply 代替 commit

【讨论】:

  • 但我读到提交返回给我成功结果但是 Apply 不会
  • 是的,提交确实返回成功。但是 apply 的好处是它是异步的。
  • 你为什么不使用 Android Studio 建议你使用的东西,而不是你已经使用的东西?应用是正确的解决方案。
  • commit 正在工作......但是@Santosh 解决了主要问题
【解决方案2】:

我试着在这里解释一下:

参考这张图片:

如您所见,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"应该是上面使用的键。

将提交替换为应用并删除实例化,因为它已经完成

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

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

希望对你有帮助。

【讨论】:

    【解决方案3】:

    您的偏好值键不正确。请注意以下行。

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

    使用一些常数值作为键。

    private static final String STREAM_URL = "stream_url";
    

    并使用常量作为键,如下所述。

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

    【讨论】:

      【解决方案4】:

      您的getUrl(String) 方法未调用。所以你的共享偏好值没有被存储,在playerSettings.getString(streamUrl,"No Link Found");之前调用它 您还创建了两次“SharedPreferences”实例,从onCreateView 中删除。使用editor.apply() 而不是editor.commit()

      【讨论】:

        【解决方案5】:

        您正在使用两个 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();
                }
            }
        

        【讨论】:

        • 但是这个例子怎么会有多个 inits 呢? developer.android.com/guide/topics/data/data-storage.html#pref
        • 你能解释一下上面例子中的区别吗?我是古玩:|
        • 你使用了SharedPreferences playerSettings;作为类变量并在任何地方使用检查您的代码,该代码现在已初始化。
        • SharedPreferences playerSettings = getActivity().getSharedPreferences(playerData, Context.MODE_PRIVATE);始终是 onCreate 方法的本地方法。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-03-29
        • 2017-12-02
        • 1970-01-01
        • 2019-08-02
        • 2011-08-23
        • 2022-01-06
        • 2014-05-26
        相关资源
        最近更新 更多