2017-11-24 4 views
1

Nehmen wir an, ich habe einen Schalter, der einen Android-Dienst steuert: Wenn der Schalter in seinem "Ein" -Zustand ist, bedeutet dies, dass der Dienst läuft, und wenn der Schalter in seiner "Aus" -Position ist, bedeutet dies, dass der Dienst ist nicht laufen. Wenn der Benutzer auf den Switch tippt, sollte er außerdem den Dienst umschalten (und daher den angezeigten Status des Switches umschalten, da, wie bereits erwähnt, der angezeigte Status des Switches den Status des Dienstes verfolgt).Wie man ein Switch-Steuerelement macht zeigen, dass es "ein" oder "aus" ist?

Methode 1: Geben Sie dem Switch einen onCheckedChanged Listener, der den Dienst abhängig vom neuen aktivierten Status ein- oder ausschaltet .

ich nicht Methode mag # 1, weil, wenn der Benutzer auf den Dienst schaltet sich durch den Switch schneidend, ich will es nicht aussehen wie sie eingeschaltet ist, bis der Dienst tatsächlich beginnt, , die nicht sofort sein kann (und es wird möglicherweise nicht erfolgreich gestartet, aber ich werde diese Möglichkeit hier zur Vereinfachung ignorieren). Ebenso, wenn der Benutzer den Dienst ausschaltet, möchte ich nicht, dass der Switch so aussieht, als wäre er aus , bis der Dienst tatsächlich heruntergefahren wurde.

Methode # 2: Wenn Sie auf den Switch tippen, wird der Dienst umgeschaltet, ohne den angezeigten Status zu ändern. Der angezeigte Status wird nur angezeigt, wenn der Dienst erfolgreich auf- oder abwärts gegangen ist.

ich nicht Methode mag # 2 entweder (auch wenn ich wusste, wie es zu implementieren), da der Benutzer nicht unmittelbares Feedback bekommt, dass der Hahn erkannt wurde, und darüber hinaus, wenn der Dienst nicht erfolgreich Zustand ändern, dann gibt es überhaupt keine Rückmeldung. Ich halte das für schlecht.

Methode # 3: Machen Sie es so tippen schaltet auf den Schalter sofort Daumenaufsatz aber nicht die Farbe und schaltet den Dienst, und stellen Sie Farbe der Schalter ist der Ist-Zustand des Service zu bieten. So können sich die Farbänderungen relativ zu den Änderungen der Daumenposition verzögern.

Das bedeutet, dass der Schalter 4 möglich visuelle Zustände hat anstelle von 2:

  • "off" (Daumen weg, Farbe off) off: thumb off, color off
  • "Einschalten" (Daumen, Farbe off) turning on: thumb on, color off
  • "on" (Daumen auf, Farbe auf) on: thumb on, color on
  • "ausschalten" (off Daumen, Farbe auf) turning off: thumb off, color on

Ich mag die Idee der Methode # 3. Was ist der sauberste Weg, um es zu implementieren?

Es scheint mir, dass ich wahrscheinlich zwei Zuhörer installieren haben:

  • ein onCheckedChanged Zuhörer, die die Daumenposition zu ändern wie gewöhnlich erlaubt, aber der Schalter der Farbe setzt das Gegenteil von dem sein, was es normalerweise sein (so dass es seine Farbe ändert sich nicht), und schaltet den Dienst
  • ein Zuhörer für die Benachrichtigung, dass der Dienst oder unten hat kommen, die unabhängig von der Daumenlage der Schalter der Farbe setzt (obwohl es auch die Daumenposition ändern kann, in dem Fall, dass der Dienst aufgrund externer Kräfte nach oben oder unten ging, da wir wollen, dass der Switch das verfolgt).

Ich bin sicher, ich kann herausfinden, wie die Benachrichtigung, dass der Dienst hoch oder runter gekommen ist implementieren. Und beachten Sie, dass ich nicht den Daumen Position Verhalten von seiner Standardeinstellung ändern möchte. Also wirklich ich denke, alles was ich wissen muss ist: Wie ändere ich vorübergehend einen "on" Switch, um das "off" Farbschema zu haben, und umgekehrt?

Ich habe den Eindruck, diese Anrufe zu einem oder mehreren der Schalter Methoden setTint(), setTintList(), setTintMode() beinhalten. Aber ich bin mir nicht sicher, was genau die Anrufe wären.

