Checkbox nie dziala a powinien ;)

0

Robie szablon pewnego programu na Androida. Dziala mniej wiecej tak, ze klikamy w konkretny button, wyswietla sie okno dialogowe z kilkoma checkboxami, zaznaczam co trzeba, klikam w button ok w tym dialogu, dialog sie zamyka, zaznaczne parametry sa przechowywane gdzies w pamieci zmiennej. Problem w tym, ze nijak nie moge skorzystac z parametrow checkboxa, program sie wywala. Glownie potrzebne mi ifChecked(). Ponizej wklejam metode onClick buttona z dialoga. Nie mam w zasadzie pojecia czemu tak sie dzieje, takze jakby mnie ktos naprowadzil byloby swietnie.

public void buttoncd_wybierz(View view) {
        check1 = (CheckBox) findViewById(R.id.category1);
        check2 = (CheckBox) findViewById(R.id.category2);
        if(check1.isEnabled()) {
            check2.setText("Test");
            Toast.makeText(getApplicationContext(), "Category 1", Toast.LENGTH_SHORT).show();
        }
        if(check2.isChecked()) {
            Toast.makeText(getApplicationContext(),"Category 2",Toast.LENGTH_SHORT).show();
        }
    }

Jak widac buton pobiera dwa checkboxy (id sie zgadza z tymi z activity, jakby co). Jakiekolwiek dzialania na zmiennych check1/check2 skutkuja wywaleniem sie programu. Jakies pomysly? Dzieki!

0

a jaki błąd? zgaduje że NullPointerException

A z jakiego Dialoga wywołujesz findViewById? bo może nie widzi ich w tym Contextcie. Na szybko bez Twojego kodu proponują Ci stworzyć pola Checkbox w onCreateDialog( czy w odpowiedniku w zależności co robisz) i tylko w onClicku sprawdzać czy są zaznaczone.

ale bez całego kodu ciężko coś powiedzieć ;-)

0

Standardowy, 'Program xxx przestal dzialac', czy cos w ten desen.
Jest okno, przycisk. Klikam, otwiera sie okno dialogowe, nowe activity. Kod buttona:

public void buttonCategory(View view) {
        AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(this);
        dialogBuilder.setTitle("Wybierz kategorie");
        LayoutInflater inflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);
        dialogBuilder.setView(inflater.inflate(R.layout.activity_category_dlg, (ViewGroup)findViewById(R.id.layout_category_dialog)));
        dialogBuilder.create();
        dialogBuilder.show();
    }

W tym oknie mam do wyboru wlasnie te checkboxy, zaznaczam jakis, klikam na kolejny button i program sie wysypuje. Domyslam sie, ze moze wlasnie nie widziec checkboxow, natomiast nie widze (jestem tygodniowym amatorem) bledu w kodzie. Mozliwe, ze gdzies przy tworzeniu okna dialogowego powinienem cos dodac/odjac, trudno mi powiedziec.
W zasadzie tyle tez, jesli chodzi o calosc kodu, poniewaz oprocz tego w zasadzie nic wiecej nie ma. Ot, activity, dialog activity, 2 buttony i 2 checkboxy.

0

Nie ustawiam listenera. Dalem w .xml parametr 'onClick' na ta metode. Nie uzywam listenerow, jesli nie musze, strasznie zaciemniaja kod.

0

Jak tam uważasz, ale to raczej używanie onClick zaciemnia kod :P Jestem prawie pewien ze to właśnie to powoduje że rzuca Ci nullami

Spróbuj zrobić tak

dialogBuilder.setPositiveButton("OK", new DialogInterface.OnClickListener() { 
    @Override
    public void onClick(DialogInterface dialog, int which) {
        doOnDialogButtonClick()
    }
});


......


