• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Java/Android - Wiele listenerów w pętli.

Object Storage Arubacloud
0 głosów
207 wizyt
pytanie zadane 8 czerwca 2018 w Java przez neos Początkujący (320 p.)

Witam posiadam wiele przycisków w apce i do każdego z osobna przypisuję SetOnClickListener'a a co za tym idzie zajmuje to wiele miejsca w kodzie. Potrzebuje to zrobić krócej, jakieś tablice? pętle? Nie mam pomysłu.. :/

To jest kod obecny:


        //BUTTONS
        btn_1x1_minus = (Button) findViewById(R.id.btn_minus_1x1);
        btn_1x1_plus = (Button) findViewById(R.id.btn_plus_1x1);
        btn_1x2_minus = (Button) findViewById(R.id.btn_minus_1x2);
        btn_1x2_plus = (Button) findViewById(R.id.btn_plus_1x2);
        btn_1x3_minus = (Button) findViewById(R.id.btn_minus_1x3);
        btn_1x3_plus = (Button) findViewById(R.id.btn_plus_1x3);

        btn_2x1_minus = (Button) findViewById(R.id.btn_minus_2x1);
        btn_2x1_plus = (Button) findViewById(R.id.btn_plus_2x1);
        btn_2x2_minus = (Button) findViewById(R.id.btn_minus_2x2);
        btn_2x2_plus = (Button) findViewById(R.id.btn_plus_2x2);
        btn_2x3_minus = (Button) findViewById(R.id.btn_minus_2x3);
        btn_2x3_plus = (Button) findViewById(R.id.btn_plus_2x3);

        btn_3x1_minus = (Button) findViewById(R.id.btn_minus_3x1);
        btn_3x1_plus = (Button) findViewById(R.id.btn_plus_3x1);
        btn_3x2_minus = (Button) findViewById(R.id.btn_minus_3x2);
        btn_3x2_plus = (Button) findViewById(R.id.btn_plus_3x2);
        btn_3x3_minus = (Button) findViewById(R.id.btn_minus_3x3);
        btn_3x3_plus = (Button) findViewById(R.id.btn_plus_3x3);

        btn_4x1_minus = (Button) findViewById(R.id.btn_minus_4x1);
        btn_4x1_plus = (Button) findViewById(R.id.btn_plus_4x1);
        btn_4x2_minus = (Button) findViewById(R.id.btn_minus_4x2);
        btn_4x2_plus = (Button) findViewById(R.id.btn_plus_4x2);
        btn_4x3_minus = (Button) findViewById(R.id.btn_minus_4x3);
        btn_4x3_plus = (Button) findViewById(R.id.btn_plus_4x3);









     private void listeners()
    {




        //BUTTONS

        btn_1x1_minus.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                if (canChange) {

                    if (products.getProduct_1x1() > 0) {
                        products.setProduct_1x1(products.getProduct_1x1() - 1);
                        textView_1x1.setText(Integer.toString(products.getProduct_1x1()));
                        Toast.makeText(getApplicationContext(), "Odjęto element z: " + textViewPos_1x1.getText(), Toast.LENGTH_SHORT).show();
                    } else {
                        Toast.makeText(getApplicationContext(), textViewPos_1x1.getText() + " nie może być mniejsze od 0! ", Toast.LENGTH_SHORT).show();
                    }


                }
                else
                {
                    Toast.makeText(getApplicationContext(), "Brak możliwości edycji", Toast.LENGTH_SHORT).show();
                }
            }
        });

        btn_1x1_plus.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (canChange) {

                    if (products.getProduct_1x1() < MAX_PRODUCTS) {
                        products.setProduct_1x1(products.getProduct_1x1() + 1);
                        textView_1x1.setText(Integer.toString(products.getProduct_1x1()));
                        Toast.makeText(getApplicationContext(), "Dodano element do: " + textViewPos_1x1.getText(), Toast.LENGTH_SHORT).show();
                    } else {
                        Toast.makeText(getApplicationContext(), textViewPos_1x1.getText() + " jest pełne! ", Toast.LENGTH_SHORT).show();
                    }


                }
                else
                {
                    Toast.makeText(getApplicationContext(), "Brak możliwości edycji", Toast.LENGTH_SHORT).show();
                }
            }
        });

        btn_1x2_minus.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                if (canChange) {
                    if (products.getProduct_1x2() > 0) {
                        products.setProduct_1x2(products.getProduct_1x2() - 1);
                        textView_1x2.setText(Integer.toString(products.getProduct_1x2()));
                        Toast.makeText(getApplicationContext(), "Odjęto element z: " + textViewPos_1x2.getText(), Toast.LENGTH_SHORT).show();
                    } else {
                        Toast.makeText(getApplicationContext(), textViewPos_1x2.getText() + " nie może być mniejsze od 0! ", Toast.LENGTH_SHORT).show();
                    }

                }
                else
                {
                    Toast.makeText(getApplicationContext(), "Brak możliwości edycji", Toast.LENGTH_SHORT).show();
                }
            }
        });

        btn_1x2_plus.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {


                if (canChange) {

                    if (products.getProduct_1x2() < MAX_PRODUCTS) {
                        products.setProduct_1x2(products.getProduct_1x2() + 1);
                        textView_1x2.setText(Integer.toString(products.getProduct_1x2()));
                        Toast.makeText(getApplicationContext(), "Dodano element do: " + textViewPos_1x2.getText(), Toast.LENGTH_SHORT).show();
                    } else {
                        Toast.makeText(getApplicationContext(), textViewPos_1x2.getText() + " jest pełne! ", Toast.LENGTH_SHORT).show();
                    }


                }     else
                {
                    Toast.makeText(getApplicationContext(), "Brak możliwości edycji", Toast.LENGTH_SHORT).show();
                }
            }
        });

        btn_1x3_minus.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                if (canChange) {


                    if (products.getProduct_1x3() > 0) {
                        products.setProduct_1x3(products.getProduct_1x3() - 1);
                        textView_1x3.setText(Integer.toString(products.getProduct_1x3()));
                        Toast.makeText(getApplicationContext(), "Odjęto element z: " + textViewPos_1x3.getText(), Toast.LENGTH_SHORT).show();
                    } else {
                        Toast.makeText(getApplicationContext(), textViewPos_1x3.getText() + " nie może być mniejsze od 0! ", Toast.LENGTH_SHORT).show();
                    }


                }
                else
                {
                    Toast.makeText(getApplicationContext(), "Brak możliwości edycji", Toast.LENGTH_SHORT).show();
                }
            }
        });

        btn_1x3_plus.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {


                if (canChange) {

                    if (products.getProduct_1x3() < MAX_PRODUCTS) {
                        products.setProduct_1x3(products.getProduct_1x3() + 1);
                        textView_1x3.setText(Integer.toString(products.getProduct_1x3()));
                        Toast.makeText(getApplicationContext(), "Dodano element do: " + textViewPos_1x3.getText(), Toast.LENGTH_SHORT).show();
                    } else {
                        Toast.makeText(getApplicationContext(), textViewPos_1x3.getText() + " jest pełne! ", Toast.LENGTH_SHORT).show();
                    }


                }
                else
                {
                    Toast.makeText(getApplicationContext(), "Brak możliwości edycji", Toast.LENGTH_SHORT).show();
                }
            }
        });




        btn_2x1_minus.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                if (canChange) {

                    if (products.getProduct_2x1() > 0) {
                        products.setProduct_2x1(products.getProduct_2x1() - 1);
                        textView_2x1.setText(Integer.toString(products.getProduct_2x1()));
                        Toast.makeText(getApplicationContext(), "Odjęto element z: " + textViewPos_2x1.getText(), Toast.LENGTH_SHORT).show();
                    } else {
                        Toast.makeText(getApplicationContext(), textViewPos_2x1.getText() + " nie może być mniejsze od 0! ", Toast.LENGTH_SHORT).show();
                    }


                }
                else
                {
                    Toast.makeText(getApplicationContext(), "Brak możliwości edycji", Toast.LENGTH_SHORT).show();
                }
            }
        });

