2012-07-07 66 views
10

Tôi đã thêm một spinner để ActionBar của tôi bằng cách sử dụng tùy chọn thứ hai từ câu trả lời here.Thêm spinner để ActionBar (không Navigation

Làm thế nào để tôi thêm một adapter spinner đến spinner? Tôi cố gắng sử dụng một đối tượng Spinner như Google mô tả here nhưng nhận được một đối tượng Spinner null

Bất kỳ ai biết cách thực hiện điều này? Tôi không muốn spinner nằm trong vùng điều hướng của thanh tác vụ nhưng với các mục tác vụ khác (tôi đang sử dụng phần tách thanh hành động)

Cảm ơn sự giúp đỡ!

Trả lời

6

Vâng, tôi đã bỏ ý tưởng Spinner để sử dụng menu phụ. Tôi nhận ra rằng chiếc máy quay được chọn để chọn những thứ đã chọn; menu con ghép nối để trở thành giao diện người dùng tốt hơn.

Cảm ơn mọi thứ.

P.S. Tôi mới ở đây. Nếu trả lời câu hỏi của tôi là gây phiền nhiễu cho cộng đồng, hãy cho tôi biết. Tôi muốn trở thành một công dân tốt. Tôi đã nhận được rất nhiều sự giúp đỡ từ tất cả các bạn rồi.

15

Tôi biết bạn đã bỏ spinner, nhưng tôi sẽ đưa ra một số gợi ý ở đây trong trường hợp người khác là có cùng một vấn đề hoặc bạn đến để phát triển cùng một khuôn mẫu trong một ứng dụng khác nhau

  • Nếu bạn đã vô là vì bạn không chỉ định đúng ID. Kiểm tra kỹ ID.
  • trên các liên kết mà bạn đã hiển thị trên các nội dung phức tạp bằng cách chỉ định actionLayout chỉ là một spinner, bạn chỉ có thể chỉ định actionViewClass = "android.widget.Spinner" sẽ thực hiện thủ thuật.
  • sau đó trong OnCreateOptionsMenu bạn làm:

    inflater.inflate(R.menu.my_menu, menu); // inflate the menu 
    Spinner s = (Spinner) menu.findItem(R.id.my_menu_spinner).getActionView(); // find the spinner 
    SpinnerAdapter mSpinnerAdapter = ArrayAdapter.createFromResource(getActivity().getActionBar() 
         .getThemedContext(), R.array.my_menu_spinner_list, android.R.layout.simple_spinner_dropdown_item); // create the adapter from a StringArray 
    s.setAdapter(mSpinnerAdapter); // set the adapter 
    s.setOnItemSelectedListener(myChangeListener); // (optional) reference to a OnItemSelectedListener, that you can use to perform actions based on user selection 
    

hạnh phúc mã hóa ...

+0

Bất kỳ ý tưởng nào về cách này sẽ hoạt động đối với bộ điều hợp tùy chỉnh? Tôi đang sử dụng một hình ảnh thay vì từ văn bản để hiển thị trong Spinner, do đó, dòng 'SpinnerAdapter mSpinnerAdapter = ArrayAdapter.createFromResource (getActivity(). GetActionBar() .getThemedContext(), R.array.my_menu_spinner_list, android.R. layout.simple_spinner_dropdown_item); 'phải khác nhau đối với bộ điều hợp tùy chỉnh. Không thể hiểu được làm thế nào. – Azurespot

+0

chỉ cần gọi bất kỳ hàm tạo nào bạn có trên bộ điều hợp tùy chỉnh của mình. 'SpinnerAdapter mSpinnerAdapter = new MyCustomAdapter()' – Budius

+0

Cảm ơn Budius, tôi đã làm điều đó, nhưng vì một lý do nào đó, trình đơn thả xuống không xảy ra. Tôi nhận ra rằng vì 'android.R.layout.simple_spinner_dropdown_item' bị thiếu trong bộ điều hợp tùy chỉnh của tôi (vì nó sử dụng một hàng Spinner như ImageView, một nơi mà mảng drawables đi vào). Nhưng không chắc đó có phải là vấn đề không. Nếu bạn muốn kiểm tra mã của tôi: http://stackoverflow.com/questions/30433501/custom-spinner-not-showing-dropdown-in-actionbar-icon Câu hỏi vẫn chưa được trả lời. Cảm ơn. – Azurespot

27

Tôi biết đây là một câu hỏi cũ, nhưng chỉ trong trường hợp một người nào đó tình cờ trên đó (như tôi đã làm) và vẫn tìm kiếm một câu trả lời hoàn chỉnh, đây là cách để làm điều đó bằng cách sử dụng thư viện tương thích, để nó hoạt động từ v7 (Android 2.1 Eclair) đến v19 hiện tại (Android 4.4 KitKat):

Trong menu_layout.xml:

<menu xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:yourapp="http://schemas.android.com/apk/res-auto" > 

    <item android:id="@+id/spinner" 
    yourapp:showAsAction="ifRoom" 
    yourapp:actionViewClass="android.widget.Spinner" /> 
</menu> 

Sử dụng http://schemas.android.com/apk/res-auto namespace aliased như yourapp phép bạn sử dụng các thuộc tính showAsAction và actionViewClass không tồn tại trên các phiên bản cũ của Android.

Sau đó trong mã hoạt động của bạn:

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    getMenuInflater().inflate(R.menu.menu_layout, menu); 
    MenuItem item = menu.findItem(R.id.spinner); 
    Spinner spinner = (Spinner) MenuItemCompat.getActionView(item); 
    spinner.setAdapter(adapter); // set the adapter to provide layout of rows and content 
    spinner.setOnItemSelectedListener(onItemSelectedListener); // set the listener, to perform actions based on item selection 

Et thì đấy!

+1

Nếu bạn không muốn lo lắng về các phiên bản cũ thì không gian tên yourapp là không cần thiết, bạn có thể làm việc với không gian tên Android. Ngoài ra, điều này hoạt động hoàn toàn tốt với CursorLoaders. – lalitm

+0

Vì hiện tại Android 2.3.3 (API v10) vẫn chiếm ~ 18% thị trường Android (xem [Trang tổng quan Android] (http://developer.android.com/about/dashboards/index.html) cho hiện tại số), tôi nghĩ rằng điều quan trọng là cung cấp câu trả lời tương thích. Nhưng bạn đúng là không gian tên android là đủ nếu sdk mục tiêu tối thiểu của ứng dụng của bạn ở trên Android 3.0 (API v11). –

+0

@lalitm nếu bạn nhận thấy, nó dành cho thư viện tương thích. Chắc chắn cần thiết nếu bạn đang hướng đến BC. – frostymarvelous

-2
inflater.inflate(R.menu.my_menu, menu); // inflate the menu 

Spinner s = (Spinner) menu.findItem(R.id.my_menu_spinner).getActionView();  // find the spinner 
SpinnerAdapter mSpinnerAdapter = ArrayAdapter.createFromResource(getActivity().getActionBar() .getThemedContext(), R.array.my_menu_spinner_list, android.R.layout.simple_spinner_dropdown_item); // create the adapter from a StringArray 
s.setAdapter(mSpinnerAdapter); // set the adapter 
s.setOnItemSelectedListener(myChangeListener); // (optional) reference to a OnItemSelectedListener, that you can use to perform actions based on user selection 
Các vấn đề liên quan