Android überschreibt onClick (View v) – gibt es eine gute Lösung für alle Schaltflächen in einer Anwendung?

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

Frage

Wie Sie wissen, können wir für jeden von uns erstellten Ansichtstyp einige Methoden überschreiben.Ich verwende keinen XML-Layoutcode, da sich zur Laufzeit viele Dinge ändern und einige Dinge dynamisch erstellt werden, sodass die programmgesteuerte Lösung hier für mich die beste Lösung ist.

Um zum Kern meines Problems zu gelangen, nehmen wir an, dass ich 50 Schaltflächen in meiner Android-App habe.Diese Schaltflächen könnten sich möglicherweise in einer Aktivität befinden, könnten sich aber höchstwahrscheinlich über mehrere Bildschirme (Aktivitäten) erstrecken.

Ich habe eine Schaltflächenklasse namens CustomButton erstellt, die die Methode onClick(View view) überschreibt.Was wäre, wenn einige der Schaltflächen eine Aktion ausführen sollen (sagen wir, sie sind Teil eines linearen Layouts) und andere Teil eines relativen Layouts sind und Sie in jedem relativen Layout Informationen über das relative Layout dieser Schaltfläche erhalten möchten befindet sich in (vielleicht wissen Sie, wo Sie Informationen über alle Textansichten im gleichen relativen Layout erhalten usw. usw.).

Eine Lösung besteht natürlich darin, dass Sie die ID jeder Schaltfläche abrufen und einen Wechsel (Fall) oder ähnliches ausführen könnten. Abhängig von der ID der zurückgegebenen Schaltfläche können Sie etwas tun.Das Problem ist, dass ich 50 Tasten habe.Was wäre, wenn ich 200 hätte?Sollte ich in meiner Switch-Anweisung wirklich 200 Fallprüfungen durchführen müssen, um herauszufinden, welche Maßnahmen ich ergreifen muss?

Ich versuche also herauszufinden, welche Informationen mir zur Verfügung stehen, von denen ich nicht weiß, dass ich sie verwenden könnte, wenn ich onClick überschreibe.

   @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");


    }

}

also hier ist ein Beispiel.Ich habe die Ansicht übergeben, die die Schaltfläche darstellt, auf die geklickt wurde, und ich kann den Text der Schaltfläche ändern, wenn ich immer wieder darauf klicke.Aber was wäre, wenn der Button Teil eines relativen Layouts wäre?Kann ich weitere Informationen zu anderen Ansichten erhalten, die ebenfalls Teil desselben relativen Layouts sind?Was wäre, wenn ich bei einigen Schaltflächen die Hintergrundfarbe jedes Mal ändern möchte, wenn ich darauf klicke, anstatt den Text zu ändern?Wenn ich eine Anzahl von X Schaltflächen habe, versuche ich, die Erstellung von X IDs zu vermeiden – wie ich bereits erwähnt habe, könnten Sie möglicherweise Hunderte davon haben.

Ich habe mich gefragt, ob jemand eine Idee hat, was hier ein besserer Weg wäre, als eine potenziell unbegrenzte Anzahl von Fallprüfungen in einer Switch-Anweisung zu haben.Wenn ich herausfinden könnte, aus welcher Ansicht die Schaltfläche stammt (in meinem Fall war die Schaltfläche Teil einer äußeren Ansicht), könnte ich meine Ansichten anstelle nur meiner Schaltflächen umschalten – und meine Switch-Anweisung viel weniger umständlich und einfacher machen pflegen.Danke.

War es hilfreich?

Lösung

Ich bin nicht sicher, was dein Endziel ist.Aus Ihrer Sicht (Button) können Sie den Elternteil (z. B. ein Relativivelayout) erhalten.Sobald Sie Ihre Ansichtsgruppe haben, können Sie seine Kinder bekommen und tun, was Sie brauchen.

Beispiel: generasacodicetagpre.

Wenn Sie nicht wissen müssen, ob es tatsächlich ein Relativelayout oder Linearlayout ist, oder was auch immer die ViewGroup verwenden.

hoffe es hilft.

Andere Tipps

Wenn ich Sie richtig verstehe, könnten Sie einfach ein paar verschiedene CustomButton-Erweiterungen haben:sagen RelativeLayoutButton Und LinearLayoutButton, und lassen Sie sie OnClickListener implementieren.Überschreiben onClick() innerhalb der erweiterten Klasse und handhaben die Implementierung pro Button-Typ.

Bei Bedarf können Sie auf die gesamte Ansichtshierarchie zugreifen.Sagen Sie etwa Folgendes:

//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));
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top