2011-12-23 31 views
39

Tôi định sử dụng mẫu UI hành động nhanh trong ứng dụng của mình. Android Quick Actions UI Pattern. Cửa sổ hành động nhanh cần có chế độ xem trục xoay để tuân theo.Android: Xem tham chiếu đến một mục menu

quickAction.show(View pivotView); 

Tôi định sử dụng tác vụ nhanh cho menu Mục, tôi có thể truy cập vào mục được nhấp. Nhưng vấn đề là tôi cần phải tham khảo một cái nhìn từ mục trình đơn để tôi có thể vượt qua nó để hành động nhanh chóng.

Làm cách nào tôi có thể tham chiếu đến chế độ xem trong menuItem được chọn.

+0

http://www.londatiga.net/it/how-to-create-quickaction-dialog-in-android/ bạn đã sử dụng liên kết này chưa .. –

+0

Liên kết @NikhilreddyGujjula hiện không hoạt động. –

+0

dài trở lại tôi đã thử nó đã làm việc cho tôi nhưng tôi không có mã cho tôi sry .. –

Trả lời

76

Bạn có thể đạt được điều này bằng cách cung cấp mục menu của bạn với thuộc tính actionViewClass trong xml và sau đó bạn sẽ có thể nhận được chế độ xem trục chính mà bạn muốn. Mã này sẽ là một cái gì đó như thế này

<item 
    android:id="@+id/menu_find" 
    android:showAsAction="ifRoom" 
    android:actionViewClass="android.widget.ImageButton" 
    /> 

Trong OnCreateOptionsMenu bạn làm điều này

public boolean onCreateOptionsMenu(Menu menu) { 
    super.onCreateOptionsMenu(menu); 
    getMenuInflater().inflate(R.menu.menu_search, menu); 
    locButton = (ImageButton) menu.findItem(R.id.menu_find).getActionView(); 
    locButton.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 
      createPopup(); 
      mQuickAction.show(v); 
     } 
    }); 
    return true; 
} 
+0

Cảm ơn bạn rất nhiều! Tôi đã có một vấn đề lạ, nơi kính ngắm sẽ tìm thấy một spiner trong actionbar khi trên android 4.1 nhưng trên 4.2 nó chỉ trả về null, điều này cố định nó. – PSIXO

+0

setOnMenuItemClickListener sẽ hữu ích cho tôi, trong trường hợp bạn muốn thực hiện thao tác trực tiếp với Menu Item – AnkitRox

+11

, hãy sử dụng ứng dụng: actionViewClass nếu bạn sử dụng thư viện gần đây. (Res-auto) –

28

Cũ câu hỏi, nhưng tôi chạy vào một số vấn đề với các thuộc tính actionViewClass. Đối với bất kỳ ai gặp phải vấn đề này sau ...

Gọi findViewById(R.id.mnu_item) trong onOptionsItemSelected sẽ trả về số View.

QuickActions trên MenuItems không phải là thiết kế tốt, nhưng tôi nhận thấy rằng đó là cách đơn giản nhất để triển khai menu con với nền tùy chỉnh.

+0

Tôi đoán bạn sẽ cần phải bấm vào 'menuItem' ít nhất một lần trước khi bạn có thể nhận được 'menuItem' 'xem' neo. – Leebeedev

+0

Phải, lệnh 'findViewById()' sẽ phải được thực hiện tại thời gian chạy – loadedion

+0

Cảm ơn câu trả lời @ASH thất bại nếu chúng ta đặt actionViewClass. Điều này đang làm việc tuyệt vời. – iabhi

1

Bản cập nhật cho bất kỳ ai muốn tìm mục trình đơn xem vì các lý do khác (như tôi muốn).

Nếu bạn có quyền truy cập và sử dụng Thanh công cụ của AppCompat thì có một cách. Đây không phải là cách hiệu quả nhất, nhưng đó là cách dễ dàng nhất mà tôi đã tìm thấy để truy cập chế độ xem của mục menu.

public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { 
    Toolbar toolbar = (Toolbar) view.findViewById(R.id.toolbar); 

    // Find Menu 
    for (int toolbarChildIndex = 0; toolbarChildIndex < toolbar.getChildCount(); toolbarChildIndex++) { 
     View view = toolbar.getChildAt(toolbarChildIndex); 

     // Found Menu 
     if (view instanceof ActionMenuView) { 
      ActionMenuView menuView = (ActionMenuView) view; 

      // All menu items 
      for (int menuChildIndex = 0; menuChildIndex < menuView.getChildCount(); menuChildIndex++) { 
       ActionMenuItemView itemView = (ActionMenuItemView) menuView.getChildAt(menuChildIndex); 
       // Do something to itemView... 
      } 
     } 
    } 
} 
1

trong lớp hoạt động chính, tốt nhất để ghi đè phương thức onOptionsItemSelected (...); nên một cái gì đó như sau:

public boolean onOptionsItemSelected(MenuItem item) { 
    // the id is of type int 
    int someId = item.getItemId(); 
    // can use an if() or switch() statement to check if id is selected 
    //a Toast message can be used to show item is selected 
} 
1

Inorder để được tham khảo Quan điểm của các mục menu chúng ta cần phải làm điều này,

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.section, menu); 

    new Handler().post(new Runnable() { 
     @Override 
     public void run() { 

      final View menuItemView = findViewById(R.id.action_preview); 
      // SOME OF YOUR TASK AFTER GETTING VIEW REFERENCE 

     } 
    }); 


    return true; 
} 
0

Bạn có thể lấy tham chiếu đến mục menu như thế này:

MenuItem btnFavorites = menu.findItem(R.id.action_favorite); 

Và sau đó làm bất cứ điều gì bạn muốn với nó. Ví dụ. thay đổi biểu tượng như sau:

btnFavorites.setIcon(R.drawable.ic_favorite_false); 
1

Bên trong onOptionsItemChọn chỉ đơn giản là có chế độ xem bằng cách sử dụng id.

Xem menuItemView = findViewById (R.id.action_sort);

bây giờ bạn có thể sử dụng chế độ xem này theo yêu cầu của bạn.

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