禁用在一个上下文中工作但不在另一个上下文中工作的touchlistener

时间:2012-03-07 16:46:50

标签: android

我有一个具有此layout的应用程序。现在当用户触摸某个按钮并从该按钮释放他的手指时,该键被输入文本框。意思是它同时向用户发出那封信。说" B进入"。所以它是在ACTION_UP期间。在此事件处理期间,我需要防止触摸事件,即使用户触摸它们也是偶然的。

我在触摸事件期间(处于启动状态)禁用触摸屏,但它没有发生。触摸事件正在排队,我没有得到如何在处理当前触摸事件时禁用触摸事件。但是我能够在硬键事件处理期间完成它。我无法理解这种奇怪的行为。

这是我的代码

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

// TODO自动生成的方法存根         String 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;
}

1 个答案:

答案 0 :(得分:0)

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

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