private void doOnDialogButtonClick(){
         check1 = (CheckBox) findViewById(R.id.category1);
        check2 = (CheckBox) findViewById(R.id.category2);
        if(check1.isEnabled()) {
            check2.setText("Test");
            Toast.makeText(getApplicationContext(), "Category 1", Toast.LENGTH_SHORT).show();
        }
        if(check2.isChecked()) {
            Toast.makeText(getApplicationContext(),"Category 2",Toast.LENGTH_SHORT).show();
        }

i daj znać czy tak działa :D

0

Okazuje sie, ze nie dziala. "Unfortunately, Program has stopped."
Skasowalem wlasny button z .xml, dodalem Twoj kod, zaraz ponizej metode listenera.

Przenioslem kod na warstwe glownego layoutu, wszystko dziala. Problem jest przez okno dialogowe. Tylko niezaleznie jak sie staram, nie wiem jak blad naprawic.

0

Ja tez juz dzis nie mysle, dlatego jutro sie tym zajme. Androida (czyli w glownie javy) ucze sie od niedawna. A, ze jako tako potrafie cos tam programowac (w innych jezykach) to czesto pomijam podstawy, robie swoje i to nawet wychodzi. Niestety czasem trafi sie kwiatek taki jak ten, gdzie nie potrafie wyciagnac prostej informacji i robi sie glupio ;)

0

Podbijam. Nadal nie mam pojecia czemu wywala blad. Dzieje sie to wtedy, gdy probuje odwolac sie do stworzonego w activity dialog checkboxa. Stworzylem sobie od nowa czysty projekt i wywolalem wszystko listenerami, problem nadal wystepuje, takze nie ma znaczenia ta kwestia.

0

Już wiem czemu rzuca null pointerem.... bo jak się odwołujesz do tych checkboxów to już ich nie ma bo dismissujesz dialog, w związku z tym zgodnie z prawdą twierdzi że ich nie ma.

zapisz ich stan w jakiejś zmiennej logicznej i wsio

pzdr

0

Mialoby to sens, gdyby nie fakt, ze niezaleznie gdzie odnosze sie do check boxow zawsze program sie wywala. Niekoniecznie musi to byc metoda nacisniecia przycisku 'ok'.

public void buttonCategory(View view) {
        AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(this);
        dialogBuilder.setTitle("Choose category");
        LayoutInflater inflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);
        dialogBuilder.setView(inflater.inflate(R.layout.activity_category_dlg, (ViewGroup) findViewById(R.id.layout_category_dialog)));
        dialogBuilder.setCancelable(false);
        CheckBox czek = (CheckBox) findViewById(R.id.category1);
        if(czek.isChecked()) {  // CZY TO TU
            Toast.makeText(getApplicationContext(),"Dupa1",Toast.LENGTH_SHORT).show();
        }
        dialogBuilder.setPositiveButton("Yes", new Dialog.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int whichButton) {
                    if(czek.isChecked()) { //CZY TU
                        Toast.makeText(getApplicationContext(),"Dupa1",Toast.LENGTH_SHORT).show();
                    }
                //Toast.makeText(getApplicationContext(),"Dupa",Toast.LENGTH_SHORT).show();

            }
        });
        dialogBuilder.create();
        dialogBuilder.show();
        if(czek.isChecked()) { //CZY TEZ TU
            Toast.makeText(getApplicationContext(),"Dupa1",Toast.LENGTH_SHORT).show();
        }

Oczywiscie normalnie kod if mialem tylko w jednym miejscu i dla niego sprawdzalem dzialanie. Nie ma znaczenia, czy odniose sie do check boxa przed wywolaniem dialoga, po wywolaniu, w metodzie buttona, wszedzie nie trybi. Znalazlem inny sposob na zrobienie tego czego chce i w zasadzie ten moge porzucic, natomiast nie ukrywam, ze zalezy mi na zrozumieniu kodu i tego bledu, co zapewne przydac sie moze w przyszlosci.

0

No i słusznie bo tak powinno być że Ci rzuca NullPointerem. Bo nie masz tego View (tak samo będzie jak np. spróbujesz wczytać View który w innej activity jest, też będzie null) w swoim kontekscie. Tak przynajmniej ja to rozumiem. Zrób sobie klasę dziedziczącą po dialog fragment, tam sczytaj wartość checkbox-ów i wróc do activity. I czystszy kod i ładniej i na pewno zadziała ;-)

0

Ok, dzieki za pomoc!

1 użytkowników online, w tym zalogowanych: 0, gości: 1