2012-03-16 2 views
0

У меня есть цикл, где я создал несколько экземпляров кнопок, и каждый экземпляр у них есть TouchListener. Тем не менее, мне трудно понять, как управлять, когда были затронуты различные кнопки. То, что я пытаюсь выполнить, состоит в том, что каждая кнопка представляет собой текстовое представление, и когда я касаюсь кнопки, я хочу добавить к тексту конкретное текстовое представление, связанное с этим экземпляром кнопки, для arraylist. Однако, когда одна и та же кнопка снова коснется, я хочу удалить ее из списка ... и снова добавить ее, если она снова коснется. О да, addToOrder в настоящее время является глобальным и инициализируется значением true.Метод onTouch - Поддержание того, какие кнопки кнопки были нажаты или нажаты.

Мысли?

EDIT **** за мои комментарии ниже кнопка теперь является экземпляром подкласса Button, который я написал, чтобы я мог легко следить за каждым экземпляром кнопки. Это решило проблему.

вот код:

button.setOnTouchListener(new View.OnTouchListener() { 

     @Override 
     public boolean onTouch(View v, MotionEvent event) { 
     int action = event.getActionMasked(); 
     //Log.d("Touched Add To Order Button with id of ", button.getId() + ": " + button.getText().toString()); 
     TextView relativeTitleView; 
     ViewGroup relativeGroup = (ViewGroup)v.getParent(); 
     relativeTitleView = (TextView) relativeGroup.getChildAt(0); 
     //Log.d("Add To Order Button Touched", relativeTitleView.getText().toString()); 

      /*if(action ==MotionEvent.ACTION_DOWN){       
      addToOrder = (addToOrder) ? true : false; 
      if(addToOrder) 
       dbAccess.addToOrder(relativeTitleView.getText().toString()); 
      else 
       dbAccess.removeFromOrder(relativeTitleView.getText().toString()); 
      } 
      else if(action == MotionEvent.ACTION_UP){ 
       addToOrder = !addToOrder; 

      }*/ 

      if(action == MotionEvent.ACTION_DOWN){ 
       if(button.getTouchInfo()){ 
       dbAccess.addToOrder(relativeTitleView.getText().toString()); 
       button.setTouchInfo(false); 
       } 
       else { 
       dbAccess.removeFromOrder(relativeTitleView.getText().toString()); 
       button.setTouchInfo(true); 
       } 
     } 

      return false; 
     } 
    }); 
+0

Я только что понял, что addToOrder - так как глобальный собирается сделать невозможным определить, был ли затронут какой-то конкретный случай кнопки или нет. мне нужна переменная addToOrder для экземпляра кнопки EACH - однако я собираюсь получить эту ужасную конечную/не конечную переменную ошибку ... – cspam

ответ

0

Если это единственный способ добавляются элементы/удалить из DBAccess, вы можете просто переключаться в зависимости от того это или нет уже там.

if(dbAccess.contains(relativeTitleView.getText().toString()) 
    dbAccess.removeFromOrder(relativeTitleView.getText().toString()); 
else 
    dbAccess.addToOrder(relativeTitleView.getText().toString()); 

Редактировать: Предполагая, что dbAccess имеет contains(), не может определить, какой тип он здесь.

+0

dbAccess - фактически класс, который я написал, чтобы быть посредником между моими действиями и моей моделью (базой данных). пытаясь пойти с MVC как можно больше. Я действительно исправил проблему. Я создал собственный класс кнопок, который расширяет класс кнопки с помощью частной логической переменной и создал 2 функции, которые берут логическое значение и возвращают логическое значение, а именно setTouchInfo (boolean clicky) и getTouchInfo(), который возвращает статус кнопки (независимо от того, имеет ли она был нажат или нет). Я буду комментировать старый код и опубликовать новый код. Должен был подумать об этом раньше. – cspam

1

Вы можете установить произвольный объект на любой View (из которого Button является подклассом) с использованием setTag, из которых две версии.

Так, например, в цикле используется для создания каждого Button можно добавить String экземпляр или Integer экземпляр в Button с помощью myButton.setTag(Object o)

Когда кнопка нажата, она будет передана, чтобы onTouch, что и View v аргумент.

Просто потяните бирку от v, используя getTag() и изучите ее.

+0

yep, это была идея, поскольку я только что решил - я не установил теги, я просто использовал закрытую переменную в подклассе, чтобы не отставать от того, в каком состоянии была кнопка. См. Новый код и отредактируйте комментарий в конце вопроса – cspam

0

Прежде всего, я бы использовал переключатель или ToggleButton, а не обычную кнопку. Таким образом, кнопка отслеживает два состояния, которые вас интересуют. Слушатель setOnCheckedChanged получит обратный вызов при переключении коммутатора.

Во-вторых, я бы создал именованный класс, полученный из OnCheckedChangeListener, вместо использования анонимного класса.

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

Чтобы сделать это более конкретное:

private MyListener implements CheckedChangeListener{ 
    private TextView textView; 
    MyListener(TextView textView){ 
    this.textView = textView; 
    } 
    @Override 
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked){ 
    String text = textView.getText().toString(); 
    if(isChecked){ 
     dbAccess.addToOrder(text); 
    }else{ 
     dbAccess.removeFromOrder(text); 
    } 
    } 
// then later.... 
button.setOnCheckedChangeListener(new MyListener(theCorrespondingTextView)); 
0

за мои комментарии кнопку ниже теперь является экземпляром подкласса Button, который я написал, так что я могу легко идти в ногу с каждым экземпляром кнопки. Это решило проблему.

Смежные вопросы