2015-04-19 14 views
9

Tôi tìm kiếm rất nhiều trên mạng nhưng không có gì ngăn cản menu bật lên đóng.Cách ngăn menu bật lên đóng hộp kiểm tra

Bất cứ khi nào tôi nhấp vào mục hộp kiểm hoặc bất kỳ mục menu popup nào khác, trình đơn bật lên sẽ tự bỏ qua. Làm thế nào tôi có thể ngăn chặn nó từ bỏ khi người dùng kiểm tra/bỏ chọn hộp kiểm trong menu popup.

Tôi đang hiển thị menu bật lên trên sự kiện nhấp chuột của mục menu của mục tác vụ.

//main_menu.xml 
<menu xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:app="http://schemas.android.com/apk/res-auto" 
xmlns:tools="http://schemas.android.com/tools" 
tools:context="com.worldofjobs.woj.MainActivity" > 

<item 
    android:id="@+id/action_popUpMenu" 
    android:icon="@drawable/ic_action_overflow" 
    android:title="@string/main_action_popUpMenu" 
    app:showAsAction="always"/> 

</menu> 

//popup_items.xml 
<?xml version="1.0" encoding="utf-8"?> 
<menu xmlns:android="http://schemas.android.com/apk/res/android" > 

<item 
    android:id="@+id/refresh_item" 
    android:title="@string/main_refresh"/> 
<item 
    android:id="@+id/checkbox_item" 
    android:checkable="true" 
    android:title="Start notification"/> 
<item 
    android:id="@+id/changePasswrod_item" 
    android:title="@string/main_changePassword"/> 
<item 
    android:id="@+id/deleteAccount_item" 
    android:title="@string/main_deleteAccount"/> 
<item 
    android:id="@+id/logout_item" 
    android:title="@string/main_logout"/> 

</menu> 

/** 
* Shows popup menu on click of action bar-menu inflates from 
* menu.pop_items-xml 
*/ 
private void showPopup() { 

    try { 

     View v = findViewById(R.id.action_popUpMenu); 

     PopupMenu popup = new PopupMenu(this, v); 
     popup.setOnMenuItemClickListener(MainActivity.this); 

     MenuInflater inflater = popup.getMenuInflater(); 
     inflater.inflate(R.menu.pop_items, popup.getMenu()); 
     popup.show(); 

    } catch (Exception e) { 

     Log.e("MainActivity-showPopup:", e.toString()); 
    } 
} 

/** 
* Handles click events of popup menu items 
*/ 
@Override 
public boolean onMenuItemClick(MenuItem item) { 

    super.onMenuItemSelected(1, item); 
    switch (item.getItemId()) { 

    case R.id.refresh_item: 
     refresh(); 
     return true; 

    case R.id.checkbox_item: 
     return true; 

    case R.id.changePasswrod_item: 
     changePasswordPopup(); 
     return true; 

    case R.id.deleteAccount_item: 
     deleteAccount(); 
     return true; 

    case R.id.logout_item: 
     session.logout(); 
     finish(); 
     return true; 
    } 
    return true; 
} 
+0

Mã hộp kiểm tra ở đâu, Vui lòng đăng mã hoàn chỉnh. –

+0

Kiểm tra mã cập nhật của tôi (notification_item - checkbox_item). checkbox_item là mục menu popup có thể kiểm tra. Tôi đã không làm bất cứ điều gì được nêu ra trên đó là sự kiện click/check cho đến khi nó dừng đóng menu popup. – Sushant

+0

@ sushant- Chế độ xem giữ trong v –

Trả lời

0

Trong trường hợp của bạn R.id.checkbox_item

return false; 

này sẽ cho hệ thống mà sự kiện này vẫn chưa được handeled và nó sẽ không dimiss menu. Xem HERE

+5

Không. Nó không hoạt động. – Sushant

+0

Bạn nghe nó ở đâu để thay đổi trạng thái đã chọn? –

+0

Tôi chưa thực hiện bất kỳ điều gì về sự kiện nhấp/kiểm tra cho đến khi nó dừng đóng menu bật lên. – Sushant

