Android Overriding onClick (View V) - C'è una buona soluzione da utilizzare per tutti i pulsanti in un'applicazione

StackOverflow https://stackoverflow.com//questions/9640308

Domanda

Come sai che possiamo sovrascrivere alcuni metodi per ogni tipo di vista che abbiamo creato. Non sto facendo alcun codice di layout XML perché un sacco di cose cambiano forma in runtime e ci sono cose che vengono create dinamicamente in modo che la soluzione programmatica sia il percorso migliore per me qui.

Pertanto arrivare al GIST del mio problema, dico di dire che ho 50 pulsanti nella mia app Android. Questi pulsanti potrebbero potenzialmente essere su un'attività, ma più che probabilmente potrebbe spazzare su più schermi (Attività).

Ho creato una classe pulsante chiamata CustomButton che sovrascrive il metodo OnClick (View View). Cosa succede se alcuni dei pulsanti dovrebbero fare qualche azione (diciamo che fanno parte di un linearlayout) e alcuni fanno parte di qualcosa come un layout relativo e in ogni layout relativo si desidera ottenere informazioni sul layout relativo che questo pulsante Residisce (forse tu cosa ottenere informazioni su tutte le parole di testo nello stesso layout relativo, ecc. ecc.).

Una soluzione ovviamente è che è possibile ottenere l'ID di ciascun pulsante e fare un interruttore (caso) o qualcosa e a seconda di ciò che l'ID del pulsante restituito puoi fare qualcosa. Il problema è che ho 50 pulsanti. Cosa succede se avessi 200? Dovrei davvero fare 200 controlli di caso nella mia istruzione Switch per capire quale azione devo prendere?

Quindi sto cercando di capire quali informazioni sono disponibili per me che non sono a conoscenza di ciò che potessi usare quando sostituisco l'onclick.

   @Override
   public void onClick(View v) {
    // TODO Auto-generated method stub
    if(!getClickInfo()){
        ((CustomButton)v).setText("I clicked the button");
        setClickInfo(true);
    }
    else{
        isClicked = false;
        ((CustomButton)v).setText("This is the button that i want to click");


    }

}
.

Quindi ecco un esempio. Sono passato nella vista che rappresenta il pulsante che è stato cliccato e posso cambiare il testo del pulsante mentre faccio clic su di esso più e più volte. Ma cosa succede se il pulsante faceva parte di un layout relativo? Posso ottenere altre informazioni su altre opinioni che fanno parte anche della stessa layout relativa? Cosa succede se alcuni pulsanti volessi cambiare il colore di sfondo di ogni volta che l'ho cliccato invece di cambiare il testo? Se ho x numero di pulsanti sto cercando di stare lontano dalla creazione di X Numero di IDS - Come ho sottolineato che potresti potenzialmente avere centinaia di loro.

Mi stava chiedendo se qualcuno potesse avere idee su quale sarebbe un percorso migliore qui che avere un potenzialmente illimitato del caso controlli all'interno di un'istruzione Switch. Se potessi scoprire quale veda il pulsante è venuto da (nel mio caso il pulsante era parte di una vista esterna), potrei fare un interruttore sulle mie opinioni invece dei miei pulsanti - e rendendo la mia dichiarazione di interruttore molto meno ingombrante e più facile da mantenere. Grazie.

È stato utile?

Soluzione

Non sono sicuro di ciò che è il tuo obiettivo finale.Ma dal tuo punto di vista (pulsante) puoi ottenere il suo genitore (ad esempio un relativivellout).Quindi, una volta che hai il tuo gruppo di visualizzazione puoi ottenere i suoi figli e fai tutto il necessario.

Ad esempio:

@Override
public void onClick(View v) {
    ViewParent parent = v.getParent();
    if (parent instanceof RelativeLayout) {
        // your button is inside a RelativeLayout
        RelativeLayout rl = (RelativeLayout) parent;
        int numChildren = rl.getChildCount();
        // loop through children if you need to (use rl.getChildAt(index) to get each child)
        ...
    }
}
.

Se non è necessario sapere se è in realtà un relativiveyout o linearlayout, o qualunque sia la semplice utilizione del gruppo di vista.

Spero che aiuti.

Altri suggerimenti

Se ti capisco correttamente, potresti semplicemente avere alcune estensioni di custom personalizzate: dire RelativeLayoutButton e LinearLayoutButton e farli implementare onClickListener.Override onClick() all'interno della classe estesa e gestire il tipo di implementazione per pulsante.

È possibile accedere all'intera gerarchia di vista se necessario.Dì, qualcosa del genere:

//assuming a reference to Button button

//get a reference to the parent
View v = button.getParent();
ViewGroup parent;
ArrayList<View> siblings = new ArrayList<>();

if(v instanceof ViewGroup) parent = (ViewGroup) v;
for(int i = 0; i < parent.getChildCount(); i++) {
    siblings.add(parent.getChildAt(i));
}
.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top