【问题标题】:Disabling touchlistener working in one context but not in another context禁用在一个上下文中工作但不在另一个上下文中工作的 touchlistener
【发布时间】:2012-03-07 16:46:50
【问题描述】:

我有一个具有此layout 的应用程序。现在,当用户触摸某个按钮并从该按钮上松开手指时,该键将输入到文本框中。意思是同时它也会向用户发音该字母。说“B被输入”。所以它是在 ACTION_UP 期间。在此事件处理期间,即使用户意外触摸它们,我也需要防止触摸事件。

我在触摸事件期间禁用触摸侦听器(处于 UP 状态),但它没有发生。触摸事件正在排队,我不知道如何在处理当前事件时禁用触摸事件。但我可以在硬键事件处理期间完成它。我无法理解这种奇怪的行为。

这是我的代码

public boolean onTouch(View v, MotionEvent 事件) {

// TODO 自动生成的方法存根 字符串 s = null;

    s = ((Button) v).getText().toString().trim();

    switch (event.getAction() & MotionEvent.ACTION_MASK) {


    case MotionEvent.ACTION_DOWN:

        b_prev=(Button)v;
        //while(tts.isSpeaking());
        tts.speak(s, TextToSpeech.QUEUE_FLUSH, null);

        break;
    case MotionEvent.ACTION_UP:

        fun(false);  //disabling the touch event for all buttons


        for(int i=0;i<mybtn.length;i++)
        {
            if(isPointInsideView(event.getRawX(),event.getRawY(),mybtn[i]))
            {
                s = (mybtn[i]).getText().toString().trim();
                btn=mybtn[i];
                break;
              //et.setText("up android" + s, TextView.BufferType.EDITABLE);
            }
        }

        if(btn.equals(mybtn[27])) //clear button pressed
        {
            //do something
        }

        else if(btn.equals(mybtn[26])) //space button
        {
            //do soemthing

        }

        else
        {
          //do soemthing
        }


        fun(true); //enabling touch event for all buttons


        break;
    case MotionEvent.ACTION_MOVE:

        for(int i=0;i<mybtn.length;i++)
        {
            if(isPointInsideView(event.getRawX(),event.getRawY(),mybtn[i]))
            {
                s = (mybtn[i]).getText().toString().trim();
                btn=mybtn[i];
                break;
              //et.setText("down android" + s, TextView.BufferType.EDITABLE);

            }
        }


        break; 


    }


    return true;
}

void fun(boolean flag)
{
    int i;

    for(i=0;i<mybtn.length;i++)
    {
        if(flag==true)
        mybtn[i].setOnTouchListener(this);
        else
            mybtn[i].setOnTouchListener(null);  
        mybtn[i].setEnabled(flag);
    }

}

即使我使用 fun() 禁用触摸事件,它们也会在当前触摸事件完成后排队并执行。所以请告诉我我需要做什么来解决这个问题。

我观察到我在确认事件中使用了两个硬键。在硬键事件期间,布局按钮的禁用/启用工作正常。但在上述情况下它的工作方式不同。它可能有什么问题?我也附上了该代码。看看它。为什么会发生这种情况我不明白。

