【问题标题】:SharedPreferences in Android dosent workAndroid 中的 SharedPreferences 不起作用
【发布时间】:2016-07-11 15:25:36
【问题描述】:

我创建了一个 sharedpreference 对象并尝试在同一个活动中检索我的数据,这是允许的操作吗?问题是,一旦应用程序开始运行,并且我在 textview 中输入了文本,输入的文本不会重新出现在单独的 textview 中。应用程序假设接收用户输入的文本并显示只是向下几个 dp,但是输入的文本从未再次出现。提前非常感谢大家。

    final static String My_PREFERENCES= "sharedPreferences";

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

    foodTV = (TextView) findViewById(R.id.foodTV);
    foodET = (EditText) findViewById(R.id.foodET);
    display = (TextView) findViewById(R.id.displayText);

    SharedPreferences sharedPreferences =
            getSharedPreferences(My_PREFERENCES, Context.MODE_PRIVATE);
    SharedPreferences.Editor edit = sharedPreferences.edit();
    edit.clear();
    edit.putString("foodname", foodET.getText().toString());
    edit.commit();

    button = (Button) findViewById(R.id.button);
    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            SharedPreferences sharedPreferences = getApplicationContext().getSharedPreferences(My_PREFERENCES, Context.MODE_PRIVATE);
            String food = sharedPreferences.getString("foodname", "");
            display.setText(food);
        }
    });
}

【问题讨论】:

  • 请问您有什么问题
  • 如果您在onCreate() 中使用edit.putString("foodname", foodET.getText().toString());,则会在共享首选项中存储一个空字符串,因为onCreate() 中的EditText 内没有任何内容。
  • 移动此代码 SharedPreferences.Editor edit = sharedPreferences.edit();编辑.清除(); edit.putString("foodname", foodET.getText().toString());编辑.commit();在您的按钮 onclick 监听器中
  • 我已经将代码模式化到 onclick 监听器 @SaravInfern 中,并且成功了!谢谢!但它是怎么起作用的呢?背后的原因是什么?
  • 如@Lal 上述edit.putString("foodname", foodET.getText().toString()); 所述在您的onCreate() 中,它在创建活动期间将edittext 的值(在oncreate 期间为空)保存在共享首选项中。现在您已将代码移动到按钮 onclick 内,每次单击按钮时编辑文本的值都存储在共享首选项中并在 onclick 中取回

标签: android android-sharedpreferences


【解决方案1】:

把你的代码改成

foodTV = (TextView) findViewById(R.id.foodTV);
foodET = (EditText) findViewById(R.id.foodET);
display = (TextView) findViewById(R.id.displayText);

  foodET.setOnEditorActionListener(
              new EditText.OnEditorActionListener() {
              @Override
              public boolean onEditorAction(TextView v, int actionId,KeyEvent event) {
                     if (actionId == EditorInfo.IME_ACTION_SEARCH ||
                           actionId == EditorInfo.IME_ACTION_DONE ||
                         event.getAction() == KeyEvent.ACTION_DOWN &&
                         event.getKeyCode() == KeyEvent.KEYCODE_ENTER) {
    if (!event.isShiftPressed()) {
      SharedPreferences sharedPreferences =
        getSharedPreferences(My_PREFERENCES, Context.MODE_PRIVATE);
        SharedPreferences.Editor edit = sharedPreferences.edit();
        edit.clear();
        edit.putString("foodname", foodET.getText().toString());
        edit.commit();
       return true; 
      }                
       }
        return false; 
     }
      });

 button = (Button) findViewById(R.id.button);
 button.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
             SharedPreferences sharedPreferences =    getApplicationContext().getSharedPreferences(My_PREFERENCES, Context.MODE_PRIVATE);
         String food = sharedPreferences.getString("foodname", "");
        display.setText(food);
    }
});

【讨论】:

  • 请明确指出你的sn-p和OP的sn-p有什么区别,应该如何解决问题。
  • 当编辑文本 foodET 中没有文本时,您最初将值保存在 sharedpreference 中。一旦你完成输入,我会在共享偏好中保存 foodET 的文本。
【解决方案2】:

事实上,我建议你使用一个很棒的https://github.com/pilgr/Paper

看看有多简单:

只需要两件事:

  1. 在您的应用(甚至是 Activity 本身)类中初始化库
  2. 拨打电话!

MyApp.java

只需初始化 Paper

Paper.init(getApplicationContext());

MyFragment.java

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

    // Sample food name
    String foodName = "apple";

    // Write it to paper
    Paper.book().write("foodname", foodName);

    // Then restore what we have just saved!
    String restoredFoodName = Paper.book().read("foodname");
}

请注意,这些调用不是异步的!但是你可以写几个简单的 AsyncTask-s 来让它们变成这样。

【讨论】:

    猜你喜欢
    • 2016-12-03
    • 2016-10-11
    • 2014-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-03
    • 1970-01-01
    相关资源
    最近更新 更多