Java 如何在tic-tac-toe Android游戏中添加共享偏好?

Java 如何在tic-tac-toe Android游戏中添加共享偏好?,java,android,eclipse,sharedpreferences,tic-tac-toe,Java,Android,Eclipse,Sharedpreferences,Tic Tac Toe,我有一个tic-tac-toe游戏应用程序,它是在一个桌子布局中创建的,三行9个按钮用于游戏,一个文本视图显示轮到谁了,在底部有一个新的游戏按钮。 我想在代码中添加共享首选项,这样如果我切换方向,游戏就不会继续重新启动。我知道我需要一个onPause和onResume方法,但我不确定这些方法中包含了什么。有人可以帮助实现共享首选项的方法吗?下面是游戏的大部分代码: private SharedPreferences prefs; @Override protected void onCreat

我有一个tic-tac-toe游戏应用程序,它是在一个桌子布局中创建的,三行9个按钮用于游戏,一个文本视图显示轮到谁了,在底部有一个新的游戏按钮。 我想在代码中添加共享首选项,这样如果我切换方向,游戏就不会继续重新启动。我知道我需要一个onPause和onResume方法,但我不确定这些方法中包含了什么。有人可以帮助实现共享首选项的方法吗?下面是游戏的大部分代码:

private SharedPreferences prefs;

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

    //get references to the widgets

    square1 = (Button) findViewById(R.id.square1);
    square2 = (Button) findViewById(R.id.square2);
    square3 = (Button) findViewById(R.id.square3);
    square4 = (Button) findViewById(R.id.square4);
    square5 = (Button) findViewById(R.id.square5);
    square6 = (Button) findViewById(R.id.square6);
    square7 = (Button) findViewById(R.id.square7);
    square8 = (Button) findViewById(R.id.square8);
    square9 = (Button) findViewById(R.id.square9);

    messageTextView = (TextView) findViewById(R.id.messageTextView);

   square1.setOnClickListener(this);
   square2.setOnClickListener(this);
   square3.setOnClickListener(this);
   square4.setOnClickListener(this);
   square5.setOnClickListener(this);
   square6.setOnClickListener(this);
   square7.setOnClickListener(this);
   square8.setOnClickListener(this);
   square9.setOnClickListener(this);

   prefs = PreferenceManager.getDefaultSharedPreferences(this);
};



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

protected void onPause(){


}

public void onResume() {
    super.onResume();


}


@Override
public void onClick(View v) {
    boolean flag;
    String lbl = messageTextView.getText().toString();
    Button btn = (Button) v;

    if (btn.getText().toString().equals("")){
        if (lbl.equals("Player X\'s turn")){
            btn.setText("X");
            messageTextView.setText("Player O\'s turn");
        }

        else{
            btn.setText("0");
            messageTextView.setText("Player X\'s turn");
        }
    }

    flag = determineWinner();

    if (!flag){
        checkAgain();
    }

}



