Java 覆盖后退按钮以使用SharedReferences保存数据

Java 覆盖后退按钮以使用SharedReferences保存数据,java,android,android-studio,sharedpreferences,back-button,Java,Android,Android Studio,Sharedpreferences,Back Button,当使用我的应用程序时,用户输入数据并保存数据。但是,此时“后退”按钮会从编辑文本中删除数据。这是我的java文件,这个活动是通过按下主活动的按钮来激活的。我已经尝试过覆盖后退按钮,但没有成功。有什么建议吗 public class NewLocation extends ActionBarActivity { public String coName; public String coAddress; public String coContact; publi

当使用我的应用程序时,用户输入数据并保存数据。但是,此时“后退”按钮会从编辑文本中删除数据。这是我的java文件,这个活动是通过按下主活动的按钮来激活的。我已经尝试过覆盖后退按钮,但没有成功。有什么建议吗

public class NewLocation extends ActionBarActivity {

    public String coName;
    public String coAddress;
    public String coContact;
    public String sqFt;
    public String taxed;
    public String concerns;
    public EditText editCoName;
    public EditText editCoAddress;
    public EditText editCoContact;
    public EditText editSqFt;
    public EditText editTaxed;
    public EditText editConcerns;

    public static final String DEFAULT = "";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_new_location);
        findViewById(R.id.button3).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startActivity(new Intent(NewLocation.this, RoomList.class));
            }
        });

        editCoName = (EditText) findViewById(R.id.CoName);
        editCoAddress = (EditText) findViewById(R.id.CoAddress);
        editCoContact = (EditText) findViewById(R.id.CoContact);
        editSqFt = (EditText) findViewById(R.id.SqFt);
        editTaxed = (EditText) findViewById(R.id.Taxed);
        editConcerns = (EditText) findViewById(R.id.Concerns);

        coName = editCoName.getText().toString();
        coAddress = editCoAddress.getText().toString();
        coContact = editCoContact.getText().toString();
        sqFt = editSqFt.getText().toString();
        taxed = editTaxed.getText().toString();
        concerns = editConcerns.getText().toString();


        LoadPreferences();
    }

    @Override
    public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState) {
        super.onSaveInstanceState(outState, outPersistentState);

        outState.putString("coName", coName);
        outState.putString("coAddress", coAddress);
        outState.putString("coContact", coContact);
        outState.putString("sqFt", sqFt);
        outState.putString("taxed", taxed);
        outState.putString("concerns", concerns);
    }

    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);

        coName = savedInstanceState.get("coName").toString();
        coAddress = savedInstanceState.get("coAddress").toString();
        coContact = savedInstanceState.get("coContact").toString();
        sqFt = savedInstanceState.get("sqFt").toString();
        taxed = savedInstanceState.get("taxed").toString();
        concerns = savedInstanceState.get("concerns").toString();

    }

    private void SavePreferences()
    {
        SharedPreferences sharedPreferences = getSharedPreferences("New Location Data", Context.MODE_PRIVATE);
        SharedPreferences.Editor editor = sharedPreferences.edit();

        editor.putString("coName", coName);
        editor.putString("coAddress", coAddress);
        editor.putString("coContact", coContact);
        editor.putString("sqFt", sqFt);
        editor.putString("taxed", taxed);
        editor.putString("concerns", concerns);

        editor.apply();
    }

    private void LoadPreferences()
    {
        SharedPreferences sharedPreferences = getSharedPreferences("New Location Data", Context.MODE_PRIVATE);

        coName = sharedPreferences.getString("coName", DEFAULT);
        coAddress = sharedPreferences.getString("coAddress", DEFAULT);
        coContact = sharedPreferences.getString("coContact", DEFAULT);
        sqFt = sharedPreferences.getString("sqFt", DEFAULT);
        taxed = sharedPreferences.getString("taxed", DEFAULT);
        concerns = sharedPreferences.getString("concerns", DEFAULT);

        editCoName.setText(coName);
        editCoAddress.setText(coAddress);
        editCoContact.setText(coContact);
        editSqFt.setText(sqFt);
        editTaxed.setText(taxed);
        editConcerns.setText(concerns);

    }

    @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_new_location, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        switch(item.getItemId())
        {
            case R.id.home:
                SavePreferences();
                startActivity(new Intent(getApplicationContext(), MainPage.class));
                break;
        }
        return super.onOptionsItemSelected(item);
    }

    @Override
    public void onBackPressed() {
        SavePreferences();
        super.onBackPressed();
    }
}
[已编辑]您可以尝试:

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_BACK) {
        SavePreferences();
        finish(); //<-- You need finish your activity after saved
        return true;
    }

    return super.onKeyDown(keyCode, event);
}
@覆盖
公共布尔onKeyDown(int-keyCode,KeyEvent事件){
if(keyCode==KeyEvent.keyCode\u BACK){
SavePreferences();
finish();//[编辑]您可以尝试:

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_BACK) {
        SavePreferences();
        finish(); //<-- You need finish your activity after saved
        return true;
    }

    return super.onKeyDown(keyCode, event);
}
@覆盖
公共布尔onKeyDown(int-keyCode,KeyEvent事件){
if(keyCode==KeyEvent.keyCode\u BACK){
SavePreferences();

finish();//如果每当用户离开该活动时都需要保存数据,则可以使用TextWatcher解决此问题。使用以下内容覆盖TextWatcher的onTextChanged()方法:

@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
    if (s.length > 0) coName = s;
}

然后重写onPause()以保存变量的状态(如有必要)。

如果用户每次离开该活动时都需要保存数据,则可以使用TextWatcher解决此问题。使用以下内容重写TextWatcher的onTextChanged()方法:

@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
    if (s.length > 0) coName = s;
}

