2010-11-21 48 views
38

Tôi đang cố gắng phát hiện khi nút Trình đơn vật lý trên điện thoại Android của tôi đã được nhấn. Tôi mặc dù mã dưới đây sẽ làm việc nhưng nó không. Tôi đi sai ở đâu?Phát hiện phím bấm Trình đơn vật lý trong Android

Lỗi được trả về là 'Công cụ sửa đổi bất hợp pháp cho thông số onKeyDown; chỉ chính thức được phép'

public boolean onKeyDown(int keyCode, KeyEvent event) { 
    if (keyCode == KeyEvent.KEYCODE_MENU) { 
     // Do Stuff 
    } else { 
     return super.onKeyDown(keyCode, event); 
    } 
} 
+4

Sẽ rất tuyệt nếu bạn có thể chấp nhận câu trả lời vì câu hỏi này được trả lời kỹ lưỡng ngay bây giờ. – SK9

Trả lời

0

Nếu bạn đã xử lý sự kiện này chỉ trở thành sự thật, nếu bạn không trả về false vì vậy các hệ điều hành Android có thể vượt qua sự kiện này với phần còn lại của các thành phần để xử lý nó.

79

tôi muốn tìm kiếm một lên sự kiện quan trọng, chứ không phải là một sự kiện xuống, với onKeyUp.

public boolean onKeyUp(int keyCode, KeyEvent event) { 
    if (keyCode == KeyEvent.KEYCODE_MENU) { 
     // ........ 
     return true; 
    } 
    return super.onKeyUp(keyCode, event); 
} 

Chúng tôi trả lại true vì chúng tôi đang xử lý sự kiện; return false nếu bạn muốn hệ thống xử lý sự kiện.

Bạn cũng có thể thực hiện tất cả điều này trong trường hợp ActivityActivity là lớp con gián tiếp đã biết của KeyEvent.

+0

Ngoài ra, hãy xem tài liệu [KeyEvent.Callback] (http://developer.android.com/reference/android/view/KeyEvent.Callback.html) và đây là [example] (http: // developer. android.com/training/keyboard-input/commands.html) –

+0

Câu trả lời sai của nó không bao giờ hoạt động. Vui lòng xem bên dưới câu trả lời. –

+0

Làm việc cho tôi như một sự quyến rũ. Tôi đã hoài nghi, bởi vì tôi đã cố gắng đầu tiên onKeyDown(), và sự kiện đó cho nút menu không bao giờ được giảm xuống hoạt động của tôi, đã được tiêu thụ ở đâu đó trong thanh công cụ "hành động". – gregko

12

Dựa trên tất cả những điều ở trên, điều này dường như là việc triển khai chính xác sẽ chỉ sử dụng các sự kiện phím "lên" và chuyển các sự kiện quan trọng khác cho lớp cha.

public boolean onKeyUp(int keyCode, KeyEvent event) { 
    if (keyCode == KeyEvent.KEYCODE_MENU) { 
     // ... 
     return true; 
    } else { 
     return super.onKeyUp(keyCode, event); 
    } 
} 
+0

Điều này sẽ tổng hợp tất cả, trả về true khác gọi super class. –

6
public boolean onKeyDown(int keyCode, KeyEvent event) { 
    //Checking for the "menu" key 
    if (keyCode == KeyEvent.KEYCODE_MENU) { 
     if (mDrawerLayout.isDrawerOpen(mDrawerList)) { 
      mDrawerLayout.closeDrawers(); 
     } else { 
      mDrawerLayout.openDrawer(Gravity.RIGHT); 
     } 
     return true; 
    } else { 
     return super.onKeyDown(keyCode, event); 
    } 
} 
+3

tốt hơn là nên giải thích mã của bạn. – Raptor

+0

Tôi đang tìm mã chính xác này :) Ẩn và hiển thị tay trái Navigation Drawer. Cảm ơn. –

0

Hãy chắc chắn rằng bạn ghi đè lên các phương pháp onKeyDown trong lớp Hoạt động của bạn. Có một phương thức onKeyDown khác trong lớp View nhưng nó sẽ không được gọi nếu phím menu được nhấn.

-3

