【问题标题】:How to implement XML textView and buttons into GameView?如何在 GameView 中实现 XML textView 和按钮?
【发布时间】:2016-10-15 17:00:15
【问题描述】:

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


我的 XML 中有一些按钮和 textView,我希望能够在 contentView 设置为 gameView 的活动中使用它们。这是可行的吗?

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

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

我的 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 http://stackoverflow.com/questions/10698945/reference-string-resource-from-code
                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 的问题,但这并不能解决能够使用 xml 文件中的按钮的问题:

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 错误。然而,在我现在单独的公共 GameView 类的按钮代码中,它说这些方法从未使用过。我需要添加什么来解决此问题并确保当用户单击按钮时它会正确更改 int 答案的值?

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

     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;
     }

【问题讨论】:

    标签: java android xml android-layout setcontentview


    【解决方案1】:

    尝试更改此行:

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

    到:

    <com.exmple.ali.colormatch2.GameView
    

    【讨论】:

    • 我试过了,但它仍然给我同样的错误,找不到以下类:
    • 不要把GameView做成一个内部类,把它做成一个单独的公共类,然后做com.exmple.ali.GameView
    • 谢谢,这似乎是正确的做法。 XML 现在没有呈现错误。但是,我在使用 GameView 类时仍然存在一些问题。
    • 1.这是一个更普遍的问题。我不能真正运行我的模拟器来测试它,因为 GameView 类中当前有太多错误。从我的启动页面,我直接进入 ColorMatch2.java。 setContentView(GameView) 会做我需要的一切吗?我的意思是,它会从那里进入 while(playing) 循环并运行游戏,还是我需要在 ColorMatch2.java 中添加其他内容?
    猜你喜欢
    • 2020-03-09
    • 1970-01-01
    • 1970-01-01
    • 2015-12-26
    • 2015-08-18
    • 1970-01-01
    • 2016-10-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多