Text onClick Button

  • 31 Antworten
  • Letztes Antwortdatum
Zu 1...
Nein... kalt.

gehen wir mal logisch vor.
Warum benutzt Du diese Zeile? Was passiert, wenn diese nicht aufgerufen wird? Und wieso führt uns das zu der Lösung Deines Problems?

Code:
mp = MediaPlayer.create(getApplicationContext(), R.raw.applaus);
Zu 2...
Stürzt ab? Mit welcher Fehlermeldung?
 
  • Danke
Reaktionen: Feelix333
1. Dort wird der MediaPlayer erstellt und das Soundfile "applaus" definiert.
Oder was meinst du?

2. Fehlermeldung: "weekend" wurde Beendet.
LogCat sagt "Unable to destroy activity".
 
Zuletzt bearbeitet von einem Moderator:
1.

Okay und wenn Du die App startest und Stop drückst, ist dann der MediaPlayer auch schon erstellt?

2.

Wird sich ebenfalls erledigen, hat die gleiche Ursache wie 1 ;-)
 
  • Danke
Reaktionen: Feelix333
Also muss "mp = MediaPlayer.create(getApplicationContext(), R.raw.applaus);" vorher erstellt werden?

Also müsste es so aussehen:

Code:
package com.example.weekend;

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

public class MainActivity extends Activity
{

	public MediaPlayer mp;  
    Button play;
    Button stop;
    
    public void onCreate(Bundle savedInstanceState)
    {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.activity_main);  
  
        play = (Button) findViewById(R.id.button);
        stop = (Button) findViewById(R.id.stop);
        mp = MediaPlayer.create(getApplicationContext(), R.raw.applaus);
  
        play.setOnClickListener(new OnClickListener()
        {  
  
            public void onClick(View v)
            {  
                mp.start();
            }
        }
        );
        
        stop.setOnClickListener(new OnClickListener()
        {
        	public void onClick(View w)
        	{
        		mp.stop();
        	}
        }
        );
  
    }
    
    public void onDestroy()
    {
    	super.onDestroy();
    	mp.stop();
    }
    
}

Klappt fast!
Ich kann den Sound stoppen wenn er läuft, drücke ich den Stop-Button geschieht nichts und schließe ich die App kommt auch keine Fehlermeldung! :thumbup:

Aber wenn ich den Sound einmal gestartet habe und dann gestoppt, kann ich ihn nicht noch einmal starten! Dafür muss ich die App extra wieder schließen. Erst dann kann ich sie wieder (EINMAL) starten und stoppen.
 
Ja weil du den mp nochmal erstellen musst ;)

Code:
        play.setOnClickListener(new OnClickListener()
        {  
  
            public void onClick(View v)
            {  
                if (mp == null) {
                mp = MediaPlayer.create(getApplicationContext(), R.raw.applaus);
}
                mp.start();
            }
        }
        );
        
        stop.setOnClickListener(new OnClickListener()
        {
        	public void onClick(View w)
        	{
                if (mp != null) {
        		mp.stop();
}
        	}
        }
        );

versuch es damit mal :)

Sent from my iPhone using Tapatalk
 
  • Danke
Reaktionen: Feelix333
Und damit Du auch weisst, was Du da machst:

Dein Fehler war, die Methode mp.stop() aufzurufen, obwohl nicht sicher gestellt war, dass dieses Objekt auch erzeugt war.

Madlip schlägt nun vor, mit der if-Abfrage vorher zu prüfen, ob das Objekt existiert. Das macht manchmal Sinn, aber ich fürchte da ist noch schwerer Lapsus enthalten. Das ist glaube ich ein MemoryLeak, da immer wieder neue MediaPlayer-Instanzen generiert, nicht aber released werden.

Du könntest in
onCreate
das Objekt erzeugen. Dann steht es Dir zur Verfügung

im
play.onClickListener
einfach .start() aufrufen, denn Du weisst, dass das Objekt da ist

im
stop.OnClickListener
.stop() aufrufen, auch wenn es nicht spielt. Danach befindet sich das Objekt aber im Zustand "Stopped" und Du muss es mit .prepare() wieder in den "Prepared"-Zustand überführen.

bei
onDestroy
.stop aufrufen, damit der Sound stoppt und das Objekt mit .release() freigeben, um keinen Speicher zu blockieren
 
Zuletzt bearbeitet:
  • Danke
Reaktionen: Feelix333
Stimmt das Release :/ sorry


Sent from my iPhone using Tapatalk
 
Madlip schrieb:
Ja weil du den mp nochmal erstellen musst ;)

