java - Android Studio 应用程序在加载时会加载之前的 session

标签 java android android-studio

我正在制作一个井字游戏应用程序,其中相应的消息反射(reflect)轮到谁(玩家 X 或玩家 Y)以及谁获胜。这没有任何问题。然后我使用首选项和 fragment 添加了一个功能,用户可以在其中向玩家 X 和玩家 Y 添加特定名称,并且消息将实现他们的名称。然而,现在每次我打开应用程序时,它都会记住游戏的前一个 session 。我认为它会像上次暂停时一样加载游戏。如何让它在每次模拟器打开时加载新游戏?

我确信这很简单,我是 AndroidStudio 的新手,我没有想法。谢谢!

这是我的 Activity 代码

package com.asebastian.tictactoe;

import android.app.Activity;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.view.View.OnClickListener;

public class TictactoeActivity extends Activity implements OnClickListener {

private Button btn1;
private Button btn2;
private Button btn3;
private Button btn4;
private Button btn5;
private Button btn6;
private Button btn7;
private Button btn8;
private Button btn9;
private TextView txtmsg;
private int r = 0;
private String btn1txt = " ";
private String btn2txt = " ";
private String btn3txt = " ";
private String btn4txt = " ";
private String btn5txt = " ";
private String btn6txt = " ";
private String btn7txt = " ";
private String btn8txt = " ";
private String btn9txt = " ";
private String Xname = " ";
private String Yname = " ";
private SharedPreferences prefs;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_tictactoe);
    btn1 = (Button)findViewById(R.id.btn1);
    btn2 = (Button)findViewById(R.id.btn2);
    btn3 = (Button)findViewById(R.id.btn3);
    btn4 = (Button)findViewById(R.id.btn4);
    btn5 = (Button)findViewById(R.id.btn5);
    btn6 = (Button)findViewById(R.id.btn6);
    btn7 = (Button)findViewById(R.id.btn7);
    btn8 = (Button)findViewById(R.id.btn8);
    btn9 = (Button)findViewById(R.id.btn9);
    txtmsg = (TextView)findViewById(R.id.txtMessage);
    txtmsg.setText("Player X's turn");
    btn1.setOnClickListener(this);
    btn2.setOnClickListener(this);
    btn3.setOnClickListener(this);
    btn4.setOnClickListener(this);
    btn5.setOnClickListener(this);
    btn6.setOnClickListener(this);
    btn7.setOnClickListener(this);
    btn8.setOnClickListener(this);
    btn9.setOnClickListener(this);
    PreferenceManager.setDefaultValues(this, R.xml.preferences, false);
    prefs = PreferenceManager.getDefaultSharedPreferences(this);
}

@Override
public boolean onCreateOptionsMenu(Menu menu){
    getMenuInflater().inflate(R.menu.tictactoe,menu);
    return true;
}

@Override
public void onPause(){
    SharedPreferences.Editor editor = prefs.edit();
    editor.putString("btn1txt",btn1.getText().toString());
    editor.putString("btn2txt",btn2.getText().toString());
    editor.putString("btn3txt",btn3.getText().toString());
    editor.putString("btn4txt",btn4.getText().toString());
    editor.putString("btn5txt",btn5.getText().toString());
    editor.putString("btn6txt",btn6.getText().toString());
    editor.putString("btn7txt",btn7.getText().toString());
    editor.putString("btn8txt",btn8.getText().toString());
    editor.putString("btn9txt",btn9.getText().toString());
    editor.putInt("r",r);
    editor.commit();
    super.onPause();
}

@Override
public void onResume(){
    super.onResume();
    btn1.setText(prefs.getString("btn1txt",""));
    btn2.setText(prefs.getString("btn2txt",""));
    btn3.setText(prefs.getString("btn3txt",""));
    btn4.setText(prefs.getString("btn4txt",""));
    btn5.setText(prefs.getString("btn5txt",""));
    btn6.setText(prefs.getString("btn6txt",""));
    btn7.setText(prefs.getString("btn7txt",""));
    btn8.setText(prefs.getString("btn8txt",""));
    btn9.setText(prefs.getString("btn9txt",""));
    Xname = prefs.getString("pref_edittextX","");
    Yname = prefs.getString("pref_edittextY","");
    txtmsg.setText(Xname + "'s turn");
    r = prefs.getInt("r",0);

}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    if (item.getItemId() == R.id.new_game){
        btn1.setEnabled(true);
        btn2.setEnabled(true);
        btn3.setEnabled(true);
        btn4.setEnabled(true);
        btn5.setEnabled(true);
        btn6.setEnabled(true);
        btn7.setEnabled(true);
        btn8.setEnabled(true);
        btn9.setEnabled(true);
        btn1.setText("");
        btn2.setText("");
        btn3.setText("");
        btn4.setText("");
        btn5.setText("");
        btn6.setText("");
        btn7.setText("");
        btn8.setText("");
        btn9.setText("");
        r = 0;
        txtmsg.setText("Player X's turn");
    }
    else if (item.getItemId() == R.id.action_settings) {
        startActivity(new Intent(getApplicationContext(),SettingsActivity.class));
        return true;
    }
    return super.onOptionsItemSelected(item);
}

