2016-07-30 15 views
0

Ich versuche, eine App (meine erste), die den Wert von Binärzahlen in einer Dezimalanzeige zeigt. Ich entschied mich, eine ToggleButton mit einem Bild von einer 1 oder 0 zu verwenden, die zeigt, ob es gedrückt wird oder nicht. Ich schaffte es, '1' bis zu einem TextView zu verbinden, so dass, wenn die ToggleButton gedrückt wird, es zeigt "Binary gleich: 1" darunter und ebenso für 0.Wie verwende ich 2 + ToggleButtons, um den Gesamtwert der Schaltflächen zu erhalten?

Ich dachte, das Hinzufügen einer zweiten Taste wäre einfach, aber nach 5 (10?) Stunden Googeln und Experimentieren Ich habe keine Ahnung wie das geht.

Ich habe case breaks versucht, aber wie ich schon seit zwei Wochen Programmierung (udacity Android Development for Beginners bisher) nur wurde ich habe keine Ahnung, wo man als nächste gehen oder wenn ich auf dem richtigen Weg-waren ToggleButtons eine schlechte Idee, zum Beispiel?

Ich denke, was ich tun muss, ist dies:

1) Wenn toggle1 ausgewählt ist, machen valueOfOnes = 1, sonst valueOfOnes = 0

2) Wenn toggle2 (und schließlich 4, 8, 16 ...) wird machen ausgewählt valueOfTwos = 2 sonst = 0

3) ein Verfahren machen, die valueOfOnes-valueOfTwos etc

4) zeigt, dass Mehrwert in Textview

Hoffnung Sie den Code unten schaut nicht zu chaotisch. Es ist aufgeräumter als mein Gehirn früher war ...

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout 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:orientation="vertical" 
android:padding="16dp" 
tools:context="com.example.android.binary02.MainActivity"> 

    <LinearLayout 
     android:layout_width="wrap_content" 
     android:layout_height="0dp" 
     android:layout_weight="3"> 

     <ToggleButton 
      android:id="@+id/toggle2" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_centerVertical="true" 
      android:layout_margin="10dp" 
      android:layout_weight="1" 
      android:background="@drawable/check" 
      android:focusable="false" 
      android:focusableInTouchMode="false" 
      android:textOff="" 
      android:textOn="" /> 

     <ToggleButton 
      android:id="@+id/toggle1" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_centerVertical="true" 
      android:layout_margin="10dp" 
      android:layout_weight="1" 
      android:background="@drawable/check" 
      android:focusable="false" 
      android:focusableInTouchMode="false" 
      android:textOff="" 
      android:textOn="" /> 
    </LinearLayout> 


    <LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="0dp" 
     android:layout_weight="1" 
     android:orientation="horizontal"> 

     <TextView 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:text="Binary equals: " 
      android:textSize="50sp" /> 

     <TextView 
      android:id="@+id/decimal" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:text="0" 
      android:textSize="50sp" /> 
    </LinearLayout> 
</LinearLayout> 

CHECK XML 

<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
<!-- When selected, show one --> 
<item android:drawable="@drawable/one" 
    android:state_checked="true" /> 
<!-- When not selected, show two--> 
<item android:drawable="@drawable/zero" 
    android:state_checked="false"/> 

</selector> 

MainActivity.java:

package com.example.android.binary02; 

import android.app.Activity; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.CompoundButton; 
import android.widget.TextView; 
import android.widget.ToggleButton; 