public boolean onKeyUp(int keyCode, KeyEvent event) {

    if (keyCode == KeyEvent.KEYCODE_SEARCH
            && event.getRepeatCount() == 0)
    {
        String s = et.getText().toString().trim();

        fun(false); //disable touch events

        if(pass==1 && quit==1)
        {
            name= et.getText().toString().trim();
            number=get_Number(name);

            if(number!=null)
            {
                pass++; // go for confirmation
                in = new Intent(ContactActivity.this, Calling.class);
                tts.speak("contact found", TextToSpeech.QUEUE_FLUSH, null);
                while(tts.isSpeaking());
                tts.speak("Do u want to continue", TextToSpeech.QUEUE_FLUSH, null);
                while(tts.isSpeaking());

            }

            else
            { 
                tts.speak( name +"does not exist", TextToSpeech.QUEUE_FLUSH, null);
                while(tts.isSpeaking());
                tts.speak("try again", TextToSpeech.QUEUE_FLUSH, null);
                while(tts.isSpeaking());

                fun(true); //enable touch events

            }


        }

        else if(pass==2)
        {

            b.putString("number", number);
            in.putExtras(b);
            tts.speak( "calling"+name, TextToSpeech.QUEUE_FLUSH, null);
            while(tts.isSpeaking());
            tts.shutdown();
            startActivity(in);
            //int pid = android.os.Process.myPid();
            //android.os.Process.killProcess(pid);
            finish();

            //Intent 

        }

        else if (quit==2) {

            while(tts.isSpeaking());
            tts.speak("Quitting application",TextToSpeech.QUEUE_FLUSH, null);

           while(tts.isSpeaking());
            tts.shutdown();
            finish();

            }


    }//end of if


    else if (keyCode == KeyEvent.KEYCODE_MENU
            && event.getRepeatCount() == 0)
    {

        fun(false);//disable touch events

        if(pass==2)
        {

            pass=1;
            //while(tts.isSpeaking());
            tts.speak("Going back",TextToSpeech.QUEUE_FLUSH, null);
            while(tts.isSpeaking());
            fun(true);
            //mhandler.postDelayed(mUpdateTimeTask, 1000);

        }

        else if(quit==2)
        {
            quit=1;
            //while(tts.isSpeaking());
            tts.speak("Going back",TextToSpeech.QUEUE_FLUSH, null);
            while(tts.isSpeaking());

            fun(true);//enable touch events

        }

        else if(quit==1)
        {
            quit++;
            //mhandler.removeCallbacks(mUpdateTimeTask);
            //while(tts.isSpeaking());
            tts.speak("Do u want to quit",TextToSpeech.QUEUE_FLUSH, null);
            while(tts.isSpeaking());
            //Toast.makeText(TimerActivity.this,"Do u want to quit",Toast.LENGTH_LONG).show();


        }


    }
    return true;
}

【问题讨论】:

  • 有人请帮帮我,我用谷歌搜索了很多并尝试了不同的方式。但我仍然无法清楚地知道如何解决这个问题......
  • 请大家帮我解决这个问题。我已经尝试了很多仍然没有用,我不知道哪里出了问题..

标签: android


【解决方案1】:

尝试这里提到的解决方法Android button enabling/disabling not working

onClick(View v)
{
     if(condition)
     {
           return;
     }
     else
     {
       //perform onClick stuff
     }
}

【讨论】:

  • 不,这根本不是我的问题的解决方案。我正在处理触摸事件,并且它有很多状态,如 DOWN、MOVE 和 UP。 fun() 函数实际上应该完成这项工作。但它没有做,我不知道该做什么以及如何解决它
  • 顺便说一句,禁用按钮只是为了处理输入不是一个好习惯,我建议不要禁用任何请求并将它们排队并在单独的线程中逐个处理它们
  • 我没有得到你。我想阻止触摸事件,直到 UP 事件未完成。完成后,我想重新启用触摸事件
  • 为什么要在 UP 事件处理完成之前阻止它?与此同时,也许用户按下了别的东西?最佳做法是不阻止任何内容,而是将其排队等待处理!
  • 请看我编辑的帖子,我正在为盲人开发一个应用程序。因此,当在 UP 事件期间进行输入处理时,它应该向用户发音,说“输入了 C”。同时,如果用户触摸另一个键,它也应该使用 TTS 向用户发音,但这会导致冲突,所以我想禁用触摸以防止这种冲突。明白我的意思了吗??
猜你喜欢
  • 2014-09-20
  • 2016-07-26
  • 2012-01-07
  • 2023-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-05
  • 1970-01-01
相关资源
最近更新 更多