然后重写onPause(),以便在必要时保存变量的状态。

您应该在
onSaveInstanceState
/
onRestoreInstanceState
方法中保存/还原活动的持久状态。您已经重写了这些方法,因此只需从它们调用
SavePreferences
/
LoadPreferences


覆盖后退按钮不是一个好主意,也不建议将状态保存到
onSaveInstanceState
中。无论是
onSaveInstanceState
还是
onPause
都是用于此目的。

您应该在
onSaveInstanceState
/
onRestoreInstanceState
方法中保存/恢复活动的持久状态。您已经覆盖了这些选项,因此只需从它们调用
SavePreferences
/
LoadPreferences



覆盖后退按钮不是一个好主意,也不建议将状态保存在
onDestroy
中。无论是
onSaveInstanceState
还是
onPause
都是为了实现这一点。

文本观察程序有什么帮助?因此使用TextWatcher将取代使用SharedReference,因此我将删除所有SharedReference方法和u使用textwatcher将变量更新为用户输入的最新非零长度值,然后您可以在onPause方法中调用SavePreferences方法,每当您的活动离开前台时都会调用该方法。检查长度是这样的:如果back键清除该字段,empty值不会覆盖上一个实际值。文本观察程序有何帮助?因此,使用TextWatcher将取代使用SharedReference,所以我会删除所有SharedReference方法并使用它,对吗?其思想是使用TextWatcher将变量更新为用户输入的最新非零长度值,然后您可以n在onPause方法中调用您的SavePreferences方法,每当您的活动离开前台时,就会调用该方法。长度检查的目的是,如果back键清除该字段,空值不会覆盖上一个实际值。将return true更改为return false,则back按钮将起作用。back按钮即使在在将“真”改为“假”后,我忘记了结尾();立即重试!后退按钮现在可以工作,但是数据仍然无法显示无法显示,因为可能您的loadShared错误,请检查是否可以从共享首选项中获取数据。更改为“返回真”,更改为“返回假”,则后退按钮将工作。后退按钮即使更改为“真”后仍无法工作我忘记了完成();立即尝试!后退按钮现在可以工作,但是数据仍然无法显示,因为可能您的loadShared是错误的,请查看是否可以从共享首选项中获取数据。只需在
onSaveInstanceState
/
onRestoreInstanceState
中调用
SavePreferences
LoadPreferences
后退按钮我会删除我的所有数据,当我回来时,所有数据都是空的。只需在
onSaveInstanceState
/
onRestoreInstanceState
/
onRestoreInstanceState
中调用
SavePreferences
/
LoadPreferences
,返回按钮仍会删除我的所有数据,当我回来时,所有数据都是空的。也许你正在另一个活动中删除数据?我没有想象就是这样。数据在某些情况下会显示,但如果我回击主活动并点击本应引导我到
新位置的按钮,则数据将被删除。我如何找到删除数据的位置?我的建议是将应用程序周围每个位置具有共享首选项的所有方法移动到single类。该类应为单例类,之后您可以通过查找代码中的用法轻松查看共享首选项中的情况。是否可能移动到
新位置
的我的按钮正在创建活动的新实例,而不是重新打开我输入的
新位置
的旧实例每次启动intent后,活动都是新实例。只有更改launchMode,它的行为才会不同。是否检查是否始终调用SavePreferences方法?可能是在另一个活动中删除数据?我想是这样。数据会在某些情况下显示,但如果我回击主活动并单击应该将我带到
新位置的按钮
数据被删除。我如何找到我要删除数据的位置?我的建议是将应用程序周围每个地方具有共享首选项的所有方法移动到单个类中。该类应为singleton,之后您可以很容易地看到您的shar中发生了什么爱德更喜欢