Ich würde auch alle anderen guten Ideen begrüßen, wie man einen Schalter gibt, der unmittelbare Rückmeldung gibt, dass es "anstellt" oder "abstellt", ohne sofort als "an" oder "aus" anzuzeigen.

+0

Sie dies, indem drei boolean Variablen erreichen können. 1) Überprüfen Sie den Status Ihres Dienstes läuft oder nicht. 2) Um zu überprüfen, ob der Benutzer mit dem Switch interagiert. 3) Um den Status Ihres Schalters zu ändern. – Lucky

Antwort

1

Ich mag Ihre Idee. Ich denke, setTintList wird dein Freund sein.

Was Sie tun möchten, ist so etwas wie dieses:

int[][] states = new int[][] { 
     new int[] {-android.R.attr.state_checked}, 
     new int[] {android.R.attr.state_checked}, 
}; 

int[] thumbColors = new int[] { 
     Color.LIGHTBLUE, 
     Color.BLUE, 
}; 

int[] trackColors = new int[] { 
     Color.YELLOW, 
     Color.RED, 
}; 

DrawableCompat.setTintList(DrawableCompat.wrap(yourSwitchCompatView.getThumbDrawable()), new ColorStateList(states, thumbColors)); 
DrawableCompat.setTintList(DrawableCompat.wrap(yourSwitchCompatView.getTrackDrawable()), new ColorStateList(states, trackColors)); 

Mit diesem Code Sie die Daumen/Spurfarben programmatisch einstellen. Sie müssen für jeden Ihrer unterschiedlichen Zustände (wie Sie bereits erwähnt haben) unterschiedliche Farben einstellen. Abhängig von Ihrem Status/Rückruf möchten Sie die Farben entsprechend ändern. Es sollte so funktionieren.

könnte eine andere Idee:

  • Schalter deaktiviert
  • Tippen Sie auf Schalter
  • Schalter austauschen mit Ladeanzeige/spinner
  • Auf Rückruf Erfolg: aktiv Spinner anzeigen
+0

Danke, das hat mich auf den Weg gebracht. mySwitch.set {Thumb, Track} TintList() funktioniert auch (api level> = 23). Irgendeine Idee, wie man die passenden Farben findet, um zu verwenden? Ich möchte keine neuen Farben fest codieren; Ich möchte nur die vorhandenen Farben behalten, von den Standardeinstellungen oder dem aktuellen Thema oder was auch immer. Ich hatte gehofft, dass ein erster Aufruf von mySwitch.get {Thumb, Track} TintList() mir sagen würde, aber leider geben sie anfänglich null zurück. –

0

Wo immer Sie wollen, wechseln .. verwenden Sie das folgende Layout ..

0 Jetzt
<FrameLayout 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content"> 
     <android.support.v7.widget.SwitchCompat 
      android:id="@+id/sw_compat" 
      android:layout_width="100dp" 
      android:layout_height="50dp" 
      android:checked="false" 
      /> 
     <LinearLayout 
      android:id="@+id/ll_touch_interceptor" 
      android:layout_width="100dp" 
      android:layout_height="50dp" 
      android:orientation="vertical"> 

     </LinearLayout> 
    </FrameLayout> 

zu Aktivität kommen, brauchen Sie keine onCheckedChangeListeners..use Code unten ..

sw_compat= (Switch) findViewById(R.id.sw_compat); 
     ll_touch_interceptor= (LinearLayout) findViewById(R.id.ll_touch_interceptor); 
     ll_touch_interceptor.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       ProgressDialog dialog = new ProgressDialog(DummyDialog.this); 
       if (sw_compat.isChecked()) 
       { 
        dialog.setMessage("Demolishing service"); 
        dialog.show(); 
        //write code to initiate service/operation 
        //whenever you got feedback that service got successfully initiated then check the switch 
        if (service_successfully_disabled) { 
         dialog.dismiss(); 
         sw_compat.setChecked(false); 
        } 
        else 
         { 
          Toast.makeText(DummyDialog.this, "Sorry! Failed to stop service", Toast.LENGTH_SHORT).show(); 
         } 
       } 
       else 
        { 
         dialog.setMessage("Initiating service"); 
         dialog.show(); 
         if (service_successfully_enabled) { 
          dialog.dismiss(); 
          sw_compat.setChecked(true); 
         } 
         else 
         { 
          Toast.makeText(DummyDialog.this, "Sorry! Failed to start service", Toast.LENGTH_SHORT).show(); 
         } 
        } 
      } 
     }); 
Verwandte Themen