安卓应用开发实例
我们在实际开发中需要按下按钮,但是像平时使用OnClickListener监听的话,其实不能满足我们的需求。 例如,按下按钮创建秒表app,按下开始计时器,然后释放停止计时器。
如果使用上面的OnClickListener侦听器进行侦听,则只能侦听键上升时的行为。 那么,分开拦截按键抬起的动作会怎么样呢? 这是作者独自实现的方法之一。 请作为参考。
Java Code
textView=(TextView) findViewById(R.id.textView1);
button=(Button) findViewById(R.id.button1);
ButtonListener b=new ButtonListener();
button.setOnClickListener(b);
button.setOnTouchListener(b);
handler=new Handler()
{
@Override
public void handleMessage(Message msg)
{
//TODO Auto-generated method stub
super.handleMessage(msg);
if(msg.what==0x1234)
{
textView.setText ( )计时( msg.obj )秒);
}
}
};
在此,从写有两个侦听器的方法开始,使用内部类进行比较。 一个是上面的OnClickListener,另一个是实现监听按下上升这两个动作的OnTouchListener。 内部类的代码如下。
Java Code
class ButtonListener implements OnClickListener, OnTouchListener
{
public void onClick(View v)
{
if(v.getId()==R.id.button1)
{
Log.d(‘test’, ‘cansal button — click’);
Toast tst=Toast.makeText(MainActivity.this, ‘33333333’,
Toast.LENGTH_SHORT);
tst.show();
}
}
public boolean onTouch(View v, MotionEvent event)
{
if(v.getId()==R.id.button1)
{
if ( event.get action (==motion event.action _ down ) /判定动作,如果是按下则设置标志位,接通线程
{
state=true;
new MyThread().start();
}
if ( event.get action (==motion event.action _ up ) /抬起时重置标志位,结束线程
{
state=false;
}
}
return false;
}
}
在这里,为了实现按下开始计时、上升停止计时的功能,计时功能需要在一个线程中实现。 这里使用handler-message通过以下方法实现。
Java Code
class MyThread extends Thread
{
@Override
public void run()
{
//TODO Auto-generated method stub
super.run();
while(state)
{
try
{
Thread.sleep(1000);
}
catch (InterruptedException e)
{
//TODO Auto-generated catch block
e.printStackTrace();
}
Message message=new Message();
message.what=0x1234;
message.obj=count++;
handler.sendMessage(message);
//handler.sendEmptyMessage(0x1234);
}
}
}
每秒向线程添加一次count,将count数字传递给handler,更新textview内容,方法稳定可行,系统资源消耗少,用于其他项目具有很好的效果。
実行結果:
押下時
抬起时