Java/Android диалогов прозорец с EditText - булева проверка на низове

Имам булев метод, който връща true или false, за да проверя дали съществуват данни в низове или не. Всичко работи добре, ако потребителят въведе всички данни или не премине през диалоговите прозорци.....НО....ако потребителят НЕ въведе данни в изскачащия диалогов прозорец "getItemsEditText" И все пак кликне върху "OK", това булево е разрешаване на true, въпреки че "pricePerItemText" все още няма нищо съхранено. Това е булевият метод:

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;
    }
}

Ето къде булевото значение се тества, за да се види дали е вярно или невярно:

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();
     }

}

Ето как е написан диалогът с бутоните EditText и OK/Cancel:

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();

Има ли друг начин да направите това? Защо потребителят все още може да кликне върху „OK“, ако не е въвел нищо? Някакви идеи? Благодаря момчета!


person dell116    schedule 07.01.2011    source източник


Отговори (1)


Публикувахте твърде много код. Но веднага забелязах това

pricePerItemText != ""

Ако приемем, че pricePerItemText е низ, за ​​който наистина нямаме представа, тъй като не сте го включили, това не е начинът, по който сравнявате низове в java. Трябва да бъде

!pricePerItemText.equals("");

Редактиране:

В java операторът == сравнява препратки към обекти, а не стойности. Така

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

никога няма да отпечата true, защото променливата mytext сочи към някакво място в паметта, което определено не е същото като мястото, към което сочи "текст".

Фактът че

"text == "text"

е вярно е артефакт на Java, който поддържа набор от низове, така че не се налага да преразпределя нови низове. Това е основна причина за объркване.

Ето произволна връзка, която вероятно го описва по-добре

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

person Falmarri    schedule 07.01.2011
comment
Благодаря Фалмари. Съжалявам за публикуването на целия този код. Просто исках да се уверя, че всеки, който го гледа, може логично да прегледа всичко. Знаех си, че е нещо тъпо. Да, вероятно вече знаете това. Аз съм Java NOOB. - person dell116; 08.01.2011
comment
@dell116: Винаги има компромис между публикуването на твърде много и твърде малко код. В идеалния случай трябва да публикувате най-малката част от компилируем код, който демонстрира проблема. С android обаче е трудно. - person Falmarri; 08.01.2011
comment
и само за да бъде ясно.... въпреки че не показах изрично в кода си, че pricePerItemText е низ, уточних, че тествам низове в моето описание. - person dell116; 08.01.2011
comment
проработи, защото булевото значение сега се оценява правилно. Както казах, нов съм в Java, така че синтаксисът ми може да е малко по-различен на моменти, но програмирам от около 3 години. Не съм сигурен дали сте саркастичен трол в темата или наистина искате да знаете дали разбирам....в такъв случай....да...разбирам....благодаря ви за загрижеността. - person dell116; 08.01.2011
comment
#dell116: Не, той пита дали разбирате защо pricePerItemText != е вярно, независимо каква е стойността на pricePerItemText - person Falmarri; 08.01.2011
comment
Добре. Мислех, че ме пита дали знам защо булевата стойност се оценява правилно след корекцията. Falmarri, разбрах, че корекцията ви е подходящият начин за оценка дали даден низ съдържа или не каквото и да е вътре в .equals(), което дава булево значение true или false. Доколкото разбирам най-добре, това, което правех преди, беше просто да питам дали низът не е равен на , което в този случай винаги е вярно, защото това е, което потребителят го задава, когато щракне върху OK върху празен EditText. Прав ли съм за това? Ако не, ще съм много благодарен за допълнително обяснение. - person dell116; 08.01.2011
comment
Не, ще редактирам отговора си, въпреки че този въпрос се задава всеки ден - person Falmarri; 08.01.2011
comment
добре... боже... добре е да знаеш. Благодаря за обяснението, въпреки че вече си набил този кон до кървава каша. Скачам с главата напред в android с малко познания за Java, така че повечето от книгите за android, които намерих онлайн, не обясняват много за начина, по който Java се държи. Още веднъж ви благодаря. - person dell116; 08.01.2011