Einen If-Befehl einfügen, ohne die onClick Methode?

  • 14 Antworten
  • Letztes Antwortdatum
M

mateaz

Ambitioniertes Mitglied
1
Hallo, ich bin gerade dabei meine erste App zu programmieren und habe ein Problem. Hier erstmal der Quellcode der MainActivity:
Code:
package com.example.simonsays;

import java.util.Random;

import android.media.MediaPlayer;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends Activity {

	
	Button red, green, yellow, blue, start, test;
	TextView anzeige;
	int aktuell = 0,farbe = 5;
	boolean onoff = false;
	public MediaPlayer mp;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		red = (Button) findViewById(R.id.bRed);
		green = (Button) findViewById(R.id.bGreen);
		yellow = (Button) findViewById(R.id.bYellow);
		blue = (Button) findViewById(R.id.bBlue);
		start = (Button) findViewById(R.id.bStart);
		test = (Button) findViewById(R.id.bTest);
		anzeige = (TextView) findViewById(R.id.tvAnzeige);
		
		start.setOnClickListener(new View.OnClickListener(){
			@Override
			public void onClick(View v){
				onoff = true;
				aktuell = 0;
				
				if(onoff = true){
					Random zufall = new Random();
			        
			 
			        for (int i=0; ;i++){
			            farbe = 1 + zufall.nextInt(4);
			            if(i==1){
			            	break;
			            }
					
				}
				}
			        if(farbe == 1){
			        	anzeige.setText("Red");
			        	mp = MediaPlayer.create(getApplicationContext(), R.raw.sound1);  
		                mp.start();
			        }
			        else if(farbe == 2){
			        	anzeige.setText("Green");
			        	mp = MediaPlayer.create(getApplicationContext(), R.raw.sound2);  
		                mp.start();
			        }
			        else if(farbe == 3){
			        	anzeige.setText("Yellow");
			        	mp = MediaPlayer.create(getApplicationContext(), R.raw.sound3);  
		                mp.start();
			        }
			        else if(farbe == 4){
			        	anzeige.setText("Blue");
			        	mp = MediaPlayer.create(getApplicationContext(), R.raw.sound4);  
		                mp.start();
			        }
			        
			}
			});
		
		test.setOnClickListener(new View.OnClickListener(){
			@Override
			public void onClick(View v){
				if(farbe == aktuell){
		        	anzeige.setText("That's right! :) start again");
		        }
		        else if(farbe != aktuell && aktuell != 0 && farbe != 5){
		        	anzeige.setText("That's wrong! :( try another colour");
		        	
		        }
		        else if(farbe == 5){
		        	anzeige.setText("Please click on the Start-Button first!");
		        }
		        else if(aktuell == 0){
		        	anzeige.setText("Please click on one Colour-Button before using the Test!");
			}
			}
		});
		
		blue.setOnClickListener(new View.OnClickListener(){
		@Override
		public void onClick(View v){
			aktuell = 4;
			mp = MediaPlayer.create(getApplicationContext(), R.raw.sound4);  
            mp.start();
			
		}
		});
		
		yellow.setOnClickListener(new View.OnClickListener(){
			@Override
			public void onClick(View v){
				aktuell = 3;
				mp = MediaPlayer.create(getApplicationContext(), R.raw.sound3);  
                mp.start();
			}
			});
		
		green.setOnClickListener(new View.OnClickListener(){
			@Override
			public void onClick(View v){
				aktuell = 2;
				mp = MediaPlayer.create(getApplicationContext(), R.raw.sound2);  
                mp.start();
			}
			});
		
		red.setOnClickListener(new View.OnClickListener(){
			@Override
			public void onClick(View v){
				aktuell = 1;
				mp = MediaPlayer.create(getApplicationContext(), R.raw.sound1);  
                mp.start();
				}
			});
	}
		
	 
		
	

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}

}

}

Die App sollte, wenn sie fertig ist, dem Spiel "Simon Says" ähneln. Das ist das Spiel, wo man vier verschiedenfarbige Buttons hat und eine vorgegebene Reihenfolge wiedergeben muss. Ich bin bis jetzt soweit, dass man den Vorgang starten kann und man bspw. den Befehl bekommt GELB zu drücken. Hat man dies getan, muss man allerdings auf TEST drücken, um zu überprüfen, ob die Eingabe richtig war. Wie kann ich es hinbekommen, dass dazu kein Klick auf TEST notwendig ist, sondern das das von alleine geschieht?
 
Am besten setzt du es direkt in doe onClickListener der Farbbuttons:
Code:
//Ich mach jetzt nur blau :D
blue.setOnClickListener(new OnClickListener()
{
   if(farbe == 4)
   {
       String text = "That's right :)";
   }
});
 
Ich wollte aber, dass er prüft, ob die eingegebene Farbe mit der befohlenen übereinstimmt und dann, wenn es übereinstimmt dem Benutzer einen neuen Befehl gibt. Das soll solange geschehen, bis die Eingabe falsch ist.
 
