2011-01-12 11 views
4

Ich habe button_focused, button_pressed und button_normal Bilder. Wenn ich die Taste drücke, wird das Bild button_pressed angezeigt und die Aktion zum Drücken der Taste beginnt.Android. Wie halte ich eine Schaltfläche so lange gedrückt, bis die mit dieser Schaltfläche erstellte Aktion beendet ist?

Wenn ich den Knopf loslasse, wird die Aktion fortgesetzt, aber die Taste kehrt zum button_normal Bild zurück, das angezeigt wird.

Wie kann ich das angezeigte Bild während der gesamten Aktion auf button_pressed einstellen und dann auf das button_normal Image zurücksetzen?

Vielen Dank für Ihre Zeit

+1

Warum sollte android wissen, was die Taste drücken tut? Sie müssen die Staaten selbst verwalten. – Falmarri

+0

Ich denke, er meint, dass Falmarri .. er deutet bereits an, dass er Staaten am Anfang seiner Frage hat. Was er wissen wollte, ist, wie man diese Zustände mit Aktionen verknüpfen kann. Nehmen wir an, er hat einen KnopfA, der beim Drücken ein Foto lädt - wenn er den Knopf drücktA ist aktiv beim Herunterdrücken, aber wenn der Finger sich löst, kehrt er in den normalen Zustand zurück (wie er gerade aufgebaut ist), aber die Fotos sind immer noch geladen und es würde komisch aussehen. Also fragt er sich, ob er den Ladezustand etwas mit dem Ladezustand verbinden kann. Hinweis: Wenn user527405 weiblich ist, ändern Sie bitte alle männlichen Begriffe auf weiblich oben :) –

Antwort

1

Wenn Sie das Bild in der Taste manuell in seiner onClick Methode zu ändern, dann, wenn eine Aktion beendet es das normale Bild für diese Taste wieder einstellen kann. Wenn die Aktion sehr schnell ist, wird die Änderung nicht korrekt angezeigt - es kann auch einen Verzögerungscode benötigen.

+2

Ich denke, das ist möglicherweise die beste Antwort hier, aber ein Beispiel ist erforderlich! –

1

I verwendet

NAME_OF_BUTTON.setImageResource(0xvalueofbutton_pressed image listed in R.java); 

dann, wenn die Aktion beendet ich den Code kopiert und eingefügt, um den ganzzahligen Wert von button_normal.

Ich habe dies vorher anders gemacht und ich kann meine Backups oder Ausdrucke meines Codes nicht finden.

Nochmals vielen Dank für Ihre Antworten.

+0

Nur eine Randnotiz, um Ihr Leben einfacher zu machen. Sie sollten die Werte von R.java nicht verwenden, sondern die Variablen direkt beziehen. Die Werte können sich ändern, wenn IDs neu erstellt werden. Schreiben Sie stattdessen einfach: NAME_OF_BUTTON.setImageResource (R.button_pressed); – Juhani

1

Verwenden (buttonName).setPressed(true)

Und stellen Sie sicher, dass Sie die entsprechende XML-Datei für die ziehbar gehalten haben, dass die für die Staaten wie gedrückt sein drawable definiert, fokussiert etc:

3

ich eine Funktion wie

verwendet
void setHighlighted(boolean highlight) { 
    button.setBackgroundResource(highlight 
           ? R.drawable.bbg_pressed 
           : R.drawable.button_background); 
} 

wo button_background ein Selektor in button_backgroung.xml definiert ist:

<?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/bbg_pressed"></item> 
    <item android:state_focused="true" android:drawable="@drawable/bbg_selected"></item> 
    <item android:drawable="@drawable/bbg_normal"></item> 
</selector> 

Das heißt, dieser Code beeinträchtigt nicht den vom Android-Framework verwendeten gedrückten Zustand. Stattdessen ändert es den Hintergrund, so dass die Schaltfläche gedrückt aussieht.

1

es ein wenig klarer zu machen, wenn Sie nur in der Notwendigkeit einer Zwei-Staaten-Taste sind:

Sie Ihre eigenen button.xml nicht brauchen. Du kannst mit dem normalen Android arbeiten.

Die button.setPressed(true) wird nicht funktionieren, wenn Sie auf die Schaltfläche klicken, weil Android es zurückgesetzt wird, sobald Sie die Schaltfläche loslassen. Versuchen Sie, eine andere Taste setPressed Status zuerst zu setzen, um den Effekt zu sehen.

Das bedeutet, um es auf der gleichen Schaltfläche zu verwenden, muss es verzögert eingestellt werden. Hier ist ein funktionierendes Beispiel. Natürlich funktioniert der erwähnte Ansatz (durch lange ID 18 ..) beim Ändern des Hintergrundes auch.

private final Handler mHandler = new Handler(); 
    rootView.findViewById(R.id.yourButton).setOnClickListener(new OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      boolean pressed = false; 
      if (v.getTag() instanceof Boolean) 
       pressed = (boolean) v.getTag(); 
      final boolean newPressed = !pressed; 
      // setTag to store state 
      v.setTag(newPressed); 
      final View vRun = v; 
      Runnable run = new Runnable() { 
       @Override 
       public void run() { 
        vRun.setPressed(newPressed); 
       } 
      }; 
      mHandler.post(run); 
      // mHandler.postDelayed(run, 5); 
     } 
    }); 
+0

Dies sollte als Antwort akzeptiert werden. Der Schlüssel ist, "um es auf der gleichen Taste zu verwenden, muss es verzögert eingestellt werden". Leider stellt sich dann die Frage, welche Verzögerung zu verwenden ist? 5ms funktionierte nicht, wenn ich schnell klickte. 50ms war viel besser, aber manchmal würde es immer noch nicht funktionieren, wenn ich sehr schnell klicke. Also habe ich mich auf 100ms festgelegt. Dies fühlt sich jedoch wie ein Hack an. –

0

Nur meine 2 Cent als eine weitere Alternative hinzufügen. Anstelle von button.setPressed, das den Status aus dem Selektor verliert, sobald der Benutzer die Schaltfläche loslässt, können Sie setSelected (true) verwenden.Stellen Sie sicher, dass Sie mit setSelected (false) zurückgehen, wenn Sie die Aktion abgeschlossen haben.

 btn.setOnClickListener(view -> { 
     view.setSelected(true); 
    }); 

Und die ziehbar Selektor als Hintergrund für die Schaltfläche hinzu:

<item android:drawable="@drawable/btn_selected" android:state_selected="true"></item>