How to implement XML textView and buttons into GameView?

时间:2016-10-15 17:00:16

标签: java android xml android-layout setcontentview

Before I start I tried looking at the other questions that are similar to this, but I can't tell why the xml is telling me gameview does not exist. I know I'm doing something wrong I just can't figure out what.


I had some buttons and textViews in my XML and I want to be able to use them in my activity where the contentView is set as gameView. Is this doable?

In my xml I have four buttons and they all have an onClick property where they send(Color), either RGB or yellow. Depending on what the user clicks I want to set the answer as a different int. If their answer is correct, I want a new color to pop up via the generateNewWord method. However, in my xml I get the error

"The following classes could not be found: - com.example.ali.colormatch2.surfaceview.Gameview, even though I have a GameView class.

My xml file, 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>

My 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();
}

}

I'd also like to note that I could probably get around using setTextView by making my draw() method the following, but this does not resolve the issue of being able to use the buttons from the xml file:

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

    }

And here's my strings file:

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

Edit: Thanks to Nongthonbam Tonthoi I figured out how to fix the XML error. However, in my now seperate public GameView class for the buttons' code it says the methods are never used. What do I need to add to fix this and make sure when a user clicks a button it correctly changes the value of the int answer?

Code for buttons. Besides removing them from being inside the getAnswer method, the rest of my GameView class is the same:

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

1 个答案:

答案 0 :(得分:0)

Try changing this line:

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

to:

<com.exmple.ali.colormatch2.GameView