Genau das macht doch Greenstars Vorschlag. :confused: Du musst dann natürlich dort auch noch die nächste Aufgabe (die aus dem Startbutton?) anschmeissen.
 
Ich möchte sowas in der Art schreiben: if(farbe == aktuell){ dann soll der die start methode aufrufen und zwei Farben als Befehl geben} nur wie genau bekomme ich diese Verbindung zur Start Methode?
 
Die Verbindung mit der start methode? Falscher Ansatz. Du lagerst den Code besser in eine eigene Methode aus und rufst diese von start und den Farbknöpfen aus.

Im Übrigen würde ich das völlig anders aufziehen und am Anfang die ganze Folge erwürfeln, aber das nur am Rande :D
 
Wenn das so besser geht, dann kann ich das ja in eine eigene Methode packen. Nur wie nenne ich diese Methode? Als ich mit normalem Java-Programmieren angefangen habe, hab ich gelernt, dass man normalerweise public void main(String[args]) oder so verwendet, aber bei Android funktioniert dies nicht. Wie heißt eine solche Methode beim Android Programmieren?
 
Die
Code:
public static void main(String[] args)
ist auf Android
Code:
public void onCreate(Bundle savedInstanceState)

Du kannst die Methode auf alles bennenen, ausser es wird vom System verwendet (wie onPause, onStart, onResume, ...)
Da würd sich startColor() lohnen.

Nebenfrage zur public static void main():
Ist das die Hauptmethode eines Programes oder einer Klasse ? Ich hab bis jetzt nur für Android entwickelt deshalb ^^
 
Also schreibe ich bspw. startColor(Bundle savedInstanceState) danke damit kann ich erstmal was anfangen glaub ich :D Deine Frage kann ich dir leider nicht beantworten, da meine Programmier-Kenntnisse (sowohl Java normal als auch Java Android) sehr zu wünschen übrig lassen... Und wie muss ich es schreiben, wenn ein Button auf diese Methode zugreifen soll?
 
Zuletzt bearbeitet:
Du brauchst erstmal die Methode:
Code:
public void startColor()
{
   /* Das selbe wie im Startbutton
     *Die erste if-anweisung ist unnötig da du onoff direkt vorher auf true setzt
     *Also reicht die Random */
}

Du brauchst nicht startColor(Bundle savedInstanceState) zu machen, denn in die Variablen in den Klammern werden nur benutz wenn man sie braucht. Da du nie savedInstanceState aufrufen würdest (in der Methode) ist es aich unnötig.

Im onClickListener musst du nur noch
Code:
startColor();
schreiben :)
 
  • Danke
Reaktionen: mateaz
Hat geklappt, danke! :D
 
Fürs Danke gibts nen Button. :D
 
Danke für das Danke besorgen GoldeneMitte xD
 
Ich habe doch den Danke Button zur gleichen Zeit betätigt, wie ich den Beitrag geschrieben hab :D dachte doppelt danken hält besser :D
 
Hab jetzt ein anderes Problem...ich möchte erreichen, dass das Programm statt zu Schreiben "Red" oder "Blue" oder...den jeweiligen Button aufleuchten lässt. Ich habe inzwischen die Buttons durch ImageButtons ersetzt und über xml Dateien eingestellt, dass diese sich beim Klick verfärben. Also dass sie kurz ein anderes Bild zugewiesen bekommt. Soweit so gut, nur jetzt möchte ich, dass wenn der Befehl vom Programm kommt bspw. rot zu drücken, dass dieser Knopf dann kurz dunkler wird. Also genauso aussieht, als würde man auf den Knopf drücken. Die MainActivity:
Code:
package com.example.simonsays;

import java.util.Random;

import android.media.MediaPlayer;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.ImageButton;
import android.widget.TextView;

public class MainActivity extends Activity {

	
	ImageButton red, green, yellow, blue; 
	Button start;
	TextView anzeige;
	int aktuell = 0,farbe = 5, score = 0;
	Random zufall = new Random();
	private MediaPlayer mp1;
	private MediaPlayer mp2;
	private MediaPlayer mp3;
	private MediaPlayer mp4;
	private MediaPlayer mp5;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		red = (ImageButton) findViewById(R.id.bRed);
		green = (ImageButton) findViewById(R.id.bGreen);
		yellow = (ImageButton) findViewById(R.id.bYellow);
		blue = (ImageButton) findViewById(R.id.bBlue);
		start = (Button) findViewById(R.id.bStart);
		mp1 = MediaPlayer.create(getApplicationContext(), R.raw.sound1);
		mp2 = MediaPlayer.create(getApplicationContext(), R.raw.sound2);
		mp3 = MediaPlayer.create(getApplicationContext(), R.raw.sound3);
		mp4 = MediaPlayer.create(getApplicationContext(), R.raw.sound4);
		mp5 = MediaPlayer.create(getApplicationContext(), R.raw.fail);
		anzeige = (TextView) findViewById(R.id.tvAnzeige);
		
