共享偏好? (非常简单的问题!?)
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();
使用相同的常量首选项名称,它将在您的应用程序的任何位置为您提供相同的首选项。
【讨论】:
以及 getDefaultSharedPreferences 和 getSharedPreferences 在存储和检索值中有什么区别?PreferenceManager.getDefaultSharedPreferences(this);
完全可以使用,并且每次都会给出相同的名称。如果您查看源代码,它使用附加“_preferences”作为文件名的包名,所以这不是这里的问题。
感谢 Elenasys 的回答!是的,我和 Naveed 有同样的困惑…….getDefaultSharedPreferences(this)
有什么问题,为什么在离开并返回活动后会重置?
那么为什么要使用这种方法呢?两者有什么区别?非常感谢! :)
另外,我可以用这个从不同的活动中检索吗?以上是关于共享偏好? (非常简单的问题!?)的主要内容,如果未能解决你的问题,请参考以下文章