Tôi có câu trả lời rất hay cho câu hỏi này :) Tôi đã cố gắng trong 1 năm qua lol và tôi vừa phát hiện ra giải pháp 3 ngày trước đó.Vui lòng xem câu trả lời. Bạn cần phải thực hiện một lớp nhà theo dõi septate. Sử dụng chính xác mã bên dưới với tên của HomeWatcher.

public class HomeWatcher { 
    static final String TAG = "HomeWatcher"; 
    private Context mContext; 
    private IntentFilter mFilter; 
    private OnHomePressedListener mListener; 
    private InnerRecevier mRecevier; 

    public interface OnHomePressedListener { 
     public void onHomePressed(); 

     public void onHomeLongPressed(); 

     //public void onLockLongPressed(); 
    } 

    public HomeWatcher(Context context) { 
     mContext = context; 
     mFilter = new IntentFilter(Intent.ACTION_CLOSE_SYSTEM_DIALOGS); 
    } 


    public void setOnHomePressedListener(OnHomePressedListener listener) { 
     mListener = listener; 
     mRecevier = new InnerRecevier(); 
    } 

    public void startWatch() { 
     try{ 
     if (mRecevier != null) { 
      mContext.registerReceiver(mRecevier, mFilter); 
     } 
     }catch(Exception e){} 
    } 


    public void stopWatch() { 
     try{ 
     if (mRecevier != null) { 
      mContext.unregisterReceiver(mRecevier); 
     } 
     }catch(Exception e){} 
    } 


    class InnerRecevier extends BroadcastReceiver { 
     final String SYSTEM_DIALOG_REASON_KEY = "reason"; 
     final String SYSTEM_DIALOG_REASON_GLOBAL_ACTIONS = "globalactions"; 
     final String SYSTEM_DIALOG_REASON_RECENT_APPS = "recentapps"; 
     final String SYSTEM_DIALOG_REASON_HOME_KEY = "homekey"; 
     //final String SYSTEM_DIALOG_REASON_Lock = "lock"; 

     @Override 
     public void onReceive(Context context, Intent intent) { 
      String action = intent.getAction(); 
      if (action.equals(Intent.ACTION_CLOSE_SYSTEM_DIALOGS)) { 
       String reason = intent.getStringExtra(SYSTEM_DIALOG_REASON_KEY); 

       if (reason != null) { 
        Log.e(TAG, "action:" + action + ",reason:" + reason); 
        if (mListener != null) { 
         if (reason.equals(SYSTEM_DIALOG_REASON_HOME_KEY)) { 
          mListener.onHomePressed(); 
         } else if (reason 
           .equals(SYSTEM_DIALOG_REASON_RECENT_APPS)) { 
          mListener.onHomeLongPressed(); 

         } 
        /* else if (reason 
           .equals(SYSTEM_DIALOG_REASON_Lock)) { 
          mListener.onLockLongPressed(); 

         }*/ 

        } 
       } 
      } 
     } 
    } 
} 

Sau khi tạo lớp HomeWatcher. Bạn cần khai báo Homewatcher trên lớp mong muốn của bạn, nơi bạn muốn phát hiện nút Home và nút Recent apps.

public class MainActivity extends Activity { 

    private HomeWatcher mHomeWatcher; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     setContentView(R.layout.activity_main); 
    try { 

      mHomeWatcher = new HomeWatcher(this); 
      mHomeWatcher.setOnHomePressedListener(new OnHomePressedListener() { 
       @Override 
       public void onHomePressed() { 
        Log.e(TAG, "onHomePressed"); 


       } 
       @Override 
       public void onHomeLongPressed() { 
        Log.e(TAG, "recent apps"); 

       } 


      }); 
      mHomeWatcher.startWatch(); 
     } catch (Exception e) { 
     } 

    } 

Cuối cùng, bạn chỉ cần thêm onPause và onResume Phương thức ghi đè như thế này.

@Override 
    protected void onResume() { 
     super.onResume(); 

     try { 
      mHomeWatcher.startWatch(); 

     } catch (Exception e) { 
     } 
    } 
    @Override 
    protected void onPause() { 
     super.onPause(); 

     try { 
      mHomeWatcher.stopWatch(); 

     } catch (Exception e) { 
     } 
} 

Câu trả lời rất đơn giản và đẹp mắt. Đang đợi phiếu bầu và câu trả lời được chấp nhận: p

Các vấn đề liên quan