Java onTouch方法-跟踪已单击或按下按钮的实例

Java onTouch方法-跟踪已单击或按下按钮的实例,java,android,touch-event,ontouchlistener,android-button,Java,Android,Touch Event,Ontouchlistener,Android Button,我有一个循环,其中创建了多个按钮实例,每个实例都有一个TouchListener。然而,我很难弄清楚当不同的按钮被按下时如何管理。我试图实现的是,每个按钮都代表一个textview,当我点击按钮时,我想将与该按钮实例关联的特定textview添加到arraylist中。但是,当再次触摸同一个按钮时,我想将其从列表中删除。如果再次触摸,则将其重新添加。哦,是的,addToOrder当前是全局的,并且初始化为true 想法 编辑****每我的评论下面的按钮现在是一个实例的子类的按钮,我写的,这样我就

我有一个循环,其中创建了多个按钮实例,每个实例都有一个TouchListener。然而,我很难弄清楚当不同的按钮被按下时如何管理。我试图实现的是,每个按钮都代表一个textview,当我点击按钮时,我想将与该按钮实例关联的特定textview添加到arraylist中。但是,当再次触摸同一个按钮时,我想将其从列表中删除。如果再次触摸,则将其重新添加。哦,是的,addToOrder当前是全局的,并且初始化为true

想法

编辑****每我的评论下面的按钮现在是一个实例的子类的按钮,我写的,这样我就可以很容易地跟上每个实例的按钮。这就解决了问题

代码如下:

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

如果这是从dbAccess添加/删除项的唯一方法,则可以根据是否已存在项进行切换

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

编辑:假设dbAccess有一个contains(),则无法判断它是什么类型

您可以使用
setTag
在任何
视图
(按钮是其子类)上设置任意对象,该视图有两个版本

因此,例如,在用于创建每个
按钮的循环中,您可以使用
myButton.setTag(对象o)
按钮添加
字符串
实例或
整数
实例

当触摸按钮时,它会作为
View v
参数传递到
onTouch


只需使用
getTag()
v
中拉出标签并检查它。

首先,我会使用开关或切换按钮,而不是普通按钮。这样按钮就可以跟踪您感兴趣的两种状态。切换开关时,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));

根据我下面的评论,button现在是我编写的button子类的一个实例,这样我就可以轻松地了解button的每个实例。这就解决了问题

我刚刚意识到addToOrder——因为是全局的,所以无法判断某个按钮的某个实例是否被触摸过。我需要的是每个按钮实例都有一个addToOrder变量——但是我会得到那个可怕的最终/非最终变量错误……dbAccess实际上是我编写的一个类,它是我的活动和模型(数据库)之间的中介。尽可能地与MVC合作。我实际上解决了这个问题。我创建了一个自定义button类,该类使用一个私有布尔变量扩展button类,并创建了两个函数,它们接受一个布尔值并返回一个布尔值,即setTouchInfo(boolean clicky)和getTouchInfo(),返回按钮的状态(无论是否已单击)。我将注释掉旧代码并发布新代码。是的,这就是我刚才解决的想法——我没有设置标签,只是在子类中使用了一个私有变量来跟踪按钮的状态。请参见问题末尾的新代码和编辑注释