接口的回调2-Android学习

本文通过一个简单的示例介绍如何在Android开发中创建一个自定义的`setOnDoubleClickListener`接口,用于检测用户是否进行了双击操作。通过实现`OnDoubleClickListener`接口并在1秒内响应两次点击,可以识别出双击事件。文章包含代码实现及效果图展示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

之前简单介绍了接口的回调,在android开发的过程中,我们常常遇到setOnClickListener,里面放一个接口,等待触发的时候回调

这里我写个demo,用来判断用户双击的操作,我把名字成为setOnDoubleClickListener

下面大改结合代码讲一下如何实现。

首先,要有个接口对吧,就叫OnDoubleClickListener吧。

package com.example.appdemo;

import android.view.View;

/**
 * 双击的接口监听
 * 
 * @author leafact
 * 
 */
public interface OnDoubleClickListener {
	public void OnDoubleClick(View v);
}

要想有这种效果,我们需要自定义一个控件,继承TextView的MyTextView吧,注意点写代码里

package com.example.appdemo;

import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.widget.TextView;

/**
 * 自定义控件,加入双击
 * 
 * @author leafact
 * 
 */
public class MyTextView extends TextView {

	// 私有的监听接口
	private OnDoubleClickListener mListener;
	private long lastClickTimeMillis = 0;

	public MyTextView(Context context, AttributeSet attrs) {
		super(context, attrs);
	}

	// 设置监听
	public void setOnDoubleClickListener(OnDoubleClickListener listener) {
		mListener = listener;
	}

	@Override
	public boolean onTouchEvent(MotionEvent event) {
		switch (event.getAction()) {
		case MotionEvent.ACTION_DOWN:
			Log.i("test", "ACTION_DOWN");
			long temp = System.currentTimeMillis();
			if (mListener != null
					&& Math.abs(temp - lastClickTimeMillis) < 1000) {
				// mListener必须设置过监听才可以,所以需要判断mListener是否为null
				mListener.OnDoubleClick(this);
			}
			lastClickTimeMillis = temp;

			break;

		default:
			break;
		}
		// 必须为扩展重写,开始认为应该返回false,为true表示事件拦截。
		// 但是如果自己返回true或者false,onTouchEvent就完全被重写了,父类的监听,如onClickListener就监听不到了
		// 主要的事要说三遍,扩展重写,扩展重写,扩展重写。
		return super.onTouchEvent(event);
	}

}

对应的布局

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >

    <com.example.appdemo.MyTextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="双击查看效果" />

</RelativeLayout>

activity中

package com.example.appdemo;

import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.util.AttributeSet;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends Activity {
	private MyTextView tv;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		tv = (MyTextView) findViewById(R.id.textView);
		tv.setOnDoubleClickListener(new OnDoubleClickListener() {

			@Override
			public void OnDoubleClick(View v) {
				Toast.makeText(MainActivity.this, "1秒内点击两次,你双击了",
						Toast.LENGTH_SHORT).show();
			}
		});
		tv.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				Toast.makeText(MainActivity.this, "单击", Toast.LENGTH_SHORT)
						.show();
			}
		});
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}

}

效果图:单击只显示Toast为单击,一秒内点击两次,将会先弹出

 单机

 1秒内点击两次,你双击了

 单击


效果图:



=================================

欢迎交流

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值