Dialogfönster och int-konvertering

Diskussion i 'Apputveckling' startad av crazyrobban, 1 apr 2012.

  1. crazyrobban

    crazyrobban Teen Droid Medlem

    Blev medlem:
    10 dec 2009
    Inlägg:
    565
    Mottagna gillanden:
    30
    Ort:
    Göteborg
    Hej,

    Jag sitter i Eclipse och har slitit mitt hår i ett par timmar nu.
    Mest för att jag tror det är ett väldigt enkelt problem.

    Appen ser ut som följande:

    Användare trycker på en knapp, upp kommer en dialogruta med ett "EditText" fält och en "Ok" knapp. Jag vill att det användaren skriver i fältet ska skickas till en INT variabel. Först körde jag helt enkelt det här:
    Min_INT_Variabel = R.id.mitt_edit_text_fält och värdet blev fullständigt galet.
    Sen försökte jag med allehanda Integer.parseInt och valueOf, för att inte tala om getText().ToString() och det kraschar bara min app ständigt och jämnt.
    Som jag förstått det från ca. 20 olika sidor på nätet, så handlar det om att värden i dialogrutor är på separerade från huvudaktiviteten?

    Det andra problemet, är att jag kan bara öppna den här dialogrutan en gång.
    Den "byggs" så att säga i min onClickListener, och det vore skönt att slippa skriva en funktion för den, kan jag på ett enkelt sätt riva dialogrutan när användaren trycker "ok" så den kan byggas upp på nytt nästa gång användaren trycker?
    Logcat om dialogproblemet:
    "java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first."

    Tacksam för all hjälp jag kan få, detta driver mig till vansinne! :)
     
    Last edited: 1 apr 2012
  2. Buzz

    Buzz Professional Droid Medlem

    Blev medlem:
    14 maj 2010
    Inlägg:
    2 167
    Mottagna gillanden:
    154
    R.id.mitt_edit_text_fält är id för editboxen, inte innehållet i den. Du behöver leta upp editboxen med findView(R.id.mitt_edit_text_fält) eller något sånt. Och sedan kan du fråga den om dess innehåll. Du får då en sträng och den behöver du sedan göra om till heltal med parseInt.
     
  3. crazyrobban

    crazyrobban Teen Droid Medlem

    Blev medlem:
    10 dec 2009
    Inlägg:
    565
    Mottagna gillanden:
    30
    Ort:
    Göteborg
    Jag förstår problematiken lite bättre nu efter ytterligare en timmes hårslit.

    Säg att jag deklarerar mitt edit text fält globalt.
    EditText fält;

    Följer sedan upp i dialogrutans kod med:
    fält = (EditText) findViewById(R.id.edit_text_fält);

    För att sedan göra följande:
    String lol = fält.getText().toString();

    Då kraschar appen. Det är definitivt vid getText().toString skedet.
    Någon som har någon aning?
    Logcat infon är inte mycket till hjälp. NullPointerException.
     
  4. Senap

    Senap Teen Droid Medlem

    Blev medlem:
    12 dec 2010
    Inlägg:
    113
    Mottagna gillanden:
    13
    Ort:
    Göteborg
    NullPointerException, alltså är din EditText (fält) == null. Men det står nog i LogCat exakt vilken komponent som är null.

    Kan det ha att göra med att du använder bokstaven ä? eller gör du bara det här på forumet? Även om inte det är felet så rekommenderar jag att bara använda engelska alfabetet och skippa "å ä ö" i din kod.

    Koden ser korrekt ut annars..

    Kod:
    EditText field = (EditText) findViewById(R.id.textfield);
    String data = field.getText().toString();
    Kan det vara att du kör getText innan du har kört findViewById, då kommer EditText ju att vara null?
     
  5. crazyrobban

    crazyrobban Teen Droid Medlem

    Blev medlem:
    10 dec 2009
    Inlägg:
    565
    Mottagna gillanden:
    30
    Ort:
    Göteborg
    :-/

    Inga å,ä,ö. Det var bara för att det skulle vara lite trevligare här på forumet.
    Och getText delen är tyvärr efter finViewById. Tack för förslagen dock!

    04-01 21:18:44.295: E/AndroidRuntime(28248:( java.lang.NullPointerException
    04-01 21:18:44.295: E/AndroidRuntime(28248:( at com.lofgren.app-namn.Main$4$1.onClick(Main.java:146)

    04-01 21:18:44.295: E/AndroidRuntime(28248:( at com.android.internal.app.AlertController$ButtonHandler.handleMessage(AlertController.java:165)
     
  6. Senap

    Senap Teen Droid Medlem

    Blev medlem:
    12 dec 2010
    Inlägg:
    113
    Mottagna gillanden:
    13
    Ort:
    Göteborg
    Kan du inte lägga upp din kod så att man kan ta sig en närmare titt? Det är svårt att diagnosera annars :)

    När det gäller dialogrutor så brukar jag själv använda AlertDialog. Kolla exemplet längst ner för hur man kan göra en egen design på dialogen. Visst, det är lite mer kod än med andra dialogrutor men det blir precis som man vill ha det och du bygger upp den varje gång användaren tar fram den.
     
  7. e7andy

    e7andy Adult Droid Medlem

    Blev medlem:
    14 okt 2009
    Inlägg:
    1 423
    Mottagna gillanden:
    243
    Ort:
    Göteborg
    Vi behöver ha lite mer kod för att se hur du skapar din dialog.

    Kolla här för hur man gör custom dialogs:
    http://developer.android.com/guide/topics/ui/dialogs.html#CustomDialog
    Hämta en referens till (i exemplet) texten i dialogen med:
    TextView text = (TextView) dialog.findViewById(R.id.text);

    Dvs. från den aktivitet som startar dialogen så går du via det instansierade Dialog-objektet och hämtar det du vill ha.
     
  8. crazyrobban

    crazyrobban Teen Droid Medlem

    Blev medlem:
    10 dec 2009
    Inlägg:
    565
    Mottagna gillanden:
    30
    Ort:
    Göteborg
    Nu är koden hemma och jag är på jobbet, men dialogrutan har jag byggt utifrån APIDemos delen för Custom Dialogs.

    Alltså,

    Vid tryck på en knapp
    {
    bygg dialogruta
    --{
    gör det ena och det tredje
    när "ok" knappen trycks på i dialogrutan
    ------{
    gör något annat
    ------}
    --}
    visa dialogruta
    }


    Om jag inte minns fel.
    Jag hade säkert kunna bygga det betydligt snyggare genom att hantera koden för dialogrutan i ett tidigare skede, och bara anropa det vid knapptryckningen.
    Jag är fortfarande mega-noob på java programmering. :)

    Jag laddar upp koden i eftermiddag.
    Tack för all hjälp!
     
  9. DreamHawk

    DreamHawk Android Medlem

    Blev medlem:
    28 maj 2010
    Inlägg:
    6 104
    Mottagna gillanden:
    414
    Jag är rätt van vid att jobba med CustomDialogs iom min Anteckningsapp samt kalori-appen, så, om du bara visar oss den snuttkoden med dialogen, så kan jag nog hjälpa till
     
  10. Maxxan

    Maxxan Teen Droid Medlem

    Blev medlem:
    22 mar 2010
    Inlägg:
    161
    Mottagna gillanden:
    4
    Du har satt vilken layout dialogen ska använda? Annars kommer findViewById retunera null. Typ setContentView(R.layout.mydialog); i onCreate eller i konstruktorn eller nån annan stans innan du försöker hämta ut editfältet?
     
  11. crazyrobban

    crazyrobban Teen Droid Medlem

    Blev medlem:
    10 dec 2009
    Inlägg:
    565
    Mottagna gillanden:
    30
    Ort:
    Göteborg
    Kod kommer efter jobbet. :)

    Layouten är definierad, annars hade jag ju inte ens sett något i dialogrutan antar jag.
    Jag har flyttat runt den lite grann i koden för att se om det löste problemet, men oavsett om jag haft den definierad globalt, i onCreate eller till och med i onClickListener delen så har det inte gjort någon skillnad.

    Jag är på en så pass låg nivå, så jag är inte ens helt hundra på vad jag menar när jag säger globalt. Jag antar att det är när något är definierat innan onCreate och liksom, precis i början av aktiviteten?
     
  12. crazyrobban

    crazyrobban Teen Droid Medlem

    Blev medlem:
    10 dec 2009
    Inlägg:
    565
    Mottagna gillanden:
    30
    Ort:
    Göteborg
    Ok, här är min main.java fil. :-)
    Bortplockad
    be gentle...
     
    Last edited: 3 apr 2012
  13. e7andy

    e7andy Adult Droid Medlem

    Blev medlem:
    14 okt 2009
    Inlägg:
    1 423
    Mottagna gillanden:
    243
    Ort:
    Göteborg
    Du har lagt in en null-kontroll nu va? Då slipper du NullPointerExceptions antar jag, men du får inget värde.

    Testa att istället för:
    pris = (EditText) findViewById(R.id.pris_edit);
    göra:
    pris = (EditText) dialog.findViewById(R.id.pris_edit);

    Kolla med hjälp av debuggern att du får ut rätt objekt till pris.
     
  14. crazyrobban

    crazyrobban Teen Droid Medlem

    Blev medlem:
    10 dec 2009
    Inlägg:
    565
    Mottagna gillanden:
    30
    Ort:
    Göteborg
    Tack! Men, det verkar inte vara lösningen.
    Jag får felmeddelandet: "the method findViewById(int) is undefined for the type dialogInterface" och Eclipse ger mig suspekta förslag.

    Efter två förslag så slutade den ge felmeddelanden och istället så koden ut enligt följande:
    pris = (EditText) ((EditText) dialog).findViewById(R.id.pris_edit);

    Och det verkar ju vara fullständigt galet?

    För övrigt ska det nämnas att trots min null kontroll, så kraschar ändå appen.
     
  15. e7andy

    e7andy Adult Droid Medlem

    Blev medlem:
    14 okt 2009
    Inlägg:
    1 423
    Mottagna gillanden:
    243
    Ort:
    Göteborg
    Det ser helt galet ut. Du castar ditt DialogInterface till en EditText vilket borde ge ett ClassCastException el.dyl.

    Testa att casta dialog till en AlertDialog och sedan hämta ut din vy:
    AlertDialog alertDlg = (AlertDialog)dialog;
    pris = (EditText) alertDlg.findViewById(R.id.pris_edit);
     
  16. crazyrobban

    crazyrobban Teen Droid Medlem

    Blev medlem:
    10 dec 2009
    Inlägg:
    565
    Mottagna gillanden:
    30
    Ort:
    Göteborg
    Ska pröva det när jag kommer hem. :)
    Har besiktning på bilen efter jobbet, så det kan bli en happy coding moment eller sad coding moment i eftermiddag... :ehm:
     
  17. crazyrobban

    crazyrobban Teen Droid Medlem

    Blev medlem:
    10 dec 2009
    Inlägg:
    565
    Mottagna gillanden:
    30
    Ort:
    Göteborg
    Åh! Detta löste det! :D
    Nu blev jag glad!

    Nu ska jag bara se till att min app inte kraschar varje gång jag försöker öppna samma dialog mer än en gång. ^^

    Edit:
    För folk med samma problem, skapa dialogen separat och låt knappen enbart kalla på den.
    Annars byggs den (såklart, lätt att vara efterklok) upp flera gånger och det blir så klart galet. :)
     
    Last edited: 3 apr 2012