Метод onTouch - отслеживание того, какие экземпляры кнопки были нажаты или нажаты - PullRequest
0 голосов
/ 16 марта 2012

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

Мысли?

РЕДАКТИРОВАТЬ **** согласно моим комментариям ниже, кнопка теперь является экземпляром подкласса 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;
        }
    });

Ответы [ 4 ]

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

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

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

. При касании кнопки она передается в onTouch какView v аргумент.

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

0 голосов
/ 17 марта 2012

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

0 голосов
/ 16 марта 2012

Прежде всего, я бы использовал Switch или 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 голосов
/ 16 марта 2012

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

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

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

...