public boolean determineWinner(){
    if (square1.getText().toString().equals("X") &&
            square2.getText().toString().equals("X")
            && square3.getText().toString().equals("X"))
    {
        message = "Player X wins";
        messageTextView.setText(message);   
        disableButtons();
        return true;

    }

    if (square1.getText().toString().equals("X")
            && square4.getText().toString().equals("X")
            && square7.getText().toString().equals("X"))

    {

        message = "Player X wins";
        messageTextView.setText(message);   
        disableButtons();
        return true;

    }

    if (square4.getText().toString().equals("X")
            && square5.getText().toString().equals("X")
            && square6.getText().toString().equals("X"))

    {

        message = "Player X wins";
        messageTextView.setText(message);   
        disableButtons();
        return true;

    }

    if (square7.getText().toString().equals("X")
            && square8.getText().toString().equals("X")
            && square9.getText().toString().equals("X"))

    {

        message = "Player X wins";
        messageTextView.setText(message);   
        disableButtons();
        return true;

    }

    if (square2.getText().toString().equals("X")
            && square5.getText().toString().equals("X")
            && square8.getText().toString().equals("X"))

    {

        message = "Player X wins";
        messageTextView.setText(message);   
        disableButtons();
        return true;

    }

    if (square3.getText().toString().equals("X")
            && square6.getText().toString().equals("X")
            && square9.getText().toString().equals("X"))

    {

        message = "Player X wins";
        messageTextView.setText(message);   
        disableButtons();
        return true;

    }

    if (square1.getText().toString().equals("X")
            && square5.getText().toString().equals("X")
            && square9.getText().toString().equals("X"))

    {

        message = "Player X wins";
        messageTextView.setText(message);   
        disableButtons();
        return true;

    }

    if (square3.getText().toString().equals("X")
            && square5.getText().toString().equals("X")
            && square7.getText().toString().equals("X"))

    {

        message = "Player X wins";
        messageTextView.setText(message);   
        disableButtons();
        return true;

    }

    if (square1.getText().toString().equals("0")
            && square2.getText().toString().equals("0")
            && square3.getText().toString().equals("0"))

    {

        message = "Player O wins";
        messageTextView.setText(message);   
        disableButtons();
        return true;

    }

    if (square4.getText().toString().equals("0")
            && square5.getText().toString().equals("0")
            && square6.getText().toString().equals("0"))

    {

        message = "Player O wins";
        messageTextView.setText(message);   
        disableButtons();
        return true;

    }

    if (square7.getText().toString().equals("0")
            && square8.getText().toString().equals("0")
            && square9.getText().toString().equals("0"))

    {

        message = "Player O wins";
        messageTextView.setText(message);   
        disableButtons();
        return true;

    }

    if (square1.getText().toString().equals("0")
            && square4.getText().toString().equals("0")
            && square7.getText().toString().equals("0"))

    {

        message = "Player O wins";
        messageTextView.setText(message);   
        disableButtons();
        return true;

    }

    if (square2.getText().toString().equals("0")
            && square5.getText().toString().equals("0")
            && square8.getText().toString().equals("0"))

    {

        message = "Player O wins";
        messageTextView.setText(message);   
        disableButtons();
        return true;

    }

    if (square3.getText().toString().equals("0")
            && square6.getText().toString().equals("0")
            && square9.getText().toString().equals("0"))

    {

        message = "Player O wins";
        messageTextView.setText(message);   
        disableButtons();
        return true;

    }

    if (square1.getText().toString().equals("0")
            && square5.getText().toString().equals("0")
            && square9.getText().toString().equals("0"))

    {

        message = "Player O wins";
        messageTextView.setText(message);   
        disableButtons();
        return true;

    }

    if (square3.getText().toString().equals("0")
            && square5.getText().toString().equals("0")
            && square7.getText().toString().equals("0"))

    {

        message = "Player O wins";
        messageTextView.setText(message);   
        disableButtons();
        return true;

    }

    return false;

}
比如说

@override
protected void onResume() {
    super.onResume();
    square1.setText(pref.getString("square1", ""));
    square1.setTag("square1"); // you can define view tag in xml layout
    /*
     * to square9
     */
}

@Override
public void onClick(View v) {
    pref.edit().putString((String)v.getTag(),currentPlayer).commit();
    if (currentPlayer.equal("X")
        currentPlayer = "O";
    else
        currentPlayer = "X";
}

在开始新游戏之前不要忘记重置值

我看到的最简单的解决方案是使用片段构建应用程序。一旦实现了单个片段活动(基本上是一个仅在其布局中加载片段的活动)和片段,您只需在fragment
onCreateView
方法(重写)中调用
this.setRetainInstance(true)

在这种特殊情况下,片段和活动之间唯一重要的区别在于,视图不是在
onCreate
中使用
setContentView
创建的,而是在
onCreateView
中创建的。无论如何,网上有很多例子。

我想在代码中添加共享首选项,这样如果我切换方向,游戏就不会继续重新启动。
-为什么你的游戏会在方向改变时重新启动?我不会使用SharedReferences,但使用onPause/onResume机制,相反,我不知道为什么当我改变方向时游戏会重新启动。这是默认的android行为,感谢代码示例。但是我没有currentPlayer的变量,所以变量消息在那里有效吗?另外,在代码中我需要在哪里调用这个onResume方法?当我改变方向时,游戏仍然会重新启动