2011-01-07 9 views
0

Ich habe eine boolesche Methode, die true oder false zurückgibt, um zu überprüfen, ob Daten innerhalb von Strings existieren oder nicht. Alles funktioniert in Ordnung, wenn der Benutzer alle Daten eingibt oder die Dialoge nicht durchläuft ..... ABER .... wenn der Benutzer keine Daten in das "getItemsEditText" -Dialogfenster eingibt UND weiterhin auf "OK" klickt, ist dieser Boolesche Wert Auflösen nach True, obwohl "pricePerItemText" immer noch nichts gespeichert hat. Dies ist die Boolesche Methode:Java/Android Dialog mit EditText - Boolesche Überprüfung von Strings

public Boolean doesAllDataExistCheckBool() 
{ 

    if (pricePerItemText != "" && itemsPerDayText != "" && sleepTimeText != "" && 
    wakeTimeText != "") 
    { 

     SharedPreferences.Editor editor = mySharedPreferences.edit 
     (); //opens shared preference editor 
     editor.putBoolean("storedDoesAllDataExist", true); 
     editor.commit(); //commit changes to mySharedPreferences 
     //End storing shared preferences 
     return true; 
    } 
    else 
    { 
     SharedPreferences.Editor editor = mySharedPreferences.edit 
     (); //opens shared preference editor 
     editor.putBoolean("storedDoesAllDataExist", false); 
     editor.commit(); //commit changes to mySharedPreferences 
     //End storing shared preferences 

     return false; 
    } 
} 

Hier ist, wo die boolean wenn sie wahr oder falsch, um zu sehen getestet wird:

if (position == 4) 
    { 
    allDataExists = doesAllDataExistCheckBool(); //checks if true or false 

    if (serviceStarted == true) 
    { 
     Context context = getApplicationContext(); 
     String text = "Schedule is already running"; 
     int duration = Toast.LENGTH_SHORT; 
     Toast toast = Toast.makeText(context, text, duration); 
     toast.show(); 
    } 
    if (serviceStarted == false && doesAllDataExistCheckBool() == true) 
    { 
    startScheduleService(); 
    } 
    if (serviceStarted == false && doesAllDataExistCheckBool() == false) 
    { 
     Context context = getApplicationContext(); 
     String text = "Please enter all data before starting!"; 
     int duration = Toast.LENGTH_SHORT; 
     Toast toast = Toast.makeText(context, text, duration); 
     toast.show(); 
    } 

} 

Hier ist, wie der Dialog mit EditText und OK/Abbrechen Tasten geschrieben:

case ITEMS_PER_DAY : 

LayoutInflater li = LayoutInflater.from(this); 

final View itemsEntryView = li.inflate(R.layout.settings_dialog_input, (ViewGroup) 
findViewById(R.id.layout_root)); 

final EditText getItemsEditText = (EditText)itemsEntryView.findViewById 
(R.id.DialogEditText); 


return new AlertDialog.Builder(SettingsActivity.this) 

.setTitle("This is the title") 

.setView(itemsEntryView) 

.setPositiveButton("Ok", new DialogInterface.OnClickListener() 
{ 
    public void onClick(DialogInterface dialog, int whichButton) 
    { 

    itemsPerDayText = getItemsEditText.getText().toString(); //gets input from 
    edittext and saves it to a string itemsPerDayText 


    //Initialize shared preferences 
    SharedPreferences.Editor editor = mySharedPreferences.edit(); //opens editor 
    editor.putString("storedItemsPerDayText", itemsPerDayText); 
    editor.commit(); //commit changes to mySharedPreferences 
    //End storing shared preferences 

    } 
}) 
.setNegativeButton("Cancel", new DialogInterface.OnClickListener() 
{ 
    public void onClick(DialogInterface dialog, int whichButton) 
    { 
    //user click cancel 
    } 
}).create(); 

Gibt es eine andere Möglichkeit, dies zu tun? Warum kann der Benutzer immer noch auf "OK" klicken, wenn er überhaupt nichts eingegeben hat? Irgendwelche Ideen? Danke Leute!

Antwort

1

Sie haben zu viel Code geschrieben. Aber sofort bemerkte ich diese

pricePerItemText != "" 

Unter der Annahme, pricePerItemText eine Zeichenfolge ist, die wir wirklich keine Ahnung haben, seit Sie, dass nicht enthalten ist, das ist nicht, wie Sie Strings in Java vergleichen. Es braucht

!pricePerItemText.equals(""); 

bearbeiten sein:

in Java, die == Operator Objekte Referenzen vergleicht, keine Werte. So

String mytext = "text"; 
if (mytext == "text"){ print "True"} 

wird nie wahr drucken, weil die mytext Variable zu einem gewissen Speicherplatz zeigt, die die meisten ist definitiv nicht das gleiche wie in dem „Text“ verweist.

Die Tatsache, dass

"text == "text" 

wahr ist, ist ein Artefakt von Java einen String-Pool zu halten, damit es nicht neue Saiten neu zu verteilen hat. Dies ist ein Hauptgrund für Verwirrung.

Hier ist eine zufällige Verbindung, die es

http://leepoint.net/notes-java/data/expressions/22compareobjects.html

+0

Dank Falmarri wahrscheinlich besser beschreibt. Entschuldigung für die Veröffentlichung dieses Codes. Ich wollte nur sichergehen, dass jeder, der es ansieht, logischerweise alles durchgehen könnte. Ich wusste, dass es etwas Dummes war. Ja, das weißt du wahrscheinlich schon. Ich bin ein Java NOOB. – dell116

+0

@ dell116: Es ist immer ein Kompromiss zwischen zu viel und zu wenig Code zu schreiben. Im Idealfall sollten Sie das kleinste bisschen kompilierbaren Code veröffentlichen, der das Problem veranschaulicht. Es ist jedoch schwierig mit Android. – Falmarri

+0

und nur um klar zu sein .... Obwohl ich in meinem Code nicht explizit gezeigt habe, dass PricePerItemText eine Zeichenfolge ist, habe ich angegeben, dass ich Strings in meiner Beschreibung getestet habe. – dell116