Button wird nichtmal ansatzweise gepressed...

  • Antworten:12
Daniel
  • Forum-Beiträge: 99

07.03.2014, 22:55:41 via Website

Moin,
iwie klappt das nicht, der Button soll 2 Sekunden Pressed() sein, aber außer dass die App etwas länger lädt und die zwei button im notPressed state gezeigt werden , passiert rein GAR NICHTS.

Bitte um Hilfe!^^
[code]
package com.example.meingame;

import java.util.Random;

import android.os.Bundle;
import android.os.Handler;
import android.widget.ImageButton;
import android.app.Activity;

public class MainActivity extends Activity{
public int[] stand = new int[30];
public static ImageButton dreieck;
public static ImageButton kreis;
Handler handler = new Handler();

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
dreieck = (ImageButton)findViewById(R.id.imageButton1);
kreis = (ImageButton)findViewById(R.id.imageButton2);
Random zufall = new Random();
stand[0] = zufall.nextInt(2) + 1;
stand[1] = zufall.nextInt(2) + 1;
stand[2] = zufall.nextInt(2) + 1;

for(int i=0;i<2;i++)
{
if(stand[i]==0)
{
break;
}
switch (stand[i]) {
case 1:
handler.post(new Runnable(){

@Override
public void run() {
dreieck.setPressed(true);
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
dreieck.setPressed(false);
}});
case 2:
handler.post(new Runnable(){

@Override
public void run() {
kreis.setPressed(true);
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
kreis.setPressed(false);
}});
default:
break;
}
}
}
}
[/code]

— geändert am 07.03.2014, 23:01:24

Antworten
Mac Systems
  • Forum-Beiträge: 1.727

08.03.2014, 12:38:45 via Website

Ausser das du den UI Thread blockierst für 2 Sek. passiert da ja auch nix

Windmate HD, See you @ IO 14 , Worked on Wundercar, Glass V3, LG G Watch, Moto 360, Android TV

Antworten
Daniel
  • Forum-Beiträge: 99

08.03.2014, 16:14:16 via Website

Aber ich lass es doch über einen Handler laufen, der nicht auf UI zugreift?

Antworten
Daniel
  • Forum-Beiträge: 99

09.03.2014, 14:04:26 via Website

Oder?

Antworten
Michele
  • Forum-Beiträge: 1.525

09.03.2014, 15:01:23 via Website

Mac meinte bestimmt das du für 2sek. es blockierst, weil du den Thread für 2sek schlafen legst.
1Thread.sleep(2000);


LG

Antworten
impjor
  • Forum-Beiträge: 1.793

10.03.2014, 15:31:38 via Website

Ein Handler führt das Runnable, das du über post aufrufst auf dem Thread auf, in dem du den Handler erstellt hast. In deinem Fall also der UI-Thread.

Liebe Grüße impjor.

Für ein gutes Miteinander: Unsere Regeln
Apps für jeden Einsatzzweck
Stellt eure App vor!

Antworten
Daniel
  • Forum-Beiträge: 99

10.03.2014, 21:52:42 via Website



Sorry, dass ich so spät antworte.
Ja, aber ich dachte wenn ein Handler das postet, erstellt er iwie ein Thread :D *nooby*
Wie würde es in dem Fall laufen, also new Thread und dann über Handler laufen lassen oder wie?
Kann mir das einer mit Code genauer erklären?
So hab es versucht codetechnisch anders zu lösen.
↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
siehe Pics.
Aber ich weiß nicht, ob das effektiv ist, aber es leuchtet trotzdem nichts!-.-
P.S. Ehrlich Leute, mit diesem Scheiß Forumprogramm kann man nicht schreiben. Bitte die markierten Felder korrekt ausfüllen, wird alles rot gemacht, und ich kann nichtma Code posten...
So werde nur noch Premium Code direkt aus Eclipse mit Screenshots hochladen, weil dieses code einfügen ne Katastrophe ist

— geändert am 10.03.2014, 22:02:46

Antworten
Mac Systems
  • Forum-Beiträge: 1.727

11.03.2014, 11:06:28 via Website

Wird das jetzt mode mit dem Screenshots, na ja, das Forum kann kein Syntax Highlighting, auch die Beta Version, Steinzeit!
Du hast recht wir sollten uns alle mehr und in jedem post drüber Aufregen :angry:
Ist ungefähr so als ob man Bilder in Word einfügt und dann verschickt, jeder kennt sowas aus Büros. Kopf -> Tisch!
Wir haben ja hier neue Mods und die Hoffnung stirbt zuletzt, wenn etwas euer auftrag wäre dann sicher das mal nach oben zu delegieren z.b an den Sven.


Back on Topic:

Ein Handler ist nichts anders als eine Art Warteschlange, der UI Thread guckt drauf was zu tun ist. Einer der Jobs wäre genau dein Runnable.

Z.b einen ist dein super.run() überflüssig da es eine Anyonyme Klasse ist, ausserdem ist eine neuer Thread wirklich zuviel hier, da der Handler nur Runnables will, Thread implementiert das "zufällig" mit Thread implements Runnable. Es reicht aber ein einfaches Runnable um Aufgaben an den UI Thread zu senden. Z.b wäre sowas Zeitversetzt möglich indem man handler.postDelayed(deinRunnable,zeitversatz) nutzt.
Damit könnte man z.b zuerst den pressed und direkt danach den unpressed zustand in den Handler einstellen:

1handler.post(pressedZustand);
2handler.postDelayed(unpressedZustand,2000);