		start.setOnClickListener(new View.OnClickListener(){
			@Override
			public void onClick(View v){
			aktuell = 0;
			score = 0;
				
			   
			            farbe = 1 + zufall.nextInt(4);
			            
			            
			        if(farbe == 1){
			        	anzeige.setText("Red");
		                mp1.start();
		                red.setImageResource(R.drawable.redpressed);
		                try{
		    			     Thread.sleep(200);
		    			}catch(InterruptedException e){}
		                red.setImageResource(R.drawable.rednormal);
		                
			        }
			        else if(farbe == 2){
			        	anzeige.setText("Green");
		                mp2.start();
			        }
			        else if(farbe == 3){
			        	anzeige.setText("Yellow");
		                mp3.start();
			        }
			        else if(farbe == 4){
			        	anzeige.setText("Blue");
		                mp4.start();
			        }
			        
			}
			});
		
		
		
		blue.setOnClickListener(new View.OnClickListener(){
		@Override
		public void onClick(View v){
			aktuell = 4;
            mp4.start();
            startColor();
			
		}
		});
		
		yellow.setOnClickListener(new View.OnClickListener(){
			@Override
			public void onClick(View v){
				aktuell = 3;
                mp3.start();
                startColor();
			}
			});
		
		green.setOnClickListener(new View.OnClickListener(){
			@Override
			public void onClick(View v){
				aktuell = 2;
                mp2.start();
                startColor();
			}
			});
		
		red.setOnClickListener(new View.OnClickListener(){
			@Override
			public void onClick(View v){
				aktuell = 1;
                mp1.start();
                startColor();
				}
			});
	}
		
	 public void startColor(){
		 
		 if(farbe == aktuell){
			 try{
			     Thread.sleep(500);
			}catch(InterruptedException e){}

			 startRandom();
	        }
	        else if(farbe != aktuell && aktuell != 0 && farbe != 5){
	        	anzeige.setText("That's wrong! :( Your score is: " + score);
	        	try{
	        	     Thread.sleep(500);
	        	}catch(InterruptedException e){}
	            mp5.start();
	        	
	        	
	        }
	        else if(farbe == 5){
	        	anzeige.setText("Please click on the Start-Button first!");
	        }
	 }
		
	public void startRandom(){
		farbe = 1 + zufall.nextInt(4);
		score = score + 1;
        
        if(farbe == 1){
        	anzeige.setText("Red");
            mp1.start();
            red.setImageResource(R.drawable.redpressed);
            try{
			     Thread.sleep(200);
			}catch(InterruptedException e){}
            red.setImageResource(R.drawable.rednormal);
            
        }
        else if(farbe == 2){
        	anzeige.setText("Green");
            mp2.start();
        }
        else if(farbe == 3){
        	anzeige.setText("Yellow");
            mp3.start();
        }
        else if(farbe == 4){
        	anzeige.setText("Blue");
            mp4.start();
        }
        

	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}

}

Die activity_main.xml:
Code:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    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=".MainActivity" >

    <TextView
        android:id="@+id/tvAnzeige"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_alignRight="@+id/bRed"
        android:text="Hello, click on the Start-Button when you are ready!"
        android:textSize="30sp" />

    <Button
        android:id="@+id/bStart"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/tvAnzeige"
        android:text="Start" />

    <ImageButton
        android:id="@+id/bGreen"
        style="?android:attr/buttonStyleSmall"
        android:layout_width="140dp"
        android:layout_height="110dp"
        android:layout_alignLeft="@+id/bStart"
        android:layout_alignTop="@+id/bRed"
        android:src="@layout/green_button" />

    <ImageButton
        android:id="@+id/bBlue"
        style="?android:attr/buttonStyleSmall"
        android:layout_width="140dp"
        android:layout_height="110dp"
        android:layout_alignLeft="@+id/bRed"
        android:layout_alignTop="@+id/bYellow"
        android:src="@layout/blue_button" />

    <ImageButton
        android:id="@+id/bYellow"
        style="?android:attr/buttonStyleSmall"
        android:layout_width="140dp"
        android:layout_height="110dp"
        android:layout_alignLeft="@+id/bGreen"
        android:layout_alignParentBottom="true"
        android:layout_marginBottom="16dp"
        android:src="@layout/yellow_button" />

    <ImageButton
        android:id="@+id/bRed"
        style="?android:attr/buttonStyleSmall"
        android:layout_width="140dp"
        android:layout_height="110dp"
        android:layout_above="@+id/bBlue"
        android:layout_alignRight="@+id/bStart"
        android:layout_marginBottom="18dp"
        android:src="@layout/red_button" />

</RelativeLayout>
Die xml für das Aussehen des roten Buttons:
Code:
<?xml version="1.0" encoding="utf-8"?>

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

 <item android:state_pressed="true"
 android:drawable="@drawable/redpressed" />

 <item android:drawable="@drawable/rednormal" />

</selector>
würde mich über Hilfe freuen. Es tut mir leid, wenn ich euch mit solchen (wahrscheinlich) banalen und nervigen Dingen belästige, aber ich bin erst seit ein paar Tagen dabei für Android zu programmieren...
 
Zurück
Oben Unten