共享偏好? (非常简单的问题!?)

Posted

技术标签:

【中文标题】共享偏好? (非常简单的问题!?)【英文标题】:Shared preferences? (Extremely simple issue!?) 【发布时间】:2016-06-13 08:01:40 【问题描述】:

我只是想将用户从 editText 输入的内容存储在 Shared Preference 中,但它不起作用:

editText.setOnEditorActionListener(new TextView.OnEditorActionListener() 
    @Override
    public boolean onEditorAction(TextView v, int keycode, KeyEvent event) 

        Log.v(TAG, keyword.getString("keyword", "mDefault")); //IT LOGS OUT THE DEFAULT STRING EVEN **AFTER** STORING THE PREFERENCES BEFORE

        if (keycode == EditorInfo.IME_ACTION_SEND) 
            editText.setText(editText.getText().toString());

            keywordEditor.putString("keyword", editText.getText().toString());
            keywordEditor.commit();

            Log.v(TAG, keyword.getString("keyword", "default")); //CORRECT! THIS LINE WORKS
            
        
    return true;
);

当我第一次编辑文本时,我会首先得到一个“mDefault”的日志,这是正常的,因为共享首选项中没有存储任何内容。

然后,我将某些内容存储在共享首选项中,并确保它已存储,我记录并获得我输入的内容的日志。 这意味着共享偏好数据已存储。

问题出在:我在共享偏好中存储了一些东西后,我去另一个活动,然后我回来了,所有存储在共享偏好中的数据都是GONE !

在浏览活动后,第一个日志仍然显示mDefault

可能是什么问题?

编辑:

这是我的实例化:

onCreate:

 keyword = PreferenceManager.getDefaultSharedPreferences(this); //Making a shared preferences
        keywordEditor = keyword.edit();

【问题讨论】:

如何获得keyword 实例? @Codebender In onCreate: keyword = PreferenceManager.getDefaultSharedPreferences(this); //Making a shared preferences keywordEditor = keyword.edit(); @Codebender 我编辑了我的问题 @RuchirBaronia 我在其他答案中看到了您的消息,您必须设置首选项名称,才能在应用程序的任何位置设置和检索值。请参阅我的答案。 @RuchirBaronia 我刚刚重新创建了您的示例,似乎对我有用。如果不看更多代码,就很难解决这个问题。 【参考方案1】:

也许您没有保存在 setOnEditorActionListener 上。当您参加其他活动时保存。因为当它进入不同的活动时 setOnEditorActionListener editText.getText().toString() 它返回 null。

【讨论】:

对不起,我不太明白你在说什么。您介意提供更多信息吗?不应该做.commit() 来保存它吗?请告诉我! :) 请使用 getSharedPreferences("name", Context.MODE_PRIVATE);如果您使用 getDefaultSharedPreferences 可能会有关键“关键字”,并在返回活动时清除 我也需要从另一个活动中访问这个共享偏好。你是什​​么意思可能有关键“关键字”在回到活动时被清除?谢谢! 是的。您还可以从另一个活动访问此共享首选项,名称为 getSharedPreferences("name", Context.MODE_PRIVATE);【参考方案2】:

存储偏好:

   SharedPreferences pref = getSharedPreferences("MyPrefs",Context.MODE_PRIVATE);

    // We need an editor object to make changes
    SharedPreferences.Editor edit = pref.edit();

   // Set/Store data
   edit.putString("username", "Rishabh");
   edit.putString("password", "rishabh123");

   // Commit the changes
   edit.commit();

检索首选项:

  SharedPreferences pref = getSharedPreferences("MyPrefs", Context.MODE_PRIVATE);

   String username = pref.getString("username", "");
   String password= pref.getString("password", "");

   Log.d(TAG, username);
   Log.d(TAG, password);

【讨论】:

那么我如何从不同的活动中访问它?【参考方案3】:

添加此作为示例,以防您错过关键组件。这目前对我有用:

public class Main2Activity extends ActionBarActivity 

    private SharedPreferences keyword;
    private SharedPreferences.Editor keywordEditor;
    private String TAG = "TAG";

    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);


        keyword = PreferenceManager.getDefaultSharedPreferences(this); //Making a shared preferences
        keywordEditor = keyword.edit();

        final EditText editText = (EditText) findViewById(R.id.et_text);


        findViewById(R.id.btn_launch).setOnClickListener(new View.OnClickListener() 
            @Override
            public void onClick(View v) 
                Intent intent = new Intent(Main2Activity.this, Main22Activity.class);
                startActivity(intent);
            
        );

        editText.setOnEditorActionListener(new TextView.OnEditorActionListener() 
            @Override
            public boolean onEditorAction(TextView v, int keycode, KeyEvent event) 
                Log.v(TAG, "Initial: " + keyword.getString("keyword", "mDefault")); //IT LOGS OUT THE DEFAULT STRING EVEN **AFTER** STORING THE PREFERENCES BEFORE

                if (keycode == EditorInfo.IME_ACTION_SEND) 
                    editText.setText(editText.getText().toString());

                    keywordEditor.putString("keyword", editText.getText().toString());
                    keywordEditor.commit();

                    Log.v(TAG, "Saving in prefs: " + keyword.getString("keyword", "default")); //CORRECT! THIS LINE WORKS
                
                return true;
            
        );
    


