2012-05-10 21 views
6

Thay đổi cấu hình thiết bị Android (ví dụ: "trượt bàn phím cứng trở lại") sẽ luôn gọi PhoneWindow.onConfigurationChanged(), do đó, sẽ gọi số reopenMenu(). Điều này sẽ làm cho menu của hoạt động hiện đang chạy được mở lại, trong trường hợp nó đang hiển thị.Làm cách nào để kiểm tra theo chương trình nếu trình đơn hoạt động của tôi hiển thị tại một thời điểm cụ thể?

Tôi có một khóa trên menu của mình được thực hiện trong ghi đè onPrepareOptionsMenu(). Người dùng phải nhập mã mỗi lần họ muốn xem trình đơn. Tôi không muốn người dùng được yêu cầu nhập lại mã, trong khi trình đơn vẫn chỉ vì thay đổi cấu hình. Vì vậy, tôi muốn biết, có cách nào tôi có thể kiểm tra xem trình đơn của hoạt động tiền cảnh hiện tại đã được hiển thị? Biết được điều này, tôi có thể bỏ qua yêu cầu mã truy cập nếu menu đã hết.

Triển khai giải pháp tùy chỉnh của tôi là sử dụng cờ của riêng tôi menuShowing, mà tôi đặt trong onPrepareOptionsMenu và đặt lại trong onOptionsItemSelected và trong onKeyDown nếu nút quay lại được nhấp.

EDIT: Có vẻ như thay đổi cấu hình định hướng màn hình không kích hoạt hành vi này. Tuy nhiên, một phím trượt bàn phím cứng.

+1

Sau nhiều nỗ lực của tôi, tôi nghĩ rằng cách tiếp cận tùy chỉnh boolean của bạn là tốt nhất. Bạn có thể đơn giản hóa nó với 'onPrepareOptionsMenu()': true và 'onOptionsMenuClosed()': false (vì điều này sẽ được gọi bằng cách chọn một mục hoặc nhấn một phím cứng: back, home, menu). FYI, bạn có thể hỗ trợ một loại trượt bàn phím cứng trong trình giả lập bằng cách đặt các thuộc tính phần cứng để không có bàn phím cứng trong ảnh chân dung và có một bàn phím ở chế độ ngang, điều đó sẽ hữu ích. – Sam

Trả lời

2

Cho đến khi một người nào đó đi lên với câu trả lời một đẹp hơn 'một cuộc gọi, đây là việc thực hiện tùy chỉnh cách giải quyết mà tôi đề cập đến trong câu hỏi, với sự giúp đỡ từ lời khuyên của Sam, trong trường hợp ai đó cần các chức năng tương tự:

@Override 
public boolean onPrepareOptionsMenu(Menu menu) { 
    if (showingMenu) { 
     // The menu button was clicked or the hard keyboard was 
     // slid open/closed while the menu was already showing 
     return true; 
    } 
    // Otherwise, either the menu was clicked or openOptionsMenu() was called 
    if (codeEntered) { 
     // Code was entered and then openOptionsMenu() was called 
     showingMenu = true; 
     // Menu will now be shown 
     return true; 
    } else { 
     // The menu button was clicked, ask for code 
     askForCode(); 
     // Don't show menu yet 
     return false; 
    } 
}  

@Override 
public void onOptionsMenuClosed(Menu menu) { 
    showingMenu = false; 
    codeEntered = false; 
} 

private void askForCode() { 
    codeEntered = getUserInput(); 
    if (codeEntered) 
     openOptionsMenu(); 
} 

getUserInput() thực sự xảy ra với sự trợ giúp của một số AlertDialogEditText có kèm theo TextWatcher nhưng chi tiết triển khai vượt quá phạm vi của câu hỏi này, trừ khi ai đó quan tâm.

0

Trong trường hợp của tôi Nó rất

@Override 
    public void onPanelClosed(int featureId, Menu menu) { 
    showingMenu = false; 
    super.onPanelClosed(featureId, menu); 
} 
Các vấn đề liên quan