0

Thử khai báo PopupMenu trên toàn cầu và gọi popup.show(); trước khi trả về true trong hàm onMenuItemClick.

5

Bí quyết ở đây là hiển thị menu ngay sau khi loại bỏ.
Dưới đây là một đoạn mã mẫu:

popupMenu.setOnMenuItemClickListener(new OnMenuItemClickListener() { 
@Override 
public boolean onMenuItemClick(MenuItem item) { 
    if(item.getItemId()==R.id.search_by_date_checkbox){ 
     item.setChecked(!item.isChecked()); 
    } 
    //This is the trick here!!!! 
    popupMenu.show(); 
    return true; 
    } 

}); 

Bạn có thể thử mẹo này với mã của bạn! Đây là cách tôi đã làm nó. :)

14

Sử dụng popupMenu.show() để ngay lập tức hiển thị lại menu bật lên không hoạt động chính xác với các mục menu có thể kiểm tra khi thay đổi trạng thái đã chọn của chúng.

Đây là phương pháp ngăn chặn đóng menu bật lên ở vị trí đầu tiên. Đảm bảo rằng onMenuItemClick trả về sai.

popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { 
    @Override 
    public boolean onMenuItemClick(MenuItem item) { 

     item.setChecked(!item.isChecked()); 

     // Do other stuff 

     // Keep the popup menu open 
     item.setShowAsAction(MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW); 
     item.setActionView(new View(context)); 
     item.setOnActionExpandListener(new MenuItem.OnActionExpandListener() { 
      @Override 
      public boolean onMenuItemActionExpand(MenuItem item) { 
       return false; 
      } 

      @Override 
      public boolean onMenuItemActionCollapse(MenuItem item) { 
       return false; 
      } 
     }); 
     return false; 
    } 
}); 
+4

Nó hoạt động ngay cả khi không setOnActionExpandListener() – SergeyA

+0

Nó đã cho tôi một lỗi nói rằng tôi cần sử dụng MenuItemCompat. Tôi có mã tinh chỉnh trong câu trả lời của tôi dưới đây (https: // stackoverflow.com/a/44296077/2423194). –

0

Làm việc đó bằng cách thêm popup.show(); trên nhấp vào nút và ở cuối nhấp chuột.

final ImageButton layerButton = (ImageButton) findViewById(R.id.layers); 
final PopupMenu popup = new PopupMenu(MapsActivity.this, layerButton); 
popup.getMenuInflater().inflate(R.menu.toolbar_menu, popup.getMenu()); 

layerButton.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 

      //Here 
      popup.show(); 

      popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { 
       @Override 
       public boolean onMenuItemClick(MenuItem item) { 

        handleClicksOnCheckBoxes(item); 

        return true; 

       } 

      }); 

      //And here 
      popup.show(); 


     } 
    }); 

Tuy nhiên, đây không phải là một giải pháp tối ưu bởi vì nếu danh sách có rất nhiều mặt hàng mà nó sẽ có thể để di chuyển danh sách, danh sách sẽ được cuộn lại đầu trang khi nhấp vào một mục.

1

Câu trả lời của Oliver ở trên (https://stackoverflow.com/a/31727213/2423194) đã cho tôi sự cố và thông báo của nó đã yêu cầu tôi sử dụng MenuItemCompat thay thế. Sau khi một số tinh chỉnh cho mã này, nó hoạt động:

// Keep the popup menu open    
item.setShowAsAction(MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW); 
item.setActionView(new View(getContext())); 
MenuItemCompat.setOnActionExpandListener(item, new MenuItemCompat.OnActionExpandListener() { 
    @Override 
    public boolean onMenuItemActionExpand(MenuItem item) { 
     return false; 
    } 

    @Override 
    public boolean onMenuItemActionCollapse(MenuItem item) { 
     return false; 
    } 
}); 

Cảm ơn Oliver!

+1

MenuItemCompat.OnActionExpandListener hiện không còn được dùng nữa. –

+0

Có, nó không được chấp nhận. Sử dụng 'item.setOnActionExpandListener' –

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