全新安装:

我输入了“test”并点击了键盘上的发送按钮,因此调用了onEditorAction

然后点击启动新活动 -> 点击返回按钮并输入“test2”并点击发送按钮。

以下是日志输出:

02-29 23:26:42.068 18105-18105/com.example.naveed.myapplication V/TAG: Initial: mDefault
02-29 23:26:42.136 18105-18105/com.example.naveed.myapplication V/TAG: Saving in prefs: test

02-29 23:26:53.281 18105-18105/com.example.naveed.myapplication V/TAG: Initial: test
02-29 23:26:53.338 18105-18105/com.example.naveed.myapplication V/TAG: Saving in prefs: test2

正如您最初看到的那样,它是“mDefault”,然后保存了“test”。我发起了一项新活动,然后又回来了。下一次初始值是“test”,因为上次保存它,“test2”是保存的新值。

【讨论】:

这很奇怪,因为这就是我的样子,但我的不工作。我正在使用多个不同的共享首选项 (4),这可能是问题吗?会不会是存储空间? 是的,如果您的设备存储空间不足,它可能会失败。但是,只要您在案例 getDefaultPreferences() 中保存和检索具有相同名称的首选项,它应该可以工作。 我可以有多个共享首选项对象吗? 只要它们指向不同的文件,就可以。调用 getSharedPreferences() 将返回指向同一文件的对象,除非您指定不同的名称。 @Naveed:支持您的评论和这个解决方案-谢谢。我对何时使用SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());SharedPreferences sharedPref = getSharedPreferences("preffilename", 0); 感到有些困惑?我知道后者允许您指定多个首选项文件;但是,我看到大多数人在PreferenceManager 上使用这种方法 - 即使他们只使用单个文件来保存首选项。你能澄清一下吗?【参考方案4】:

创建SharedPreferences

  public class SharedPreferenceClass

    // Shared Preferences
    SharedPreferences pref;
    // Editor for Shared preferences
    SharedPreferences.Editor editor;
    // Context
    Context _context;
    // Shared pref mode
    int PRIVATE_MODE = 0;
    // Sharedpref file name
    private static final String PREF_NAME = "INTELLIJ_AMIYO";

    public static final String KEY_SET_VALUE= "KEY_SET_VALUE";

    public SharedPreferenceClass(Context context)
        this._context = context;
        pref = _context.getSharedPreferences(PREF_NAME, 0);
        editor = pref.edit();
    


    public void setUserDATA(String data)
    
        editor.remove(KEY_SET_VALUE);
        editor.putString(KEY_SET_VALUE, data);
        editor.commit();
    

    public String getUserDATA()
    
        String  getData= pref.getString(KEY_SET_VALUE, null);
        return getData;
    

    

现在在你的 Activity 部分全局调用它

SharedPreferenceClass        sharedPrefClassObj;

& 调用 onCreate(Bundle savedInstanceState) 部分

   sharedPrefClassObj = new SharedPreferenceClass(getApplicationContext());

现在添加这个

 editText.setOnEditorActionListener(new TextView.OnEditorActionListener() 
    @Override
    public boolean onEditorAction(TextView v, int keycode, KeyEvent event) 


        if (keycode == EditorInfo.IME_ACTION_SEND) 
            editText.setText(editText.getText().toString());
            sharedPrefClassObj.setUserDATA(editText.getText().toString()); // Set data 
            // Get data sharedPrefClassObj.getUserDATA();

            
        
    return true;
);

【讨论】:

【参考方案5】:

非常重要:您需要一个首选项名称(例如:“MY_PREFS_NAME”)来设置和检索值:

SharedPreferences.Editor keywordEditor = context.getSharedPreferences("MY_PREFS_NAME", MODE_PRIVATE).edit();

使用相同的常量首选项名称,它将在您的应用程序的任何位置为您提供相同的首选项。

【讨论】:

以及 getDefaultSharedPreferencesgetSharedPreferences 在存储和检索值中有什么区别? PreferenceManager.getDefaultSharedPreferences(this); 完全可以使用,并且每次都会给出相同的名称。如果您查看源代码,它使用附加“_preferences”作为文件名的包名,所以这不是这里的问题。 感谢 Elenasys 的回答!是的,我和 Naveed 有同样的困惑…….getDefaultSharedPreferences(this) 有什么问题,为什么在离开并返回活动后会重置? 那么为什么要使用这种方法呢?两者有什么区别?非常感谢! :) 另外,我可以用这个从不同的活动中检索吗?

以上是关于共享偏好? (非常简单的问题!?)的主要内容,如果未能解决你的问题,请参考以下文章

Android M 奇怪的共享偏好问题

Flutter:共享偏好

使用共享偏好的登录页面[重复]

如何遍历共享偏好的所有键?

Android Studio - 共享偏好无法保存在新活动中

清除数据后从共享偏好中获取价值