中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Android中的監聽和按鍵怎么處理

發布時間:2022-08-27 09:23:49 來源:億速云 閱讀:137 作者:iii 欄目:開發技術

這篇文章主要介紹了Android中的監聽和按鍵怎么處理的相關知識,內容詳細易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇Android中的監聽和按鍵怎么處理文章都會有所收獲,下面我們一起來看看吧。

    各種監聽

    我們來練習下各種監聽。我們在 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中的監聽和按鍵怎么處理”知識都有一定的了解,大家如果還想學習更多知識,歡迎關注億速云行業資訊頻道。

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    仁化县| 达日县| 繁峙县| 九龙坡区| 威宁| 肇源县| 祁门县| 临城县| 商河县| 周口市| 额尔古纳市| 泽库县| 余庆县| 茂名市| 冀州市| 永川市| 三河市| 沁阳市| 林西县| 福贡县| 繁昌县| 昆明市| 河北省| 武义县| 奉节县| 富川| 新民市| 瑞昌市| 醴陵市| 周口市| 来宾市| 衡南县| 舒城县| 靖江市| 西盟| 玛沁县| 株洲市| 阜阳市| 龙山县| 延寿县| 玉屏|