.
.
.
.
.
.

        btn_4x3_plus.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                if (canChange) {

                    if (products.getProduct_4x3() < MAX_PRODUCTS) {
                        products.setProduct_4x3(products.getProduct_4x3() + 1);
                        textView_4x3.setText(Integer.toString(products.getProduct_4x3()));
                        Toast.makeText(getApplicationContext(), "Dodano element do: " + textViewPos_4x3.getText(), Toast.LENGTH_SHORT).show();
                    } else {
                        Toast.makeText(getApplicationContext(), textViewPos_4x3.getText() + " jest pełne! ", Toast.LENGTH_SHORT).show();
                    }

                }

                else
                {
                    Toast.makeText(getApplicationContext(), "Brak możliwości edycji", Toast.LENGTH_SHORT).show();
                }
            }

        });

    }

Na takie coś wpadłem ale wyświetla zawsze ten sam Toast(tak jakby wchodzi zawsze, niezależnie co kliknę, do jednego przycisku:

 

        //POPRAWIONE
        //[][][] = [pierwsza_wspolrzedna][druga_wspolrzedna][znak]
        Button[][][] buttons = new Button[4][3][2];

        buttons[0][0][0] = (Button) findViewById(R.id.btn_minus_1x1);
        buttons[0][0][1] = (Button) findViewById(R.id.btn_plus_1x1);
        buttons[0][1][0] = (Button) findViewById(R.id.btn_minus_1x2);
        buttons[0][1][1] = (Button) findViewById(R.id.btn_plus_1x2);
        buttons[0][2][0] = (Button) findViewById(R.id.btn_minus_1x3);
        buttons[0][2][1] = (Button) findViewById(R.id.btn_plus_1x3);

        buttons[1][0][0] = (Button) findViewById(R.id.btn_minus_2x1);
        buttons[1][0][1] = (Button) findViewById(R.id.btn_plus_2x1);
        buttons[1][1][0] = (Button) findViewById(R.id.btn_minus_2x2);
        buttons[1][1][1] = (Button) findViewById(R.id.btn_plus_2x2);
        buttons[1][2][0] = (Button) findViewById(R.id.btn_minus_2x3);
        buttons[1][2][1] = (Button) findViewById(R.id.btn_plus_2x3);

        buttons[2][0][0] = (Button) findViewById(R.id.btn_minus_3x1);
        buttons[2][0][1] = (Button) findViewById(R.id.btn_plus_3x1);
        buttons[2][1][0] = (Button) findViewById(R.id.btn_minus_3x2);
        buttons[2][1][1] = (Button) findViewById(R.id.btn_plus_3x2);
        buttons[2][2][0] = (Button) findViewById(R.id.btn_minus_3x3);
        buttons[2][2][1] = (Button) findViewById(R.id.btn_plus_3x3);

        buttons[3][0][0] = (Button) findViewById(R.id.btn_minus_4x1);
        buttons[3][0][1] = (Button) findViewById(R.id.btn_plus_4x1);
        buttons[3][1][0] = (Button) findViewById(R.id.btn_minus_4x2);
        buttons[3][1][1] = (Button) findViewById(R.id.btn_plus_4x2);
        buttons[3][2][0] = (Button) findViewById(R.id.btn_minus_4x3);
        buttons[3][2][1] = (Button) findViewById(R.id.btn_plus_4x3);



        //POPRAWA

        int i=0;
        int j=0;
        int k=0;
        for(i=0; i<4 ; i++)
        {

            for(j=0; j<3; j++)
            {

                for(k=0 ; k<2; k++)
                {

                    final int finalI = 0;
                    final int finalJ = 0;
                    final int finalK = 1;
                    buttons[i][j][k].setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View v) {
                            Toast.makeText(getApplicationContext(), "Odjęto element z macierzy: " + finalI +"x" + finalJ, Toast.LENGTH_SHORT).show();

                            if(canChange)
                            {
                                if(product[finalI][finalJ].getProduct()>0)
                                {
                                    if(finalK==0)
                                    {
                                        product[finalI][finalJ].setProduct(product[finalI][finalJ].getProduct() -1);
                                        textViews[finalI][finalJ].setText(Integer.toString(product[finalI][finalJ].getProduct()));
                                        Toast.makeText(getApplicationContext(), "Odjęto element z macierzy: " +finalI+"x" + finalJ, Toast.LENGTH_SHORT).show();
                                    }
                                    if(finalK==1)
                                    {
                                        product[finalI][finalJ].setProduct(product[finalI][finalJ].getProduct() +1);
                                        textViews[finalI][finalJ].setText(Integer.toString(product[finalI][finalJ].getProduct()));
                                        Toast.makeText(getApplicationContext(), "Odjęto element z macierzy: " +finalI+"x" + finalJ, Toast.LENGTH_SHORT).show();
                                    }
                                }
                            }

                            else
                            {
                                Toast.makeText(getApplicationContext(), "Brak możliwości edycji", Toast.LENGTH_SHORT).show();
                            }
                        }
                    });

                }


            }

        }