public class MainActivity extends Activity 
          implements CompoundButton.OnCheckedChangeListener { 
    ToggleButton toggle1; 
    ToggleButton toggle2; 
    TextView decimalAnswer; 
    int valueOfOnes = 1; 
    int valueOfTwos = 2; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     toggle1 = (ToggleButton) findViewById(R.id.toggle1); 
     toggle1.setOnCheckedChangeListener(this); 

     toggle2 = (ToggleButton) findViewById(R.id.toggle2); 
     toggle2.setOnCheckedChangeListener(this); 
     decimalAnswer = (TextView) findViewById(R.id.decimal); 
    } 

    @Override 
    public void onCheckedChanged (CompoundButton compoundButton, boolean oneSelected) { 
     if(oneSelected) { 
      int valueOfOnes = 1; 
      addValues(valueOfOnes); 
     } 
     else 
     { 
      int valueOfOnes = 0; 
      addValues(valueOfOnes); 

     } 
    } 

    /** If this method is commented out and relevant changes made to addValues then one button works fine 
    * 
    * @param compoundButton 
    * @param oneSelected 
    */ 
    @Override 
    public void onCheckedChangedTwo (CompoundButton compoundButton, boolean twoSelected) { 
     if(twoSelected) { 
      int valueOfTwos = 2; 
      addValues(valueOfTwos); 
     } 
     else 
     { 
      int valueOfTwos = 0; 
      addValues(valueOfTwos); 
     } 
    } 


    /** 
    * Adds values together. 
    * 
    * If I delete the int valueOfTwos here and replace with +1 or +0 then the app works (but only for one button it looks like both buttons perform the same action) 
    * 
    */ 
    public void addValues(int valueOfOnes, int valueOfTwos) { 
     int totalValues; 
     totalValues = valueOfOnes + valueOfTwos; 
     displayDecimalAnswer(totalValues); 
    } 

    /** 
    * Displays decimal answer. 
    */ 
    public void displayDecimalAnswer(int answer) { 
     TextView decimalView = (TextView) findViewById(R.id.decimal); 
     decimalView.setText(String.valueOf(answer)); 
    } 
} 

EDITED: Neben Saran Antwort unten versucht, würde dies zu übernehmen answer ein guter Weg zu folgen?

+0