@Override
public void onClick(View v) {
    if (v.getId() == R.id.btn1) {
        r++;
        if ((r % 2) == 0) {
            btn1.setText("O");
        } else {
            btn1.setText("X");
        }
    }
    if (v.getId() == R.id.btn2) {
        r++;
        if ((r % 2) == 0) {
            btn2.setText("O");
        } else {
            btn2.setText("X");
        }
    }
    if (v.getId() == R.id.btn3) {
        r++;
        if ((r % 2) == 0) {
            btn3.setText("O");
        } else {
            btn3.setText("X");
        }
    }
    if (v.getId() == R.id.btn4) {
        r++;
        if ((r % 2) == 0) {
            btn4.setText("O");
        } else {
            btn4.setText("X");
        }
    }
    if (v.getId() == R.id.btn5) {
        r++;
        if ((r % 2) == 0) {
            btn5.setText("O");
        } else {
            btn5.setText("X");
        }
    }
    if (v.getId() == R.id.btn6) {
        r++;
        if ((r % 2) == 0) {
            btn6.setText("O");
        } else {
            btn6.setText("X");
        }
    }
    if (v.getId() == R.id.btn7) {
        r++;
        if ((r % 2) == 0) {
            btn7.setText("O");
        } else {
            btn7.setText("X");
        }
    }
    if (v.getId() == R.id.btn8) {
        r++;
        if ((r % 2) == 0) {
            btn8.setText("O");
        } else {
            btn8.setText("X");
        }
    }
    if (v.getId() == R.id.btn9) {
        r++;
        if ((r % 2) == 0) {
            btn9.setText("O");
        } else {
            btn9.setText("X");
        }
    }
    if (Xname.isEmpty() && Yname.isEmpty()) {
        if ((r % 2) == 0) {
            txtmsg.setText("Player X's turn");
        } else {
            txtmsg.setText("Player Y's turn");
        }
    } else {
        if ((r % 2) == 0) {
            txtmsg.setText(Xname + "'s turn");
        } else {
            txtmsg.setText(Yname + "'s turn");
        }
    }

    btn1txt = btn1.getText().toString();
    btn2txt = btn2.getText().toString();
    btn3txt = btn3.getText().toString();
    btn4txt = btn4.getText().toString();
    btn5txt = btn5.getText().toString();
    btn6txt = btn6.getText().toString();
    btn7txt = btn7.getText().toString();
    btn8txt = btn8.getText().toString();
    btn9txt = btn9.getText().toString();
    calcWinner();
}

