Переопределение onClick для Android (просмотр v) - есть ли хорошее решение для использования для всех кнопок в приложении
-
10-12-2019 - |
Вопрос
Как вы знаете, мы можем переопределить несколько методов для каждого созданного нами типа представления.Я не делаю никакого кода 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));
}