【问题标题】:onTouch method - Keeping up with which instances of the button have been clicked or pressedonTouch 方法 - 跟踪已单击或按下按钮的哪些实例
【发布时间】:2012-03-16 19:23:57
【问题描述】:

我有一个循环,我在其中创建了多个按钮实例,并且每个实例都有一个 TouchListener。但是,我无法弄清楚如何在触摸不同按钮时进行管理。我想要完成的是每个按钮都代表一个文本视图,当我触摸按钮时,我想将与该按钮实例关联的特定文本视图添加到数组列表中。但是,当再次触摸相同的按钮时,我想将其从列表中删除..如果再次触摸,则将其重新添加。哦,是的 addToOrder 目前是全局的并初始化为 true。

想法?

EDIT**** per my cmets below button 现在是我编写的 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;
        }
    });

【问题讨论】:

  • 我刚刚意识到 addToOrder - 因为是全局的,所以无法判断按钮的某个实例是否已被触摸。我需要的是每个按钮实例的 addToOrder 变量 - 但是我会得到那个可怕的最终/非最终变量错误......

标签: java android touch-event ontouchlistener android-button


【解决方案1】:

您可以使用setTag 在任何View(Button 是其子类)上设置任意对象,其中有两个版本。

因此,例如,在用于创建每个 Button 的循环中,您可以使用 myButton.setTag(Object o)String 实例或 Integer 实例添加到 Button

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

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

【讨论】:

  • 是的,这就是我刚刚解决的想法 - 我没有设置标签,我只是在子类中使用了一个私有变量来跟上按钮所处的状态。查看新代码并在问题结束
【解决方案2】:

如果这是从 dbAccess 添加/删除项目的唯一方式,您可以根据它是否已经存在进行切换。

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

编辑:假设 dbAccess 有一个 contains(),在这里不知道它是什么类型。

【讨论】:

  • dbAccess 实际上是我编写的一个类,它是我的活动和我的模型(数据库)之间的中介。尝试尽可能多地使用 MVC。我实际上解决了这个问题。我创建了一个自定义按钮类,该类使用私有布尔变量扩展按钮类,并创建了 2 个接受布尔值并返回布尔值的函数,即 setTouchInfo(boolean clicky) 和 getTouchInfo(),它们返回按钮的状态(是否有是否被点击)。我将注释掉旧代码并发布新代码。之前应该考虑过这个。
【解决方案3】:

首先,我会使用 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));

【讨论】:

    【解决方案4】:

    每个按钮下面的 cmets 现在是我编写的按钮子类的一个实例,以便我可以轻松地跟上按钮的每个实例。这解决了这个问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-10-30
      • 1970-01-01
      • 1970-01-01
      • 2012-08-08
      • 1970-01-01
      • 2014-10-05
      • 2013-06-29
      相关资源
      最近更新 更多