如何将 XML textView 和 buttons 实现到 GameView 中?

How to implement XML textView and buttons into GameView?

在我开始之前,我尝试查看与此类似的其他问题,但我不知道为什么 xml 告诉我 gameview 不存在。我知道我做错了什么我只是不知道是什么。


我的 XML 中有一些按钮和文本视图,我希望能够在我的 activity 中使用它们,其中 contentView 设置为 gameView。这可行吗?

在我的 xml 中,我有四个按钮,它们都有一个 onClick 属性,它们发送(颜色)RGB 或黄色。根据用户点击的内容,我想将答案设置为不同的 int。如果他们的答案是正确的,我希望通过 generateNewWord 方法弹出一种新颜色。但是,在我的 xml 中,我得到了错误

“找不到以下 classes: - com.example.ali.colormatch2.surfaceview.Gameview, 即使我有一个 GameView class.

我的 xml 文件,activity_color_match.xml:

<?xml version="1.0" encoding="utf-8"?>

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"

xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_color_match"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.ali.colormatch2.ColorMatch2">

<com.exmple.ali.colormatch2.surfaceview.GameView
    android:id="@+id/gameView"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

<TextView
    android:text="@string/mainColor"
    android:id="@+id/textView2"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:gravity="center_horizontal"
    android:textColor="@android:color/background_dark"
    android:textSize="100dp"
    android:layout_marginBottom="104dp"
    android:textAppearance="@style/TextAppearance.AppCompat.Display3"
    android:layout_above="@+id/button3"
    android:layout_centerHorizontal="true" />

<Button
    android:layout_width="150dp"
    android:layout_height="60dp"
    android:id="@+id/button"
    android:background="#000080"
    android:onClick="sendBlue"
    android:layout_alignParentBottom="true"
    android:layout_alignParentLeft="true"
    android:layout_alignParentStart="true" />

<Button
    android:layout_height="60dp"
    android:id="@+id/button2"
    android:background="#ffff00"
    android:elevation="0dp"
    android:layout_width="150dp"
    android:onClick="sendYellow"
    android:layout_alignParentBottom="true"
    android:layout_alignParentRight="true"
    android:layout_alignParentEnd="true" />

<Button
    android:layout_width="150dp"
    android:layout_height="60dp"
    android:id="@+id/button3"
    android:background="@android:color/holo_red_dark"
    android:onClick="sendRed"
    android:layout_above="@+id/button"
    android:layout_alignParentLeft="true"
    android:layout_alignParentStart="true"
    android:layout_marginBottom="19dp" />

<Button
    android:layout_width="150dp"
    android:layout_height="60dp"
    android:id="@+id/button4"
    android:background="@android:color/holo_green_dark"
    android:onClick="sendGreen"
    android:layout_alignParentRight="true"
    android:layout_alignParentEnd="true"
    android:layout_alignBottom="@+id/button3" />

<TextView
    android:text="Score:"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentTop="true"
    android:layout_alignParentLeft="true"
    android:layout_alignParentStart="true"
    android:id="@+id/textView4" />

<TextView

    android:text="@string/matchText"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/textView3"
    android:textAppearance="@style/TextAppearance.AppCompat.Body2"
    android:textSize="25dp"
    android:layout_alignParentTop="true"
    android:layout_centerHorizontal="true" />


</RelativeLayout>

我的ColorMatch2.java:

package com.example.ali.colormatch2;

import android.app.Activity;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.os.Bundle;
import android.util.Log;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.widget.RelativeLayout;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.ImageView;
import android.widget.TextView;

import java.util.Random;

public class ColorMatch2 extends Activity {

// gameView will be the view of the game
// It will also hold the logic of the game
// and respond to screen touches as well
GameView gameView;

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

    // Initialize gameView and set it as the view
    gameView = new GameView(this);
    setContentView(gameView);
    TextView textView3, textView2, textView4;
    textView3 = (TextView) findViewById(R.id.textView3);
    textView2 = (TextView) findViewById(R.id.textView2);
    textView4 =  (TextView) findViewById(R.id.textView4);

}

// GameView class will go here

// Here is our implementation of GameView
// It is an inner class.
// Note how the final closing curly brace }

