2012-11-12 52 views
17

Tôi có một số PopupWindow mà tôi muốn neo vào mục menu của thanh tác vụ nhưng dường như không thể lấy được ở mục View của mục mà tôi muốn nhấp vào. Điều này là bắt buộc đối với phương thức PopupWindowshowAsDropDown().Lấy chế độ xem từ mục menu của thanh tác vụ

Có ai biết cách đạt được điều này không?

Trả lời

35

Bạn có thể có được cái nhìn cách sử dụng menu item id, bằng cách nhận nó trong onOptionsItemSelected ..

findViewById(R.id.menu_item); 
+1

Không có điều này không làm việc Tôi đã thử rằng trước hết và nó chỉ trả về một con trỏ null. Nhưng sau đó tôi sẽ không mong đợi nó anyway như là mục trên thanh hành động là một MenuItem mà không có vẻ là một Xem. Vì vậy, tôi đang cố gắng để có được tại Xem bên trong đó MenuItem – Kyros

+0

phụ thuộc vào nơi bạn đang gọi nó, bạn nên gọi nó bên trong hoạt động để có được xem sau đó vượt qua nó để cửa sổ popup của bạn .. nó làm việc cho tôi – Nermeen

+0

Tôi đã cố gắng để tìm xem trong OnCreate, bạn đang gọi nó ở đâu? – Kyros

32

findViewById không nhất thiết phải được chạy trên onOptionsItemSelected để có được quan điểm của các mục hành động. Tuy nhiên, hãy lưu ý rằng đôi khi các mục tác vụ nằm trong trình đơn mục bổ sung để bạn có thể nhận được một giá trị thay thế.

vậy, bạn có thể làm như thế nào?

đây là một số mẫu mã:

public boolean onCreateOptionsMenu(final Menu menu) { 
    getSupportMenuInflater().inflate(R.menu.main, menu); 
    new Handler().post(new Runnable() { 
    @Override 
    public void run() { 
     final View menuItemView = findViewById(R.id.menu_action_item); 
     ... 

này đã được thử nghiệm khi sử dụng thư viện ActionBarSherlock, trên android 4.1.2 và android 2.3.5.

một giải pháp thay thế khác là sử dụng cách mở rộng hơn, được sử dụng trên showcaseView library, here.

+0

Bạn có biết cách nào tốt để làm điều đó mà không cần sử dụng bất kỳ thư viện của bên thứ ba? –

+0

có, làm như vậy mà không sử dụng ActionBarSherlock. Tôi chỉ đề cập đến nó như một cái gì đó mà tôi đã được thử nghiệm. thư viện này cho thấy, thanh hành động tự nhiên bình thường trong trường hợp phiên bản android là 3.0 trở lên. –

+8

Bằng cách sử dụng này vô xem cũng tôi nhận – ingsaurabh

-1

Mỗi nơi gọi:

activity.findViewById(R.id.menu_item); 

Nếu mã của bạn bên đoạn không sử dụng:

getView().findViewById(R.id.menu_item); 

Nó sẽ trở lại rỗng.

+0

không hoạt động. tham chiếu ger null –

1

tôi gặp vấn đề này là tốt, findViewById nên được làm việc bên cạnh tôi, đây là đoạn code mẫu:

private void setDrawable(final Menu menu) { 
    if (menu == null || menu.size() == 0) return; 

    Utils.postToUiHandler(new Runnable() { 
     @Override 
     public void run() { 
      int size = menu.size(); 
      for (int i = 0; i < size; i++) { 
       MenuItem menuItem = menu.getItem(i); 
       if (menuItem != null) { 
        View view = activity.findViewById(menuItem.getItemId()); 
        if (view != null) { 
         Drawable drawable = ThemeDrawables.get(ThemeWorker.Segment.DEFAULT).actionbarButton(); 
         if (drawable != null && view.getBackground() != drawable) { 
          int sdk = android.os.Build.VERSION.SDK_INT; 
          if (sdk < android.os.Build.VERSION_CODES.JELLY_BEAN) { 
           view.setBackgroundDrawable(drawable); 
          } else { 
           view.setBackground(drawable); 
          } 
         } 

        } 
       } 
      } 
     } 
    }); 

} 

Xin lưu ý, tôi làm findViewById trong thread UI như menuitem' xem không được thổi phồng quá các nên được chạy trong thread UI

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