<var id="fnfpo"><source id="fnfpo"></source></var>
<rp id="fnfpo"></rp>

<em id="fnfpo"><object id="fnfpo"><input id="fnfpo"></input></object></em>
<em id="fnfpo"><acronym id="fnfpo"></acronym></em>
  • <th id="fnfpo"><track id="fnfpo"></track></th>
  • <progress id="fnfpo"><track id="fnfpo"></track></progress>
  • <tbody id="fnfpo"><pre id="fnfpo"></pre></tbody>

  • x
    x

    【教程】Android開發之dialog,activity 屏蔽Home鍵詳解

    發布時間:2013-8-23 16:01    發布者:reggae
    關鍵詞: Android
    相信在Android應用上,很多時候邏輯是需要屏蔽Home鍵的,但這個用戶體驗是否需要,就看各位的需求了。
    一般的方法屏蔽Home鍵,大家一定看過不少文章了。我總結一下,先說一下一般情況下Activity的屏蔽按鍵和Home鍵吧。
    屏蔽其他鍵,重寫onKeyDown
    Java代碼
    1. @Override
    2. public boolean onKeyDown(int keyCode, KeyEvent event) {
    3. Log.i(TAG,"keycode="+keyCode + "   isBan="+isBan);
    4. switch (keyCode) {
    5. case KeyEvent.KEYCODE_BACK:
    6. Log.i(TAG,"KEYCODE_BACK");
    7. return true;
    8. }
    9. return super.onKeyDown(keyCode, event);
    10. }
    復制代碼

    大家會發現,這里屏蔽Home鍵是捕捉不到的,因為大家的權限一般是User所以是無效的。
    而其實android處理Home鍵等系統級按鍵是有一定的處理的。
    引用 看看源碼是怎樣處理的 \frameworks\policies\base\phone\com\android\internal\policy\impl\PhoneWindowManager.java #1092 Java代碼
    1. // First we always handle the home key here, so applications
    2. // can never break it, although if keyguard is on, we do let
    3. // it handle it, because that gives us the correct 5 second
    4. // timeout.
    5. if (code == KeyEvent.KEYCODE_HOME) {
    6. // If a system window has focus, then it doesn't make sense
    7. // right now to interact with applications.
    8. WindowManager.LayoutParams attrs = win != null ? win.getAttrs() : null;
    9. if (attrs != null) {
    10. final int type = attrs.type;
    11. if (type == WindowManager.LayoutParams.TYPE_KEYGUARD
    12. type == WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG) {
    13. // the "app" is keyguard, so give it the key
    14. return false;
    15. }
    16. final int typeCount = WINDOW_TYPES_WHERE_HOME_DOESNT_WORK.length;
    17. for (int i=0; i
    18. if (type == WINDOW_TYPES_WHERE_HOME_DOESNT_WORK[i]) {
    19. // don't do anything, but also don't pass it to the app
    20. return true;
    21. }
    22. }
    23. }
    復制代碼

    通過源碼,我們不難發現兩個的參數 WindowManager.LayoutParams.TYPE_KEYGUARD和
    WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG
    借鑒于此,重寫onAttachedToWindow,以實現屏蔽Home鍵 Java代碼
    1. public void onAttachedToWindow() {
    2. this.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD);
    3. super.onAttachedToWindow();
    4. }
    復制代碼

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 華麗的分界線,以下內容更精彩- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    輪到dialog了,如果在Activity彈出dialog,在Activity設置以上2個方法是沒辦法屏蔽的。
    其實,原理是一樣的,只是地方不一樣而已。
    Java代碼
    1. final Dialog dialog = new Dialog(this);
    2. dialog.setContentView(R.layout.mydailog);
    3. dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD);
    4. dialog.show();
    5. dialog.setOnKeyListener(new android.content.DialogInterface.OnKeyListener(){
    6. @Override
    7. public boolean onKey(DialogInterface dialog, int keyCode,KeyEvent event) {
    8. switch (keyCode) {
    9. case KeyEvent.KEYCODE_BACK:
    10. Log.i(TAG,"KEYCODE_BACK");
    11. return true;
    12. }
    13. return false;
    14. }
    15. });
    復制代碼

    這樣運行后,出錯如下:
    Error代碼
    1. 10-18 13:27:06.380: ERROR/AndroidRuntime(4684): Caused by: android.view.WindowManager$BadTokenException: Unable to add window android.view.ViewRoot$W@2b046d68 -- permission denied for this window type
    復制代碼

    其實,只需要把dialog.getWindow().setType的位置放在show后面就可以了
    正確代碼
    1. dialog.show();
    2. dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD);
    復制代碼

    這么,就完成了Back鍵的屏蔽 和Home鍵盤的屏蔽了!

    總結:
    1在以上用WindowManager.LayoutParams.TYPE_KEYGUARD的地方改用
    WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG 效果一樣。至于兩者的具體差別,得以后再研究研究。

    2其實,在源碼里是這樣調用的。 Java代碼
    1. final AlertDialog dialog = new AlertDialog.Builder(mContext)
    2. .setTitle(null)
    3. .setMessage(message)
    4. .setNeutralButton(R.string.ok, null)
    5. .create();
    6. dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG);
    7. dialog.show();
    復制代碼

    但我們如果這樣調用就會出現之前的那個error:permission denied for this window type 這就顯而易見了吧~~

    3ProgressDialog 默認屏蔽 Back鍵,Dialog,AlertDialog則需setOnKeyListener

    4其實屏蔽Home鍵,在頁面的某個地方,例如一個Button的onClick里,去設置setType就可以了,如:
    Java代碼
    1. button.setOnClickListener(new View.OnClickListener() {
    2. @Override
    3. public void onClick(View v) {
    4. getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD);
    5. }
    6. });
    復制代碼

    但前提是重載Activity的onAttachedToWindow(),哪怕只是一個空實現,然后返回父類方法。
    Java代碼
    1. @Override
    2. public void onAttachedToWindow() {
    3. super.onAttachedToWindow();
    4. }
    復制代碼

    5其實它們,都是常用的~ Java代碼
    1. switch (keyCode) {
    2. case KeyEvent.KEYCODE_HOME:
    3. Log.i(TAG,"KEYCODE_HOME");
    4. return true;
    5. case KeyEvent.KEYCODE_BACK:
    6. Log.i(TAG,"KEYCODE_BACK");
    7. return true;
    8. case KeyEvent.KEYCODE_CALL:
    9. Log.i(TAG,"KEYCODE_CALL");
    10. return true;
    11. case KeyEvent.KEYCODE_SYM:
    12. Log.i(TAG,"KEYCODE_SYM");
    13. return true;
    14. case KeyEvent.KEYCODE_VOLUME_DOWN:
    15. Log.i(TAG,"KEYCODE_VOLUME_DOWN");
    16. return true;
    17. case KeyEvent.KEYCODE_VOLUME_UP:
    18. Log.i(TAG,"KEYCODE_VOLUME_UP");
    19. return true;
    20. case KeyEvent.KEYCODE_STAR:
    21. Log.i(TAG,"KEYCODE_STAR");
    22. return true;
    23. }
    復制代碼

    希望大家看到這個文章能覺得有用,謝謝已閱者。更多安卓技術問題歡迎加群探討:278744577,驗證碼:eec,不寫驗證不予通過喲~

    本文地址:http://www.portaltwn.com/thread-119873-1-1.html     【打印本頁】

    本站部分文章為轉載或網友發布,目的在于傳遞和分享信息,并不代表本網贊同其觀點和對其真實性負責;文章版權歸原作者及原出處所有,如涉及作品內容、版權和其它問題,我們將根據著作權人的要求,第一時間更正或刪除。
    您需要登錄后才可以發表評論 登錄 | 立即注冊

    廠商推薦

    • Microchip視頻專區
    • EtherCAT®和Microchip LAN925x從站控制器介紹培訓教程
    • MPLAB®模擬設計器——在線電源解決方案,加速設計
    • 讓您的模擬設計靈感,化為觸手可及的現實
    • 深度體驗Microchip自動輔助駕駛應用方案——2025巡展開啟報名!
    • 貿澤電子(Mouser)專區

    相關視頻

    關于我們  -  服務條款  -  使用指南  -  站點地圖  -  友情鏈接  -  聯系我們
    電子工程網 © 版權所有   京ICP備16069177號 | 京公網安備11010502021702
    快速回復 返回頂部 返回列表
    精品一区二区三区自拍图片区_国产成人亚洲精品_亚洲Va欧美va国产综合888_久久亚洲国产精品五月天婷