// Notice we implement runnable so we have
// A thread and can override the run method.
class GameView extends SurfaceView implements Runnable {

    // This is our thread
    Thread gameThread = null;

    // This is new. We need a SurfaceHolder
    // When we use Paint and Canvas in a thread
    // We will see it in action in the draw method soon.
    SurfaceHolder ourHolder;

    // A boolean which we will set and unset
    // when the game is running- or not.
    volatile boolean playing;

    // A Canvas and a Paint object
    Canvas canvas;
    Paint paint;

    // This variable tracks the game frame rate
    long fps;

    // This is used to help calculate the fps
    private long timeThisFrame;

    //My variables
    int answer;
    int correctAnswer;
    int score = 0;
    int randomInt2, randomInt1;
    int count = 0;
    boolean matchColor = true, matchText = false, firstTime = true;



    // When the we initialize (call new()) on gameView
    public GameView(Context context) {
        // The next line of code asks the
        // SurfaceView class to set up our object.
        // How kind.,
        super(context);

        // Initialize ourHolder and paint objects
        ourHolder = getHolder();
        paint = new Paint();

        // Set our boolean to true - game on!
        playing = true;

    }

    @Override
    public void run() {
        while (playing) {

            // Capture the current time in milliseconds in startFrameTime
            long startFrameTime = System.currentTimeMillis();

            // Update the frame
            update();

            // Draw the frame
            draw();

            // Calculate the fps this frame
            // We can then use the result to
            // time animations and more.
            timeThisFrame = System.currentTimeMillis() - startFrameTime;
            if (timeThisFrame > 0) {
                fps = 1000 / timeThisFrame;
            }

        }

    }


public void update() {
        if (firstTime) {
            generateNewWord();
            firstTime = false;
        }

        if (answer == correctAnswer) {
            score++;
            count++;
            generateNewWord();
        }
        //else {
        //   quit();
        // }


        if (count % 5 == 0) {
            if (matchColor) {
                textView3.setText(getString(R.string.gameSetting2)); // might need to add context with this - check 
                matchText = true;
                matchColor = false;
            } else if (matchText) {
                textView3.setText(getString(R.string.gameSetting1));
                matchColor = true;
                matchText = false;
            }
        }
    }


    public void generateNewWord() {
        //randomly select between red, green, blue, yellow
        Random rand = new Random();
        randomInt1 = rand.nextInt(4) + 1; // assigns randomInt a value between 1 - 4
        randomInt2 = rand.nextInt(4) + 1;

        if (randomInt1 ==1){
            textView2.setText(R.string.Red);
        }
        else if (randomInt1 ==2){
            textView2.setText(R.string.Green);
        }
        else if (randomInt1 == 3){
            textView2.setText(R.string.Blue);
        }
        else if (randomInt1 == 4){
            textView2.setText(R.string.Yellow);
        }


        //randomly select hex codes between rgby
        if (randomInt2 ==1){
            textView2.setTextColor(0xffcc0000);
        }
        else if (randomInt2 ==2){
            textView2.setTextColor(0xff669900);
        }
        else if (randomInt2 == 3){
            textView2.setTextColor(0xff000080);
        }
        else if (randomInt2 == 4){
            textView2.setTextColor(0xffffff00);
        }

        if (matchColor) {
            correctAnswer = randomInt2;
        }
        else if(matchText){
            correctAnswer = randomInt1;
        }
    }

    // Draw the newly updated scene
    public void draw() {

        // Make sure our drawing surface is valid or we crash
        if (ourHolder.getSurface().isValid()) {
            // Lock the canvas ready to draw
            canvas = ourHolder.lockCanvas();

            // Draw the background color
            canvas.drawColor(Color.argb(255,  255, 255, 255));

            // Make the text a bit bigger
            paint.setTextSize(30);

            // Display the current score on the screen
            canvas.drawText("Score:" + score, 20, 40, paint);


            // Draw everything to the screen
            ourHolder.unlockCanvasAndPost(canvas);
        }

    }

    // If SimpleGameEngine Activity is paused/stopped
    // shutdown our thread.
    public void pause() {
        playing = false;
        try {
            gameThread.join();
        } catch (InterruptedException e) {
            Log.e("Error:", "joining thread");
        }

    }