endgültige Antwort gefunden werden kann [hier] (http://stackoverflow.com/questions/38905750/converting-togglebutton-boolean-to-integer-values-then-add-together-in-a-textvie) – mmmartinnn

Antwort

0

Am Ende eine Kombination von Sarans Antwort unten, MRX here und etwas faul Eigensinn von mir hat es zu arbeiten.

@Override 
public void onCheckedChanged(CompoundButton compoundButton, boolean isChecked) { 
    if (compoundButton == toggle1) { 
     if (isChecked) { 
      toggle1Status = true; 
     } else { 
      toggle1Status = false; 
     } 
    } else if (compoundButton == toggle2) { 
     if (isChecked) { 
      toggle2Status = true; 
     } else { 
      toggle2Status = false; 
     } 
    } 
displayDecimalAnswer(); 
} 

    /** 
    * Displays decimal answer. 
    */ 
    public void displayDecimalAnswer() { 
     int valueOfOnes = (toggle1Status) ? 1 : 0;//Since toggle1Status is class level variable it will be accessibible 
     int valueOfTwos = (toggle2Status) ? 2 : 0; 
     int answer = valueOfOnes + valueOfTwos; 

     TextView decimalView = (TextView) findViewById(R.id.decimal); 
     decimalView.setText(""+answer); 
    } 
1

Was Sie im Idealfall tun müssen, müssen Sie setOnCheckedChangeListener zu beiden Umschalter und implementieren Sie dann eine onCheckedChanged Methode. Dann müssen Sie compoundButton verwenden, um zu überprüfen, welche Ansicht umgeschaltet wurde.

Ihr Code sollte in etwa so aussehen.

@Override 
onCreate(){ 
    toggle1 = (ToggleButton) findViewById(R.id.toggle1); 
    toggle2 = (ToggleButton) findViewById(R.id.toggle2); 
    toggle1.setOnCheckedChangeListener(this); 
    toggle2.setOnCheckedChangeListener(this); 
} 

@Override 
onCheckedChanged (CompoundButton compoundButton, boolean isChecked){ 
    if(compoundButton == toggle1){ 
     if(isChecked){ 
      //Your code if toggle 1 is checked 
     } else { 
      //Your code if toggle 1 is not checked 
     } 
    } else { 
     if(compoundButton == toggle2){ 
      if(isChecked){ 
       //Your code if toggle 2 is checked 
      } else { 
       //Your code if toggle 2 is not checked 
      } 
     } 
    } 
} 

Und auch in Ihrem Code nimmt die Deklaration der addValue-Methode zwei Variabales. d. h. in der Zeile public void addValues(int valueOfOnes, int valueOfTwos) werden zwei Variablen genommen, nämlich valueOfOnes und valueOfTwos.

Aber wenn Sie die Methode aufrufen, übergeben Sie nur eine Variable addValues(valueOfTwos), das ist der Grund, warum Sie einen Fehler erhalten.

Wenn Sie in Ihrer Deklaration deklariert haben, dass die Methode zwei Variablen von int akzeptiert, müssen Sie beim Aufruf der Methode auch zwei Variablen von int übergeben.

Bitte korrigieren Sie das und es wird Ihr Problem lösen.

So speichern Sie den Wert Ihres Toggle.

boolean toggle1Status; 
boolean toggle2Status; 

@Override 
onCheckedChanged(CompoundButton compoundButton, boolean isChecked) { 
    if (compoundButton == toggle1) { 

     if (isChecked) { 
      //Toggle one was turned on. 
      toggle1Status = true; 

      if (toggle2Status) { 
       //Your code if both the toggles are on 
      } else { 
       //Your code if toggle 1 is on and 2 is off 
      } 

     } else { 
      //Toggle one was turned off. 
      toggle1Status = false; 

      if (toggle2Status) { 
       //Your code if toggle 1 is off and toggle 2 is on. 
      } else { 
       //Your code if both the toggles are off. 
      } 

     } 
    } else if (compoundButton == toggle2) { 

     if (isChecked) { 
      //Toggle two was turned on. 
      toggle2Status = true; 

      if (toggle1Status) { 
       //Your code if both the toggles are on 
      } else { 
       //Your code if toggle 1 is off and 2 is on 
      } 

     } else { 
      //Toggle two was turned off. 
      toggle2Status = false; 

      if (toggle1Status) { 
       //Your code if toggle 1 is on and toggle 2 is off. 
      } else { 
       //Your code if both the toggles are off. 
      } 

     } 
    } 
} 

Im Grunde, was wir hier tun, ist, dass wir zuerst überprüfen den Zustand des Toggle, die geändert wurde, dann wird der den Zustand des anderen Knies überprüfen. Und damit speichern wir auch den Wert des aktuellen Toggle-Zustands in einer booleschen Variablen für die zukünftige Verwendung.

+0

Vielen Dank. Definitiv einen Schritt näher! Ich habe 'Public Void' vor onCheckedChanged hinzugefügt, ist das richtig? Jetzt wird '2' angezeigt, wenn ich toggle2 und 1 für toggle 1 drücke, aber ich kann immer noch nicht die addValues ​​Methode bekommen, um zwei ganze Zahlen zu akzeptieren. 'public void addValues ​​(int valueOfOnes, int valueOfTwos) { int Gesamtwerte; totalValues ​​= WertOfOnes + WertOfTwos; displayDecimalAnswer (Gesamtwerte); } ' Gibt Fehler 'addValues ​​(int, int) in MainActivity kann nicht auf (int) – mmmartinnn

+0

Dank noch einmal angewendet werden. Also habe ich 'addValues ​​(valueOfOnes, valueOfTwos);' in beiden Teilen der onCheckedChange-Methode. Jede Schaltfläche für sich selbst funktioniert gut, aber die Textansicht 'Binary equals: 0' fügt die beiden Werte nicht zusammen. Es scheint nur den zuletzt gedrückten Knopf zu verarbeiten und den Wert des anderen zu vergessen. Also drücken Sie Toggle 1 es zeigt 01 = 1. Dann drücken Sie Toggle2 und ich bekomme 11 = 2. Drücken Sie erneut t1 und 10 = 0 erscheint. Ich habe versucht, die mittlere "else" herausnehmen, aber das ändert nichts an, wie es läuft. – mmmartinnn

+0

Wenn Sie den Umschaltwert speichern möchten, verwenden Sie zwei Variablen, um den booleschen Wert jedes Umschaltelements zu speichern. dh wenn der Schalter 1 aktiviert ist, dann sollte der BooleanToggle1 auf True gesetzt werden, und wenn Toggle 2 angeklickt wird, können Sie ** 'booleanToggle1' variabale verwenden, um den Zustand von toggle1 ** zu bestimmen. Vergessen Sie auch nicht, den Wert von 'booleanToggle1' auf false zu setzen, wenn toggle1 ausgeschaltet ist. Und das gleiche kannst du für den anderen tun. –