代码之家  ›  专栏  ›  技术社区  ›  krupesh Anadkat

如何在屏幕旋转时存储大量数据?

  •  0
  • krupesh Anadkat  · 技术社区  · 6 年前

    是的,我读过很多其他的文章,但是我不能继续下去,因为我有很多变量,不仅仅是一个或两个。

    我正在制作一个应用程序(井字游戏)首次与景观支持。我正在丢失屏幕旋转的数据。

    package com.netlify.krupesh.tictactoe;
    
    import android.graphics.Typeface;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.view.View;
    import android.view.Window;
    import android.view.WindowManager;
    import android.widget.ImageView;
    import android.widget.TextView;
    import android.widget.Toast;
    
    public class MainActivity extends AppCompatActivity {
    
        // 0 for zero and 1 for X
        // 2 for empty
        boolean gameActive = true;
        int[] gameState = {2,2,2,2,2,2,2,2,2};
        int[][] winningPositions = {{0,1,2}, {3,4,5}, {6,7,8}, {0,3,6}, {1,4,7}, {2,5,8}, {0,4,8}, {2,4,6}};
    
        int activePlayer = 0;
        int[] playerScores = {0,0};
    
        // Show Symbol on Tap
        public void showSymbol(View view){
            // Set Player Scores
            TextView player1 = (TextView) findViewById(R.id.p1Score);
            TextView player2 = (TextView) findViewById(R.id.p2Score);
    
    
            player1.setText(playerScores[0]+"");
            player2.setText(playerScores[1]+"");
    
            // Get Symbol Info
            ImageView symbol = (ImageView) view;
            int tappedSymbol = Integer.parseInt(symbol.getTag().toString());
    
            // Update Game state Array
            if(gameState[tappedSymbol]==2 && gameActive) {
                gameState[tappedSymbol] = activePlayer;
    
                // Show Symbol with Animation
                symbol.setAlpha(0f);
                if (activePlayer == 0) {
                    symbol.setImageResource(R.drawable.zero);
                    activePlayer = 1;
                    showCurrentPlayer(2);
    
                } else {
                    symbol.setImageResource(R.drawable.cross);
                    activePlayer = 0;
                    showCurrentPlayer(1);
                }
                symbol.animate().alpha(1).setDuration(400);
    
                checkDraw(gameState);
    
                for (int[] winningPosition : winningPositions) {
                    if (gameState[winningPosition[0]] == gameState[winningPosition[1]] && gameState[winningPosition[1]] == gameState[winningPosition[2]] && gameState[winningPosition[0]] != 2) {
                        showCurrentPlayer(0);
                        // Pause The Game
                        gameActive = false;
    
                        // Won the Game
                        String winningPlayer ;
                        if (gameState[winningPosition[0]] == 0) winningPlayer = "Player 1";
                        else winningPlayer = "Player 2";
                        Toast.makeText(this, winningPlayer + " won!", Toast.LENGTH_SHORT).show();
    
                        // Update Scores
                        playerScores[gameState[winningPosition[0]]]++;
                        player1.setText(playerScores[0] + "");
                        player2.setText(playerScores[1] + "");
                    }
                }
            }
        }
    
    
        public void resetBoard(View view){
            android.support.v7.widget.GridLayout board = (android.support.v7.widget.GridLayout)findViewById(R.id.gridLayout);
            for(int i=0; i<board.getChildCount(); i++) {
                ImageView symbol = (ImageView) board.getChildAt(i);
                symbol.setImageDrawable(null);
            }
            for(int i=0; i<gameState.length; i++ ){
                gameState[i] = 2;
            }
            gameActive = true;
            activePlayer = 0;
            showCurrentPlayer(1);
        }
    
        public void checkDraw(int[] gamestate){
            for(int i =0; i<gamestate.length; i++){
                if(gamestate[i]==2){
                    return;
                }
            }
            showCurrentPlayer(0);
            Toast.makeText(this, "Match Draw!", Toast.LENGTH_SHORT).show();
        }
    
        public void resetAll(View view){
            resetBoard(view);
            playerScores[0]=0; playerScores[1]=0;
            TextView player1 = (TextView) findViewById(R.id.p1Score);
            TextView player2 = (TextView) findViewById(R.id.p2Score);
            player1.setText(playerScores[0] + "");
            player2.setText(playerScores[1] + "");
            showCurrentPlayer(1);
        }
    
        public void showCurrentPlayer(int i){
            TextView player1Heading = (TextView) findViewById(R.id.subheading1);
            TextView player2Heading = (TextView) findViewById(R.id.subheading2);
            if(i==1){
                player1Heading.setTextColor(getResources().getColor(R.color.colorPlayer1));
                player1Heading.setTypeface(null, Typeface.BOLD);
                player2Heading.setTextColor(getResources().getColor(R.color.colorHeading));
                player2Heading.setTypeface(null, Typeface.NORMAL);
            }
            if(i==2){
                player2Heading.setTextColor(getResources().getColor(R.color.colorPlayer2));
                player2Heading.setTypeface(null, Typeface.BOLD);
                player1Heading.setTextColor(getResources().getColor(R.color.colorHeading));
                player1Heading.setTypeface(null, Typeface.NORMAL);
            }
            if(i==0){
                player1Heading.setTextColor(getResources().getColor(R.color.colorHeading));
                player1Heading.setTypeface(null, Typeface.NORMAL);
                player2Heading.setTextColor(getResources().getColor(R.color.colorHeading));
                player2Heading.setTypeface(null, Typeface.NORMAL);
            }
        }
    
    
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
    
            // ===================== Hide Status Bar ========================== //
            requestWindowFeature(Window.FEATURE_NO_TITLE);
            getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                    WindowManager.LayoutParams.FLAG_FULLSCREEN);
            // ================================================================ //
    
            setContentView(R.layout.activity_main);
            showCurrentPlayer(1);
        }
    }
    

    看,有这么多东西……对于所有图像视图,我需要保存设置了图像的人。现在如何解决这个旋转问题??

    要添加代码片段的解决方案是Android开发中最有用、最新的解决方案。

    1 回复  |  直到 6 年前
        1
  •  1
  •   mtotowamkwe    6 年前

    @克鲁佩什·阿纳德卡特 作为一个新手我感到沮丧,但是 @ CommonsWare 是一个经验丰富的开发者,已经在游戏中玩了几天。

    听从他的建议,并确保你学习他概述的基本原理,而不是为了这个目的而冲破或匆忙去建造一些东西。

    然而今天是你的幸运日,所以我会用一些代码片段宠坏你(我们千禧年程序员喜欢它容易是的,我说了!!!!)读杨凌的文章并学习。

    你现在面临的问题是 设备配置 改变。

    以你为例 屏幕方向 改变。

    每次用户旋转屏幕 安卓系统 再造你 活动 一个新的。这个 安卓系统 也就是说,它只是想提高效率,检查新方向是否有更好的资源,如果有,它可以使用这些资源。

    这是你痛苦的根源。现在,让我们来帮助你,伙计。

    你可以使用 活动的 类方法来解决这个问题。在全能者面前 安卓系统 杀死你的活动的方法 OnSaveInstanceState()。 将在活动的生命周期中调用。在您的类中,您重写 OnSaveInstanceState()。 并将您想要的数据保存到 哪一个 OnSaveInstanceState()。 作为一个论点。

    然后在你的活动中 OnCuto() 你检查是否 倚仗 如果您检索的数据不为空,则不为空。

    不过要当心,最好的办法是 基本数据类型 或是 可串行化的 以避免检索过时的数据,即过期或不再有效。

    请参见下面的代码段了解我的savedataacrossscreenorientation活动

    package com.demo.android.savedataacrossscreenrotationdemo;
    
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.Button;
    import android.widget.TextView;
    
    public class SaveDataAcrossScreenOrientation extends AppCompatActivity {
    
        // Key to be used for the key: value pair to be saved to the bundle
        private static final String KEY_GREETING_TEXT = "greeting_text";
    
        // The text currently displayed to the screen
        private String mCurrentDisplayedText;
    
        private TextView mGreetingTextView;
        private Button mSpanishButton;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            // Get references to the button and textview
            mGreetingTextView = (TextView) findViewById(R.id.greeting_text_view);
            mSpanishButton = (Button) findViewById(R.id.change_greeting_button);
    
            // If mCurrentDisplayedText is inside the bundle retrieve and display it on screen
            if(savedInstanceState != null) {
                mCurrentDisplayedText = savedInstanceState.getString(KEY_GREETING_TEXT, "");
                if (mCurrentDisplayedText != "") {
                    mGreetingTextView.setText(mCurrentDisplayedText);
                }
            }
    
            // Set a listener on the spanish button
            mSpanishButton.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    // Change the english text to spanish when the button is clicked
                    mGreetingTextView.setText(R.string.spanish_greeting);
    
                    // Get the text currently shown in the text view
                    mCurrentDisplayedText = (String) mGreetingTextView.getText(); // Calling getText() returns a CharSequence cast it to a string
                }
            });
        }
    
        // Override onSaveInstanceState(Bundle savedInstanceState) and save mCurrentDisplayedText to the bundle
        @Override
        public void onSaveInstanceState(Bundle savedInstanceState) {
            super.onSaveInstanceState(savedInstanceState);
            savedInstanceState.putString(KEY_GREETING_TEXT, mCurrentDisplayedText);
        }
    
    }
    

    See video demo here

    玩得高兴!