    // If SimpleGameEngine Activity is started then
    // start our thread.
    public void resume() {
        playing = true;
        gameThread = new Thread(this);
        gameThread.start();
    }


    /*public void sendBlue(View view){
        answer = 2;
    }
    public void sendRed(View view){
        answer = 1;
    }
    public void sendYellow(View view){
        answer = 4;
    }
    public void sendGreen(View view){
        answer = 3;
    }*/

    //@Override
    public int getAnswer(MotionEvent motionEvent) {

        public void sendBlue(View view){
            answer = 2;
        }
        public void sendRed(View view){
            answer = 1;
        }
        public void sendYellow(View view){
            answer = 4;
        }
        public void sendGreen(View view){
            answer = 3;
        }
        return answer;
    }

}

// This is the end of our GameView inner class

// More SimpleGameEngine methods will go here

// This method executes when the player starts the game
@Override
protected void onResume() {
    super.onResume();

    // Tell the gameView resume method to execute
    gameView.resume();
}

// This method executes when the player quits the game
@Override
protected void onPause() {
    super.onPause();

    // Tell the gameView pause method to execute
    gameView.pause();
}

}

我还想指出,通过使我的 draw() 方法如下所示,我可能可以绕过使用 setTextView,但这并不能解决能够使用 [=46= 中的按钮的问题] 文件:

public void draw() {

        // Make sure our drawing surface is valid or we crash
        if (ourHolder.getSurface().isValid()) {
            // Lock the canvas ready to draw
            canvas = ourHolder.lockCanvas();

            // Draw the background color
            canvas.drawColor(Color.argb(255,  255, 255, 255));

            // Make the text a bit bigger
            paint.setTextSize(30);

            // Display the current score on the screen
            canvas.drawText("Score:" + score, 20, 40, paint);

            if (randomInt2 ==1){
                paint.setColor(Color.argb(255,  255, 0, 0));                }
            else if (randomInt2 ==2){
                paint.setColor(Color.argb(255,  0, 191, 255));                }
            else if (randomInt2 == 3){
                paint.setColor(Color.argb(255,  0, 128, 0));                }
            else if (randomInt2 == 4){
                paint.setColor(Color.argb(255,  255, 255, 0));                }


            paint.setTextSize(60);

            if (randomInt1 ==1){
                canvas.drawText("Red" , 100, 100, paint);
            }
            else if (randomInt1 ==2){
                canvas.drawText("Green" , 100, 100, paint);
            }
            else if (randomInt1 == 3){
                canvas.drawText("Blue" , 100, 100, paint);
            }
            else if (randomInt1 == 4){
                canvas.drawText("Yellow" , 100, 100, paint);
            }

            // Draw everything to the screen
            ourHolder.unlockCanvasAndPost(canvas);
        }

    }

这是我的字符串文件:

<resources>
<string name="app_name">ColorMatch</string>
<string name="gameSetting1">Match the COLOR</string>
<string name="gameSetting2">Match the TEXT</string>
<string name="Red">Red</string>
<string name="Green">Green </string>
<string name="Blue">Blue</string>
<string name="Yellow">Yellow</string>
<string name="matchText">Test</string>
<string name="mainColor">Test</string>
<string name="score">Score:</string>

</resources>

编辑:感谢 Nongthonbam Tonthoi,我找到了修复 XML 错误的方法。但是,在我现在单独的 public GameView class 按钮代码中,它表示从未使用过这些方法。我需要添加什么来解决这个问题并确保当用户单击按钮时它正确地更改了 int answer 的值?

按钮代码。除了将它们从 getAnswer 方法中移除之外,我的 GameView class 的其余部分是相同的:

     public void sendBlue(View view){
        answer = 2;
     }
     public void sendRed(View view){
    answer = 1;
     }
     public void sendYellow(View view){
    answer = 4;
     }
     public void sendGreen(View view){
    answer = 3;
     }

尝试更改此行:

<com.exmple.ali.colormatch2.surfaceview.GameView

至:

<com.exmple.ali.colormatch2.GameView