Aber diese Lösung ist wirklich dirty, und sollte man an sich nicht so umsetzen, zum einen ist hier zuviel Logik und Runnables zum anderen geht es einfacher ohne sich über Handler gedanken machen zu müssen. Jeder Button jeder ImageView etc kann selektoren benutzen, diese können den hintergrund oder vordergrund markieren. Dafür muss man ihn einfach auf das entsprechende View setzen

1android:background="@drawable/dein_selector"

Der selektor selbst sieht da ungefähr so aus, hab ihn aus einem Projekt hier mal ausgeliehen:

1<?xml version="1.0" encoding="utf-8"?>
2<selector xmlns:android="http://schemas.android.com/apk/res/android" android:enterFadeDuration="@integer/enterFadeDuration" android:exitFadeDuration="@integer/exitFadeDuration">
3
4 <item android:drawable="@drawable/list_entry_background_focused" android:state_activated="true"/> <!-- Activiated for Tablet Two Pane Layout -->
5 <!-- Normal Selection States -->
6 <item android:drawable="@drawable/list_entry_background_pressed" android:state_pressed="true"/> <!-- pressed -->
7 <item android:drawable="@drawable/list_entry_background_focused" android:state_focused="true"/> <!-- focused -->
8 <item android:drawable="@android:color/transparent"/> <!-- default -->
9
10</selector>

Hier werden die Farben/Bilder für jeden einzelnen Zustand der Pressed zustände definiert, z.b man erkennt das Ich hier überalle Drawable verwende, im prinzip kann man hier auch einfach Farben einsetzen und der Hindergrund wird gefüllt. Wichtig dabei ist die reihenfolge von oben nach Unten! da das System sonst falsch arbeitet.

Um jetzt noch die länge der Zustände besser beeinflussen zu können musst du android:enterFadeDuration="@integer/enterFadeDuration"
entsprechend anpassen, hier benutze Ich vom vordefinierte werte. Du kannst aber auch hier z.b 1000 Einfügen damit das einblenden bzw ausblenden 1000ms dauert, was dann 2000ms insgesamt entspricht.

Windmate HD, See you @ IO 14 , Worked on Wundercar, Glass V3, LG G Watch, Moto 360, Android TV

Antworten
Daniel
  • Forum-Beiträge: 99

11.03.2014, 17:30:41 via Website

Danke. Und wie soll ich das jetzt in den Code packen, dass er diesen Zustand für 3 Sekunden wechselt, also auf die nicht dirty art, wenn du mich verstehst :D

Antworten
Daniel
  • Forum-Beiträge: 99

11.03.2014, 21:47:52 via Website

[code]package com.example.meingame;

import java.util.Random;

import android.os.Bundle;
import android.os.Handler;
import android.widget.ImageButton;
import android.app.Activity;

public class MainActivity extends Activity{
public int[] stand = new int[30];
public static ImageButton dreieck;
public static ImageButton kreis;
Handler handler = new Handler();

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
dreieck = (ImageButton)findViewById(R.id.imageButton1);
kreis = (ImageButton)findViewById(R.id.imageButton2);
Random zufall = new Random();
stand[0] = zufall.nextInt(2) + 1;
stand[1] = zufall.nextInt(2) + 1;
stand[2] = zufall.nextInt(2) + 1;

for(int i=0;i<2;i++)
{
if(stand[i]==0)
{
break;
}
switch (stand[i]) {
case 1:
Runnable dreieckpressedZustand = new Runnable(){

@Override
public void run() {
dreieck.setPressed(true);
}

};
Runnable dreieckunpressedZustand = new Runnable(){

@Override
public void run() {
dreieck.setPressed(false);
}

};
handler.post(dreieckpressedZustand);
handler.postDelayed(dreieckunpressedZustand,2000);
case 2:
Runnable kreispressedZustand = new Runnable(){

@Override
public void run() {
kreis.setPressed(true);
}

};
Runnable kreisunpressedZustand = new Runnable(){

@Override
public void run() {
kreis.setPressed(false);
}

};
handler.post(kreispressedZustand);
handler.postDelayed(kreisunpressedZustand,2000);
default:
break;
}
}
}
}



[/code]

So, der startet alles direkt hintereinander, heißt Dreieck und Kreis leuchten manchmal zsm, das liegt glaub ich daran, dass die for-Schleife einfach weitermacht, ohne zu warten.
Deswegen muss ich da etwas einbauen, was die for-Schleife erst fortsetzt, wenn dieser Runnable nach 2 Sek fertig ist, hab schon mit wait() und NotifyAll() rumhantiert, aber die App stürzte nur ab.
Wie kriege ich dieses Warten nun hin, dass der nicht einfach die Schleife ausführt und alles wegrattert? ^^

Antworten
Mac Systems
  • Forum-Beiträge: 1.727

12.03.2014, 00:09:12 via Website

ohh mann, vergiss diesen notify mist, ausser du hast echt plan von Threading. Wie wäre es sich einfach mal anzuschauen wie ein Selektor funktioniert ?

Windmate HD, See you @ IO 14 , Worked on Wundercar, Glass V3, LG G Watch, Moto 360, Android TV

Antworten
Daniel
  • Forum-Beiträge: 99

12.03.2014, 16:33:39 via Website

Ja dieses Pressed habe ich ja schon im XML-Code eingebaut, aber ich will, dass die Taste 3 Sek leuchtet und das muss im Code sein, weil sie nacheinander leuchten soll, verstehste? ^^

Antworten