Code:
        play.setOnClickListener(new OnClickListener()
        {  
  
            public void onClick(View v)
            {  
                if (mp == null) {
                mp = MediaPlayer.create(getApplicationContext(), R.raw.applaus);
}
                mp.start();
            }
        }
        );
        
        stop.setOnClickListener(new OnClickListener()
        {
        	public void onClick(View w)
        	{
                if (mp != null) {
        		mp.stop();
}
        	}
        }
        );

versuch es damit mal :)

Sent from my iPhone using Tapatalk

So kann der Sound leider immer noch nur einmal gestartet und gestoppt werden.
Außerdem wird die App wieder beendet wenn man nicht drückt und dann wieder verlässt :-/


Wenn ich bei
Code:
super.onDestroy();
mp.stop();

aber noch folgendes mache
Code:
super.onDestroy();
    	if (mp != null)
    	{
    		mp.stop();
    	}

wird die App immerhin nicht beendet wenn nichts getan wird, aber trotzdem kann der Sound nur einmal gestartet und gestoppt werden.



Wenn ich toomuchcoffeeman's Anleitung folge sieht es bei mir jetzt so aus:
(beim .prepared musste noch ein try/catch Block hin sonst bekomme ich eine Exception)

Code:
package com.example.weekend;

import java.io.IOException;

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

public class MainActivity extends Activity
{
	public MediaPlayer mp;  
    Button play;
    Button stop;
    
    public void onCreate(Bundle savedInstanceState)
    {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.activity_main);play = (Button) findViewById(R.id.button);
        stop = (Button) findViewById(R.id.stop);
        mp = MediaPlayer.create(getApplicationContext(), R.raw.applaus);
  
        play.setOnClickListener(new OnClickListener()
        {  
  
            public void onClick(View v)
            {  
                mp.start();
            }
        }
        
        );
        
        stop.setOnClickListener(new OnClickListener()
        {
        	public void onClick(View w)
        	{
        		mp.stop();
        		try {
					mp.prepare();
				} catch (IllegalStateException e) {
					
					e.printStackTrace();
				} catch (IOException e) {
					
					e.printStackTrace();
				}
        	}
        }
        );
  
    }
    
    public void onDestroy()
    {
    	super.onDestroy();
    	mp.stop();
    	mp.release();
    	
    }
    
}

Weiß nicht ob ich das jetzt 100%-ig Richtig gemacht habe - aber es funktioniert soweit gut.
Wenn man nichts klickt stürzt die App nicht mehr ab und man kann den Sound beliebig oft starten und stoppen - allerdings wird er immer nur pausiert und weitergespielt und der Sound nicht neu gestartet.
Kann man das noch ändern oder muss dafür wieder alles umgeworfen werden?
 
Nein, die Struktur kannst Du so übernehmen...

Was Du Dir zum Verständnis aber unbedingt mal ansehen solltest -> MediaPlayer | Android Developers

Auf Dauer nervt es nämlich jeden, Leuten unter die Arme zu greifen, die nicht selbst auch ein wenig Mühe investieren, um ihre eigenen Ziele umzusetzen ;-)

Alles was Du brauchst, um den Sound neu zu starten findest Du auf der von mir angegebenen Seite. Du musst es nur noch finden ;-)
 
  • Danke
Reaktionen: Feelix333
Das habe ich mir schon angesehen.
Und ich schreibe auch nicht jeden sch**ß hier rein - aber wenn ich überhaupt nicht weiterkomme, was soll ich dann machen?

Ich bin leider kein Profi sondern Anfänger was die Android Programmierung betrifft..

Nichts desto trotzdem komme ich aber immer noch nicht weiter :-/
 
jeder war mal anfänger, aber von nix kommt nix
 
Naja, aber die Leute können Dir doch nicht alles vorkauen.

Du möchtest etwas benutzen, das als Zustandsautomat umgesetzt wurde. Dann finde ich es nicht zu viel verlangt, wenn Du Dir Zustandsautomaten im Ansatz anschaust, damit Du verstehst, was die Pfeile und deren Beschriftung bedeuten. Google und Wikipedia sind jederzeit für Dich da.

Außerdem musst Du die Doku lesen lernen. Da steht schon alles drin, was Du wissen willst. seekTo() ist die Methode der Wahl. Schau Dir aber in der Doku an, wie sie funktioniert. Du musst näcmlich noch entscheiden, welche Parameter Du mitgibst und wo in Deinem Quellcode die hin könnte.

Beste Grüße und viel Erfolg,
Thomas
 
Zurück
Oben Unten