public void calcWinner() {

    if (btn1txt == "X" && btn2txt == "X" && btn3txt == "X") {
        txtmsg.setText("Player X wins!");
        disableButtons();
    }
    if (btn1txt == "O" && btn2txt == "O" && btn3txt == "O") {
        txtmsg.setText("Player Y wins!");
        disableButtons();
    }
    if (btn4txt == "X" && btn5txt == "X" && btn6txt == "X") {
        txtmsg.setText("Player X wins!");
        disableButtons();
    }
    if (btn4txt == "O" && btn5txt == "O" && btn6txt == "O") {
        txtmsg.setText("Player Y wins!");
        disableButtons();
    }
    if (btn7txt == "X" && btn8txt == "X" && btn8txt == "X") {
        txtmsg.setText("Player X wins!");
        disableButtons();
    }
    if (btn7txt == "O" && btn8txt == "O" && btn9txt == "O") {
        txtmsg.setText("Player Y wins!");
        disableButtons();
    }
    if (btn1txt == "X" && btn4txt == "X" && btn7txt == "X") {
        txtmsg.setText("Player X wins!");
        disableButtons();
    }
    if (btn1txt == "O" && btn4txt == "O" && btn7txt == "O") {
        txtmsg.setText("Player Y wins!");
        disableButtons();
    }
    if (btn2txt == "X" && btn5txt == "X" && btn8txt == "X") {
        txtmsg.setText("Player X wins!");
        disableButtons();
    }
    if (btn2txt == "O" && btn5txt == "O" && btn8txt == "O") {
        txtmsg.setText("Player Y wins!");
        disableButtons();
    }
    if (btn3txt == "X" && btn6txt == "X" && btn9txt == "X") {
        txtmsg.setText("Player X wins!");
        disableButtons();
    }
    if (btn3txt == "O" && btn6txt == "O" && btn9txt == "O") {
        txtmsg.setText("Player Y wins!");
        disableButtons();
    }
    if (btn1txt == "X" && btn5txt == "X" && btn9txt == "X") {
        txtmsg.setText("Player X wins!");
        disableButtons();
    }
    if (btn1txt == "O" && btn5txt == "O" && btn9txt == "O") {
        txtmsg.setText("Player Y wins!");
        disableButtons();
    }
    if (btn3txt == "X" && btn5txt == "X" && btn7txt == "X") {
        txtmsg.setText("Player X wins!");
        disableButtons();
    }
    if (btn3txt == "O" && btn5txt == "O" && btn7txt == "O") {
        txtmsg.setText("Player Y wins!");
        disableButtons();
    }
    if (r == 9) {
        txtmsg.setText("Tie Game!");
        disableButtons();
    }
}
public void disableButtons(){
    btn1.setEnabled(false);
    btn2.setEnabled(false);
    btn3.setEnabled(false);
    btn4.setEnabled(false);
    btn5.setEnabled(false);
    btn6.setEnabled(false);
    btn7.setEnabled(false);
    btn8.setEnabled(false);
    btn9.setEnabled(false);
}
}

这是我的 fragment 代码:

package com.asebastian.tictactoe;
import android.os.Bundle;
import android.preference.PreferenceFragment;

/**
* A simple {@link Fragment} subclass.
*/
public class SettingsFragment extends PreferenceFragment {
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    addPreferencesFromResource(R.xml.preferences);
}

}

这是添加 fragment 的代码:

package com.asebastian.tictactoe;
import android.app.Activity;
import android.os.Bundle;


public class SettingsActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    getFragmentManager().beginTransaction().replace(android.R.id.content,new     
SettingsFragment()).commit();

}
}

最佳答案

所以我猜想通过在 SharedPreferences 中存储/恢复,您正在尝试保存 Activity 的状态!

这是错误的(除非您在 onDestroy() 中删除了 SharedPreferences 保存的内容),因为每次您再次打开应用程序时,onResume() 将被调用,因此状态将从 SharedPreferences 恢复。

查看 The Activity Lifecycle

<小时/>

因此,解决方案不是使用 SharedPreferences 来保存/恢复 Activity 状态,而是重写方法 onSaveInstanceStateonRestoreInstanceState,如下所示:

@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
    // Save the user's current game state
    savedInstanceState.putString("btn1txt",btn1.getText().toString());
    // and So on


    // Always call the superclass so it can save the view hierarchy state
    super.onSaveInstanceState(savedInstanceState);
}

public void onRestoreInstanceState(Bundle savedInstanceState) {
    // Always call the superclass so it can restore the view hierarchy
    super.onRestoreInstanceState(savedInstanceState);


    // Restore state members from saved instance
    btn1.setText(savedInstanceState.getString("btn1txt"));
    // and so on
}

注意:

系统在onStart()方法之后调用onRestoreInstanceState()。 此外,仅当存在要恢复的已保存状态时,系统才会调用 onRestoreInstanceState()

查看 Saving and restoring activity state

关于java - Android Studio 应用程序在加载时会加载之前的 session ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43105979/

相关文章:

android - 清除 Activity 历史堆栈

java - 如何在 Java 中将 DOM 节点从一个文档复制到另一个文档?

java - 仅部分生成表

java - JSTL sql :query variable

android - 如何更改 Material 抽屉中所选项目的图标颜色?

android - Android Studio 中 gradle-wrapper.properties 的用途是什么?

java - DNS 查询在 Java 中使用 DnsContextFactory 卡住

android - 带有 CursorTreeAdapter 的 ExpandableListView 抛出 IllegalStateException

android - 无法访问本地 aar 库中的自定义 View ?

android-studio - 无法运行Android Studio的模拟器