Android?中的監(jiān)聽(tīng)和按鍵處理詳情
各種監(jiān)聽(tīng)

我們來(lái)練習(xí)下各種監(jiān)聽(tīng)。我們?cè)?TextView 上添加了觸摸監(jiān)聽(tīng),在 Button 上添加了長(zhǎng)按監(jiān)聽(tīng),在 Spinner 下拉框選項(xiàng)發(fā)生變化的時(shí)候添加了監(jiān)聽(tīng),在 ListView 選中選項(xiàng)時(shí)增加了監(jiān)聽(tīng)。
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="觸屏監(jiān)聽(tīng)" />
<Button
android:id="@+id/button"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:elevation="1dp"
android:text="長(zhǎng)按監(jiān)聽(tīng)" />
<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();//準(zhǔn)備要在列表中要顯示的數(shù)據(jù)
setViews();//獲得控件,并在列表中顯示數(shù)據(jù)
setListeners();//為控件設(shè)置監(jiān)聽(tīng)器
}
private void setData() {
cities = new String[]{"北京", "天津", "河北",
"黑龍江", "吉林", "遼寧", "內(nèi)蒙古",
"新疆", "西藏", "江蘇", "上海"
};
}
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;
//移動(dòng)
case MotionEvent.ACTION_MOVE:
//Toast.makeText(MainActivity.this, "移動(dòng)", Toast.LENGTH_SHORT).show();
break;
}
return true;
});
button.setOnLongClickListener(view -> {
Toast.makeText(MainActivity.this, "長(zhǎng)按了按鈕", 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, "下標(biāo)" + i + "城市" + cities[i], Toast.LENGTH_SHORT).show();
}
@Override
public void onNothingSelected(AdapterView<?> adapterView) {
}
});
listview.setOnItemClickListener((adapterView, view, i, l) -> Toast.makeText(MainActivity.this, "下標(biāo)" + i + "城市" + cities[i], Toast.LENGTH_SHORT).show());
}
}按鍵處理
onKeyDown()
按鍵處理表現(xiàn)為使用 Android 設(shè)備時(shí)操作的物理按鈕的響應(yīng)的處理。
重寫(xiě) onKey??() 方法可以處理按鈕的事件,該系列方法的參數(shù) int keyCode 表示按下的哪個(gè)鍵,可以匹配 keyEvent 類(lèi)中的常量進(jìn)行對(duì)比。
我們可以捕獲 Back 鍵。原理是:當(dāng)按下 BACK 鍵時(shí),會(huì)被onKeyDown捕獲,判斷是 BACK 鍵,則執(zhí)行相應(yīng)方法。
新建一個(gè)測(cè)試項(xiàng)目,在 MainActivity 中增加如下代碼:
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
//日志
Log.d("ONKEYDOWN", "keyCode:" + keyCode);
//判斷其按下的是否為返回鍵(Back)
if (keyCode == KeyEvent.KEYCODE_BACK) {
Toast.makeText(this, "連按2下退出應(yīng)用程序", Toast.LENGTH_SHORT).show();
}
//按照默認(rèn)方式處理
return super.onKeyDown(keyCode, event);
}運(yùn)行程序:

可以看到按下返回鍵時(shí),退出了程序,同時(shí)輸出日志
ONKEYDOWN: keyCode:4
由于最后執(zhí)行了return super.onKeyDown(keyCode, event);,所以按照默認(rèn)方式退出了
如果改為return false; 或 return true; 都不會(huì)退出程序。
栗子:連按2次退出應(yīng)用程序的代碼

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) {
//獲取當(dāng)前按下Back鍵的時(shí)間
long currentBackDownTime = System.currentTimeMillis();
//與上一次按下Back鍵的時(shí)間對(duì)比
//如果時(shí)間差不超過(guò)1000ms,判定為連續(xù)按下,則退出
//否則再次提示
if (currentBackDownTime - lastBackDownTime < 1000) {
finish();
} else {
Toast.makeText(this, "連按2下退出應(yīng)用程序", Toast.LENGTH_SHORT).show();
//如果沒(méi)有退出,則記錄本次按下Back鍵時(shí)間,作為下次時(shí)間參考
lastBackDownTime = currentBackDownTime;
}
return true;
}
//按照默認(rèn)方式處理
return super.onKeyDown(keyCode, event);
}
}運(yùn)行程序,當(dāng)連續(xù)按兩次返回鍵會(huì)退出程序,如果只按一次不會(huì)。
onBackPressed()
onBackPressed()這個(gè)方法就是專(zhuān)門(mén)用來(lái)監(jiān)聽(tīng) back 鍵事件的。所以可以用以下代碼完成 按兩次返回鍵退出程序 的功能。
@Override
public void onBackPressed() {
long currentBackDownTime = System.currentTimeMillis();
if (currentBackDownTime - lastBackDownTime < 1000) {
finish();
} else {
Toast.makeText(this, "連按2下退出應(yīng)用程序", Toast.LENGTH_SHORT).show();
lastBackDownTime = currentBackDownTime;
}
super.onBackPressed();
}Fragment中監(jiān)聽(tīng)Back返回鍵
監(jiān)聽(tīng)手機(jī)上的 Back 鍵可以在 Activity 中重寫(xiě)onBackPressed方法。
如果只有1個(gè) Activity 管理多個(gè) Fragment,每個(gè) Fragment 點(diǎn)擊 Back 鍵處理不同事件,可以在 Activity 中重寫(xiě) onBackPressed 方法,然后區(qū)分不同 Fragment 即可。
因?yàn)槲业?Fragment 用 tag 進(jìn)行了區(qū)分,區(qū)分當(dāng)前 tag 即可,代碼如下:
@Override
public void onBackPressed() {
if(currentTag.equals("xx")) {
doSomething();
} else {
// handle by activity
super.onBackPressed();
}
}到此這篇關(guān)于Android 中的監(jiān)聽(tīng)和按鍵處理詳情的文章就介紹到這了,更多相關(guān)Android 監(jiān)聽(tīng) 內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Android實(shí)現(xiàn)MVVM架構(gòu)數(shù)據(jù)刷新詳解流程
MVVM架構(gòu)模式,即Model-View-ViewModel三個(gè)層級(jí),MVVM模式出來(lái)的時(shí)間已經(jīng)很長(zhǎng)了,網(wǎng)上關(guān)于MVVM模式的解析也有很多,我這里只說(shuō)一下我自己的理解,基本上是和MVP模式相比較的一個(gè)差異2021-10-10
Android應(yīng)用閃屏頁(yè)延遲跳轉(zhuǎn)的三種寫(xiě)法
這篇文章主要介紹了 Android應(yīng)用閃屏頁(yè)延遲跳轉(zhuǎn)的三種寫(xiě)法,需要的朋友可以參考下2017-03-03
Android BottomNavigationBar底部導(dǎo)航控制器使用方法詳解
這篇文章主要為大家詳細(xì)介紹了Android BottomNavigationBar底部導(dǎo)航控制器使用方法,感興趣的小伙伴們可以參考一下2016-03-03
Android GZip的使用-開(kāi)發(fā)中網(wǎng)絡(luò)請(qǐng)求的壓縮實(shí)例詳解
這篇文章主要介紹了Android GZip的使用-開(kāi)發(fā)中網(wǎng)絡(luò)請(qǐng)求的壓縮實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下2016-11-11
Android實(shí)現(xiàn)Ant Design 自定義表單組件
Ant Design 組件提供了Input,InputNumber,Radio,Select,uplod等表單組件,下面通過(guò)本文給大家詳細(xì)介紹Android實(shí)現(xiàn)Ant Design 自定義表單組件,需要的的朋友參考下吧2017-06-06
Android中的Shape和Selector的結(jié)合使用實(shí)例
這篇文章主要介紹了Android中的Shape和Selector的結(jié)合使用實(shí)例,本文直接給出實(shí)例代碼,需要的朋友可以參考下2015-06-06
android 仿微信demo——登錄功能實(shí)現(xiàn)(服務(wù)端)
這系列文章主要介紹了微信小程序-閱讀小程序?qū)嵗【幱X(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧,希望能給你們提供幫助2021-06-06
Android開(kāi)發(fā)之動(dòng)畫(huà)實(shí)現(xiàn)方法
這篇文章主要介紹了Android開(kāi)發(fā)之動(dòng)畫(huà)實(shí)現(xiàn)方法,實(shí)例分析了Android中動(dòng)畫(huà)的原理與實(shí)現(xiàn)技巧,需要的朋友可以參考下2015-05-05

