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;
}
答案 0 :(得分:0)
Try changing this line:
<com.exmple.ali.colormatch2.surfaceview.GameView
to:
<com.exmple.ali.colormatch2.GameView