Nie wiem również czemu i,j oraz k każe zmienic mi na finalne.

1 odpowiedź

0 głosów
odpowiedź 8 czerwca 2018 przez Wisnia Bywalec (2,770 p.)

Cześć,

Wyświetla Ci ten sam toast bo, o ile dobrze widzę masz ten sam kod dla wszystkich przycisków:

 if(finalK==0)
                            {
                                product[finalI][finalJ].setProduct(product[finalI][finalJ].getProduct() -1);
                                textViews[finalI][finalJ].setText(Integer.toString(product[finalI][finalJ].getProduct()));
                                Toast.makeText(getApplicationContext(), "Odjęto element z macierzy: " +finalI+"x" + finalJ, Toast.LENGTH_SHORT).show();
                            }
                            if(finalK==1)
                            {
                                product[finalI][finalJ].setProduct(product[finalI][finalJ].getProduct() +1);
                                textViews[finalI][finalJ].setText(Integer.toString(product[finalI][finalJ].getProduct()));
                                Toast.makeText(getApplicationContext(), "Odjęto element z macierzy: " +finalI+"x" + finalJ, Toast.LENGTH_SHORT).show();
                            }

Jedyna różnica jaką widzę to "getProduct() +/- 1. Toast jest ten sam.

 

Natomiast jeśli chodzi o final i,j,k to tego wymaga takie tworzenie nowej klasy. Zauważ, że deklarujesz tu nową klasę

