Переопределение onClick для Android (просмотр v) - есть ли хорошее решение для использования для всех кнопок в приложении

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

Вопрос

Как вы знаете, мы можем переопределить несколько методов для каждого созданного нами типа представления.Я не делаю никакого кода xml-макета, потому что многие вещи меняют форму во время выполнения, и есть вещи, которые создаются динамически, поэтому программное решение - лучший путь для меня здесь.

Итак, чтобы перейти к сути моей проблемы, предположим, что у меня есть 50 кнопок в моем приложении для Android.Потенциально эти кнопки могут находиться в одном действии, но, более чем вероятно, могут быть расположены на нескольких экранах (активностях).

Я создал класс button с именем CUSTOMB, который переопределяет метод onClick (Просмотр вида).Что, если некоторые из кнопок должны выполнять какое-то действие (допустим, они являются частью linearlayout), а некоторые являются частью чего-то вроде относительного макета, и в каждом относительном макете вы хотите получить информацию об относительном макете, в котором находится эта кнопка (возможно, вы хотите получить информацию обо всех текстовых представлениях в одном и том же относительном макете и т.д. и т.п.).

Одно из решений, конечно, заключается в том, что вы могли бы получить идентификатор каждой кнопки и выполнить переключение (case) или что-то в этом роде, и в зависимости от того, какой идентификатор возвращаемой кнопки вы можете что-то сделать.Проблема в том, что у меня есть 50 кнопок.Что, если бы у меня было 200?Должен ли я действительно выполнить 200 проверок обращения в моем операторе switch, чтобы выяснить, какие действия мне нужно предпринять?

Итак, я пытаюсь выяснить, какая информация мне доступна, о которой я не знаю, и которую я мог бы использовать при переопределении 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");


    }

}

итак, вот пример.Я передал представление, представляющее кнопку, на которую был нажат, и я могу изменять текст кнопки, когда нажимаю на нее снова и снова.Но что, если Кнопка была частью относительного макета?Могу ли я получить какую-либо другую информацию о других представлениях, которые также являются частью того же относительного макета?Что, если бы я хотел изменять цвет фона некоторых кнопок при каждом нажатии на них вместо изменения текста?Если у меня есть X количество кнопок, я стараюсь держаться подальше от создания X количества идентификаторов - как я уже указывал, у вас потенциально могут быть сотни из них.

Было интересно, могут ли у кого-нибудь быть какие-либо идеи о том, какой маршрут здесь был бы лучшим, чем наличие потенциально неограниченного количества проверок обращения внутри оператора switch.Если бы я мог выяснить, из какого представления взята кнопка (в моем случае кнопка была частью внешнего представления), тогда я мог бы переключать свои представления вместо просто своих кнопок - и сделать мое заявление switch намного менее громоздким и более простым в обслуживании.Спасибо.

Это было полезно?

Решение

Я не уверен, что ваша конечная цель.Но с вашего представления (кнопка) вы можете получить его родитель (например, RelativeLayout).Затем, как только вы получите свою группу View, вы можете получить своих детей и делать все, что вам нужно.

Например:

@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)
        ...
    }
}
.

Если вам не нужно знать, если это на самом деле реляционное или линеарLayout, или что просто используйте окна просмотра.

Надеюсь, это поможет.

Другие советы

Если я вас правильно понимаю, у вас могло бы просто быть несколько разных расширений Customb Button:сказать RelativeLayoutButton и LinearLayoutButton, и пусть они реализуют OnClickListener.Переопределение onClick() в рамках расширенного класса и обрабатывать реализацию для каждого типа кнопки.

При необходимости вы можете получить доступ ко всей иерархии представлений.Скажем, что-то вроде этого:

//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));
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top