Android переопределяет onClick (View v) - есть ли хорошее решение для использования всех кнопок в приложении - PullRequest
0 голосов
/ 10 марта 2012

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

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

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

Одним из решений, конечно, является то, что вы можете получить идентификатор каждой кнопки и выполнить переключение (случай) или что-то еще, и в зависимости от того, какой идентификатор возвращаемой кнопки вы можете сделать. Проблема в том, что у меня 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. Если бы я мог выяснить, из какого вида пришла кнопка (в моем случае кнопка была частью внешнего вида), то я мог бы сделать переключение на своих представлениях, а не только на моих кнопках - и сделать свое заявление о переключении намного менее громоздким и более простым поддерживать. Благодарю.

Ответы [ 2 ]

2 голосов
/ 10 марта 2012

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

Например:

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

Если вам не нужно знать, действительно ли это RelativeLayoutили LinearLayout, или что-либо еще просто использовать ViewGroup.

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

1 голос
/ 10 марта 2012

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

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

//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));
}
...