new View.OnClickListener() {

(chociaż nie podajesz jej nazwy) która dziedziczy po View.OnClickListener. Kompilator nie może jej sobie skompilować używając zmiennych z innej klasy.

Jeśli masz listenera, którego dodajesz do różnych obiektów to zrób sobie swoją klasę MyOnClickListener, która będzie dziedziczyła po View.OnClickListener. Zrób do niej konstruktor, albo jakieś metody Set i każdorazowo dla przycisku twórz taki nowy obiekt ze zmiennymi których chcesz użyć.

Potem w kodzie możesz zrobić dodawanie w pętli, chociaż dla czytelności kodu, jeśli przycisków nie ma nie wiadomo ile, ja bym to chyba zrobił linia po linii (chociaż można oczywiście w pętli jak ktoś lubi):

final static int MINUS = -1;
final static int PLUS = 1;     // tu mogą być też jakieś enumy oczywiście

buttons[0][0][0] = (Button) findViewById(R.id.btn_minus_1x1);
buttons[0][0][1] = (Button) findViewById(R.id.btn_plus_1x1);
buttons[0][1][0] = (Button) findViewById(R.id.btn_minus_1x2);
buttons[0][1][1] = (Button) findViewById(R.id.btn_plus_1x2);
buttons[0][2][0] = (Button) findViewById(R.id.btn_minus_1x3);
buttons[0][2][1] = (Button) findViewById(R.id.btn_plus_1x3);

addMyListener(buttons[0][0][0],MINUS);
addMyListener(buttons[0][0][1],PLUS);
addMyListener(buttons[0][1][0],MINUS);
addMyListener(buttons[0][1][1],PLUS);
addMyListener(buttons[0][2][0],MINUS);
addMyListener(buttons[0][2][1],PLUS);

no i oczywiście metoda addMyListener(Button,int) która będzie konstruowała obiekt Twojej nowej klasy i dodawała go do przycisku.

komentarz 13 czerwca 2018 przez neos Początkujący (320 p.)
Możesz rozjaśnić o co Ci chodzi z: " no i oczywiście metoda addMyListener(Button,int) która będzie konstruowała obiekt Twojej nowej klasy i dodawała go do przycisku. " bo nie za bardzo rozumiem.
komentarz 18 czerwca 2018 przez Wisnia Bywalec (2,770 p.)

Teraz masz:

btn_4x3_plus.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
 
                if (canChange) {
 
                    if (products.getProduct_4x3() < MAX_PRODUCTS) {
                        products.setProduct_4x3(products.getProduct_4x3() + 1);
                        textView_4x3.setText(Integer.toString(products.getProduct_4x3()));
                        Toast.makeText(getApplicationContext(), "Dodano element do: " + textViewPos_4x3.getText(), Toast.LENGTH_SHORT).show();
                    } else {
                        Toast.makeText(getApplicationContext(), textViewPos_4x3.getText() + " jest pełne! ", Toast.LENGTH_SHORT).show();
                    }
 
                }
 
                else
                {
                    Toast.makeText(getApplicationContext(), "Brak możliwości edycji", Toast.LENGTH_SHORT).show();
                }
            }
 
        });
 
    }

I wywołujesz to dla każdego przycisku z osobna. Tu jest dużo kodu, który się powtarza. Zrób metodę którą będzie można wykorzystać w taki sposób:

addMyListener(buttons[0][0][0],MINUS);

w której będziesz dodawał do zadanego w argumencie funkcji przycisku nowy obiekt klasy MyOnClickListener  z parametrem MINUS/PLUS. Chodzi o to, że jeśli masz bardzo podobne fragmenty kodu, to zamiast robić ctr+c ctr+v wiele razy w kodzie, to zrobić metodę i ją sparametryzować. W Twoim przypadku parametryzacja jest potrzebna, żeby obsłużyć przycisk minus lub plus.

Podobne pytania

0 głosów
1 odpowiedź 398 wizyt
pytanie zadane 23 czerwca 2019 w Java przez Virius Początkujący (490 p.)
0 głosów
1 odpowiedź 418 wizyt
pytanie zadane 14 lipca 2017 w Java przez Kubs Mądrala (5,190 p.)
0 głosów
2 odpowiedzi 795 wizyt
pytanie zadane 16 listopada 2015 w Java przez Boshi VIP (100,240 p.)

92,555 zapytań

141,403 odpowiedzi

319,559 komentarzy

61,940 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...