2013-04-06 50 views
1

我试图在另一个线程运行时不能点击ImageView。然后当线程完成时,再次返回ImageView可点击。ImageView无法在辅助线程运行时点击

事情是这样的:

@Override 
protected void onCreate(Bundle savedInstanceState) { 

    ...  
    imageView.setClickeable(false); // or setEnabled = false 

    new Thread(){ 
     public void run(){ 
     anotherClass.secondClassMethod(); 
     } 
    }.start(); 

    imageView.setOnTouchListener(new View.OnTouchListener() {    
     @Override 
     public boolean onTouch(View v, MotionEvent event) { 
     ... 
     } 
    }); 
} 


private anotherClassCallback callback = new anotherClassCallback(){ 

    @Override 
    public void hasFinished(){ 
     imageView.setClickable(true); // or setEnabled = true 
    } 
}; 

实际上却是不工作,因为,例如,如果我在ImageView的点击,而线程运行3次,当hasFinished方法然后执行它看起来像它保持了我3点击,然后直接运行3个onTouch。

有人知道最新情况吗?

Thx u!

+0

尝试imageView.setOnClickListener(null); insdie run方法。一旦运行方法完成,然后添加侦听器。 – kumar 2013-04-06 10:49:02

+0

你应该使用asynctask而不是线程。 正如答案中所述,您应该使用setOnclickListener而不是setOntouchListener。 new AsyncTask onPreExectute(){ imageView.setClickeable(false); } } .execute(); – vandzi 2013-04-06 11:28:36

回答

2

onTouch和onClick是不一样的,所以当你设置onClickable虚假触摸事件仍然被解雇。也许尝试在setOnClickListener()中做你正在做的事

+0

您说得对,但我需要使用onTouch,因为当您触摸imageView(我的应用程序的要求)时,我的应用程序无法播放“点击”。 – wildzic 2013-04-06 18:51:11

+0

在这种情况下,我会做什么kumar说,但对于onTouchListener。基本上当你开始你的线程时将它设置为false,如果我明白你想要做什么。你也可以使用var或其他东西来跟踪它是否应该被禁用。 – sgarman 2013-04-07 06:57:54

0

你应该使用asynctask而不是线程。 正如答案中所述,您应该使用setOnclickListener而不是setOntouchListener。

new AsyncTask<Void,Void,Void>(){ 
    onPreExectute(){ 
     imageView.setClickeable(false); 
     imageView.setOnclickListener(null); 
    } 

    doInBackround(){ 

    } 

    onPostExecute(){ 
     imageView.setClickeable(true); 
     imageView.setOnclickListener(new OnclickListener(){ 
     onClick(View v){ 

     } 
     }); 
    } 


}.execute(); 
+0

我改变了它,但它仍然无法正常工作。它看起来像是保持点击,然后在onPostExecute执行时直接运行它们(然后执行imageView.setOnclickListener(...))。 – wildzic 2013-04-06 18:58:59