Android?中的監(jiān)聽和按鍵處理詳情
各種監(jiān)聽
我們來練習下各種監(jiān)聽。我們在 TextView 上添加了觸摸監(jiān)聽,在 Button 上添加了長按監(jiān)聽,在 Spinner 下拉框選項發(fā)生變化的時候添加了監(jiān)聽,在 ListView 選中選項時增加了監(jiān)聽。
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)聽" /> <Button android:id="@+id/button" android:layout_width="match_parent" android:layout_height="wrap_content" android:elevation="1dp" android:text="長按監(jiān)聽" /> <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();//準備要在列表中要顯示的數(shù)據(jù) setViews();//獲得控件,并在列表中顯示數(shù)據(jù) setListeners();//為控件設置監(jiān)聽器 } 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; //移動 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()
按鍵處理表現(xiàn)為使用 Android 設備時操作的物理按鈕的響應的處理。
重寫 onKey??() 方法可以處理按鈕的事件,該系列方法的參數(shù) int keyCode 表示按下的哪個鍵,可以匹配 keyEvent 類中的常量進行對比。
我們可以捕獲 Back 鍵。原理是:當按下 BACK 鍵時,會被onKeyDown
捕獲,判斷是 BACK 鍵,則執(zhí)行相應方法。
新建一個測試項目,在 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
由于最后執(zhí)行了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,判定為連續(xù)按下,則退出 //否則再次提示 if (currentBackDownTime - lastBackDownTime < 1000) { finish(); } else { Toast.makeText(this, "連按2下退出應用程序", Toast.LENGTH_SHORT).show(); //如果沒有退出,則記錄本次按下Back鍵時間,作為下次時間參考 lastBackDownTime = currentBackDownTime; } return true; } //按照默認方式處理 return super.onKeyDown(keyCode, event); } }
運行程序,當連續(xù)按兩次返回鍵會退出程序,如果只按一次不會。
onBackPressed()
onBackPressed()
這個方法就是專門用來監(jiān)聽 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中監(jiān)聽Back返回鍵
監(jiān)聽手機上的 Back 鍵可以在 Activity 中重寫onBackPressed
方法。
如果只有1個 Activity 管理多個 Fragment,每個 Fragment 點擊 Back 鍵處理不同事件,可以在 Activity 中重寫 onBackPressed 方法,然后區(qū)分不同 Fragment 即可。
因為我的 Fragment 用 tag 進行了區(qū)分,區(qū)分當前 tag 即可,代碼如下:
@Override public void onBackPressed() { if(currentTag.equals("xx")) { doSomething(); } else { // handle by activity super.onBackPressed(); } }
到此這篇關于Android 中的監(jiān)聽和按鍵處理詳情的文章就介紹到這了,更多相關Android 監(jiān)聽 內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Android自定義VIew實現(xiàn)衛(wèi)星菜單效果淺析
這篇文章主要介紹了Android自定義VIew實現(xiàn)衛(wèi)星菜單效果淺析,非常不錯具有參考借鑒價值,需要的朋友可以參考下2016-11-11Android獲取清單文件中的meta-data,解決碰到數(shù)值為null的問題
這篇文章主要介紹了Android獲取清單文件中的meta-data,解決碰到數(shù)值為null的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-03-03Android利用屬性動畫實現(xiàn)優(yōu)酷菜單
這篇文章主要為大家詳細介紹了Android利用屬性動畫實現(xiàn)優(yōu)酷菜單,具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-01-01