Android使用共享首选项作为密码

时间:2015-12-16 09:59:06

标签: java android sharedpreferences

我有一个Activity,我想要一个PIN码。在此Activity中,用户可以转到单独的Activity,在其中可以设置PIN。如果未设置PIN,则应使用默认PIN。

这是第一个Activity

的代码
public class activity_identification extends AppCompatActivity {

    SharedPreferences pins_pref = null;
    EditText pin_entry = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_identification);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        getSupportActionBar().setDisplayShowHomeEnabled(true);
        pin_eingabe = (EditText) findViewById(R.id.et_pin_entry);

        pins_pref = getApplicationContext().getSharedPreferences("UserPin", Context.MODE_PRIVATE);
        SharedPreferences.Editor edit = pins_pref.edit();
        edit.putString("default_pin", "0000");
        edit.commit();
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_pin_identifikation, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        int id = item.getItemId();

        if (id == R.id.action_change_pin) {
            startActivity(new Intent(this, pin_settings.class));
            return true;
        }

        else if (id == R.id.home) { 
            this.finish();
            return true;
        }
        return super.onOptionsItemSelected(item);
    }


    public void onClickPinSummit(View button){

        if(pin_entry.getText().toString().equals( pins_pref.getString("user_pin", null).toString())) {
            Toast.makeText(this, "Authorization Right", Toast.LENGTH_SHORT).show();
        }
        else {
            Toast.makeText(this, "Authorization Wrong", Toast.LENGTH_SHORT).show();
        }


    }
}

这是第二个Activity

public class pin_settings extends AppCompatActivity {

    EditText et_old_pin = null;
    EditText et_new_pin = null;
    EditText et_new_pin_repeat = null;
    Button btn_pin_save = null;
    TextView tv_sharedPIN = (TextView) null;

    SharedPreferences pins_prefs = null;
    private String default_pin = null;
    private String user_pin = null;
    private String old_pin = null;
    private String new_pin = null;
    private String new_pin_repeat = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_pin_einstellungen);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        et_old_pin = (EditText) findViewById(R.id.et_old_pin);
        et_new_pin = (EditText) findViewById(R.id.et_new_pin);
        et_new_pin_repeat = (EditText) findViewById(R.id.et_new_pin_repeat);
        btn_pin_save = (Button) findViewById(R.id.btn_pin_save);
        tv_sharedPIN = (TextView) findViewById(R.id.sharedPIN);

        pins_prefs = getApplicationContext().getSharedPreferences("UserPin", Context.MODE_PRIVATE);
        general_pin = pins_prefs.getString("default_pin", null);

        tv_sharedPIN.setText(pins_prefs.getString("general_pin", null));
    }

    public void onClickNewPinSave(View button){
        old_pin = et_old_pin.getText().toString();
        new_pin = et_new_pin.getText().toString();
        new_pin_repeat = et_new_pin_repeat.getText().toString();

        if(old_pin.equals(pins_prefs.getString("default_pin",null).toString())){
            if (new_pin.equals(new_pin_repeat)){
                SharedPreferences.Editor edit = pins_prefs.edit();
                edit.putString("user_pin", user_pin);
                edit.commit();
                tv_sharedPIN.setText(pins_prefs.getString("user_pin", null));
            } else {
                Toast.makeText(this, "New Pins are not the same", Toast.LENGTH_LONG).show();
                }
        } else {
            Toast.makeText(this, "Old Pin is wrong.", Toast.LENGTH_LONG).show();
            }
    }
}

现在问题是应用程序没有保存在第二个Activity中设置的PIN。只要应用程序处于打开状态,它就可以正常工作,但只要我重新启动它,PIN就会恢复为默认的PIN。我认为这是因为我在第一个onCreate()的{​​{1}}方法中设置了默认PIN码,但我无法弄清楚如何绕过这样做。

2 个答案:

答案 0 :(得分:2)

当然,每次启动时都会将PIN重置为默认值。您需要做的就是删除该行,而是使用正确传递到getString()的默认值。

  1. 您根本不需要设置默认PIN码!从onCreate()
  2. 中删除所有内容
  3. getString()接受默认值作为第二个参数。如果未设置值,则返回此默认值。让我再说一遍:如果没有设置值,则返回默认值。

    因此,您无需在onCreate()中设置默认个人识别码,只需将默认个人识别码传递到getString(),如果未设置个人识别码,getString()将返回默认个人识别码。所以你要找的是:

    String pin = preferences.getString("default_pin", "0000");
    
  4. 旁注:请遵循常见的Java命名约定。也不要对这么多String进行硬编码。改为使用常量。

答案 1 :(得分:1)

编辑:正如Xaver Kapeller所指出我早期的解决方案不会奏效。虽然他的一个更简单,但我会修理我的,因为

如果default_pin返回0000,请将getString(default_pin, "-1")设置为"-1"

旧:如果default_pin为空,请尝试将0000设置为default_pin,这只会在您首次启动活动时发生