Android 中的监听和按键处理详情
各种监听
按键处理
onKeyDown()
onBackPressed()
Fragment中监听Back返回键
各种监听我们来练习下各种监听。我们在 TextView 上添加了触摸监听,在 Button 上添加了长按监听,在 Spinner 下拉框选项发生变化的时候添加了监听,在 ListView 选中选项时增加了监听。
xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:id="@+id/textView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#F08080"
android:padding="10dp"
android:text="触屏监听" />
<Button
android:id="@+id/button"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:elevation="1dp"
android:text="长按监听" />
<Spinner
android:id="@+id/spinner"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#EED2EE"
android:padding="20dp" />
<ListView
android:id="@+id/listview"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#D1EEEE" />
</LinearLayout>
Activity
public class MainActivity extends AppCompatActivity {
private TextView textview;
private Button button;
private Spinner spinner;
private ListView listview;
private String[] cities;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
setData();//准备要在列表中要显示的数据
setViews();//获得控件,并在列表中显示数据
setListeners();//为控件设置监听器
}
private void setData() {
cities = new String[]{"北京", "天津", "河北",
"黑龙江", "吉林", "辽宁", "内蒙古",
"新疆", "西藏", "江苏", "上海"
};
}
private void setViews() {
textview = findViewById(R.id.textView);
button = findViewById(R.id.button);
spinner = findViewById(R.id.spinner);
listview = findViewById(R.id.listview);
//列表和下拉菜单显示城市列表
//一段神秘的代码...
ArrayAdapter<String> adapter = null;
adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, cities);
listview.setAdapter(adapter);
adapter = new ArrayAdapter<>(this, android.R.layout.simple_spinner_item, cities);
adapter.setDropDownViewResource(android.R.layout.simple_expandable_list_item_1);
spinner.setAdapter(adapter);
}
private void setListeners() {
textview.setOnTouchListener((view, motionEvent) -> {
switch (motionEvent.getAction()) {
//按下
case MotionEvent.ACTION_DOWN:
Toast.makeText(MainActivity.this, "按下", Toast.LENGTH_SHORT).show();
break;
//抬起
case MotionEvent.ACTION_UP:
Toast.makeText(MainActivity.this, "抬起", Toast.LENGTH_SHORT).show();
break;
//移动
case MotionEvent.ACTION_MOVE:
//Toast.makeText(MainActivity.this, "移动", Toast.LENGTH_SHORT).show();
break;
}
return true;
});
button.setOnLongClickListener(view -> {
Toast.makeText(MainActivity.this, "长按了按钮", Toast.LENGTH_SHORT).show();
//返回布尔值true
return true;
});
spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
Toast.makeText(MainActivity.this, "下标" + i + "城市" + cities[i], Toast.LENGTH_SHORT).show();
}
@Override
public void onNothingSelected(AdapterView<?> adapterView) {
}
});
listview.setOnItemClickListener((adapterView, view, i, l) -> Toast.makeText(MainActivity.this, "下标" + i + "城市" + cities[i], Toast.LENGTH_SHORT).show());
}
}
按键处理
onKeyDown()
按键处理表现为使用 Android 设备时操作的物理按钮的响应的处理。
重写 onKey??() 方法可以处理按钮的事件,该系列方法的参数 int keyCode 表示按下的哪个键,可以匹配 keyEvent 类中的常量进行对比。
我们可以捕获 Back 键。原理是:当按下 BACK 键时,会被onKeyDown
捕获,判断是 BACK 键,则执行相应方法。
新建一个测试项目,在 MainActivity 中增加如下代码:
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
//日志
Log.d("ONKEYDOWN", "keyCode:" + keyCode);
//判断其按下的是否为返回键(Back)
if (keyCode == KeyEvent.KEYCODE_BACK) {
Toast.makeText(this, "连按2下退出应用程序", Toast.LENGTH_SHORT).show();
}
//按照默认方式处理
return super.onKeyDown(keyCode, event);
}
运行程序:
可以看到按下返回键时,退出了程序,同时输出日志
ONKEYDOWN: keyCode:4
由于最后执行了return super.onKeyDown(keyCode, event);
,所以按照默认方式退出了
如果改为return false;
或 return true;
都不会退出程序。
栗子:连按2次退出应用程序的代码
public class MainActivity extends AppCompatActivity {
private long lastBackDownTime;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
//日志
Log.d("ONKEYDOWN", "keyCode:" + keyCode);
//判断其按下的是否为返回键(Back)
if (keyCode == KeyEvent.KEYCODE_BACK) {
//获取当前按下Back键的时间
long currentBackDownTime = System.currentTimeMillis();
//与上一次按下Back键的时间对比
//如果时间差不超过1000ms,判定为连续按下,则退出
//否则再次提示
if (currentBackDownTime - lastBackDownTime < 1000) {
finish();
} else {
Toast.makeText(this, "连按2下退出应用程序", Toast.LENGTH_SHORT).show();
//如果没有退出,则记录本次按下Back键时间,作为下次时间参考
lastBackDownTime = currentBackDownTime;
}
return true;
}
//按照默认方式处理
return super.onKeyDown(keyCode, event);
}
}
运行程序,当连续按两次返回键会退出程序,如果只按一次不会。
onBackPressed()onBackPressed()
这个方法就是专门用来监听 back 键事件的。所以可以用以下代码完成 按两次返回键退出程序 的功能。
@Override
public void onBackPressed() {
long currentBackDownTime = System.currentTimeMillis();
if (currentBackDownTime - lastBackDownTime < 1000) {
finish();
} else {
Toast.makeText(this, "连按2下退出应用程序", Toast.LENGTH_SHORT).show();
lastBackDownTime = currentBackDownTime;
}
super.onBackPressed();
}
Fragment中监听Back返回键
监听手机上的 Back 键可以在 Activity 中重写onBackPressed
方法。
如果只有1个 Activity 管理多个 Fragment,每个 Fragment 点击 Back 键处理不同事件,可以在 Activity 中重写 onBackPressed 方法,然后区分不同 Fragment 即可。
因为我的 Fragment 用 tag 进行了区分,区分当前 tag 即可,代码如下:
@Override
public void onBackPressed() {
if(currentTag.equals("xx")) {
doSomething();
} else {
// handle by activity
super.onBackPressed();
}
}
到此这篇关于Android 中的监听和按键处理详情的文章就介绍到这了,更多相关Android 监听 内容请搜索易知道(ezd.cc)以前的文章或继续浏览下面的相关文章希望大家以后多多支持易知道(ezd.cc)!
相关内容
-
Android手机模拟器的安装方法_模拟器安装教程在
Android手机模拟器的安装方法_模拟器安装教程在计算机技能,,核...
-
Android不仅仅是所有Android产品的移动电话系统
Android不仅仅是所有Android产品的移动电话系统。,,近年来,Andr...
-
Android平板电脑是离开戴尔将主推Win8平板电脑
Android平板电脑是离开戴尔将主推Win8平板电脑,,戴尔首席执行...
-
Google发布Android 13 Beta 3.1 修复忘加测试反
Google发布Android 13 Beta 3.1 修复忘加测试反馈应用的单一...
-
2499元的双核android3.2系统宏碁A100平板电脑推
2499元的双核android3.2系统宏碁A100平板电脑推荐,,2000元的价...
-
Android sqlite unknown error |code 14: Could
Android sqlite unknown error |code 14: Could not open da...
-
Android 文件目录存储介绍 缓存目录 | 私有目录
Android 文件目录存储介绍 缓存目录 | 私有目录 | 系统根目...
-
Android SDK各个版本区别及如何选择
Android SDK各个版本区别及如何选择,版本,功能,1. 各个版本区...
-
联想IdeaPadA10Android笔记本2066元
联想IdeaPadA10Android笔记本2066元,,10月10日,联想即将推出一...
-
Android如何使用SQLiteOpenHelper在已经存在的
Android如何使用SQLiteOpenHelper在已经存在的数据库中插入...
-
夜神模拟器怎么设置android系统版本
夜神模拟器怎么设置android系统版本,模拟器,游戏,夜神模拟器怎...
-
Android Q有哪些令人不适的改进?荣耀V20适配安卓
Android Q有哪些令人不适的改进?荣耀V20适配安卓Q以后,体验会...
-
android设置状态栏颜色|android设置状态栏字体
android设置状态栏颜色|android设置状态栏字体颜色,,1. androi...
-
在Android Studio更改现有项目里的SDK版本
在Android Studio更改现有项目里的SDK版本,版本,项目,一、在Ec...
-
Android 5.0 Lollipop十二大新功能详细介绍
Android 5.0 Lollipop十二大新功能详细介绍,功能, ...