2012-03-30 59 views
5

Tôi đang cố triển khai nút làm mới trong ứng dụng của mình để cho phép người dùng tự đồng bộ hóa lại với máy chủ web. Mã hoạt động, nhưng tôi đang gặp khó khăn trong việc tìm ra các khung nhìn hành động (ít nhất, tôi nghĩ đó là những gì tôi cho là đang sử dụng).Thay đổi chế độ xem trên Menu Mục trong Thanh tác vụ

mục trình đơn của tôi là ở đây:

<item 
    android:id="@+id/main_menu_refresh" 
    android:enabled="true" 
    android:icon="@drawable/refresh" 
    android:orderInCategory="1" 
    android:showAsAction="ifRoom" 
    android:title="@string/refresh" 
    android:actionViewClass="android.widget.ProgressBar"> 
</item> 

Vấn đề là, nó luôn luôn hiển thị ProgressBar. Tôi tự hỏi liệu nó có hoạt động giống như tiện ích tìm kiếm (ví dụ duy nhất tôi thực sự thấy trực tuyến) và thêm thẻ collapseActionView vào số showAsAction và ngăn không cho nó hiển thị ngay lập tức. Tuy nhiên, khi tôi nhấp vào nút làm mới, biểu tượng sẽ biến mất (tốt), nhưng tiêu đề cũng vậy trong thanh tác vụ và ProgressBar xuất hiện ở bên trái của cửa sổ có tiêu đề được sử dụng. Cũng không phải những gì tôi muốn.

Như một cái gì đó của một nỗ lực cuối cùng, tôi đã cố gắng để thêm video này vào mã của tôi, và loại bỏ các actionViewClass từ XML:

MenuItem refresh = (MenuItem)findViewById(R.id.main_menu_refresh); 
Log.w("MyApp", "Have Menu"); 
ProgressBar pb = new ProgressBar(ReadingList.this); 
refresh.setActionView(pb); 

đó không làm việc, hoặc, đem lại cho tôi một lỗi con trỏ null trên setActionView.

Tôi cần một giải pháp mà tôi có thể gọi từ bất kỳ chức năng nào (có một khoảng thời gian tự động đồng bộ lúc đầu tôi muốn ProgressBar hiển thị trong thời gian), và có thể trả về biểu tượng tĩnh sau đó.

Tôi đã thử đọc qua this question, nhưng tôi không hiểu được câu trả lời có ý nghĩa gì. Tôi cảm thấy như tôi đang cố gắng làm những gì nó nói, nhưng tôi đoán là không. Bất kỳ hỗ trợ nào được đánh giá cao.

Chỉnh sửa: Đối với đề xuất của sastraxi.

public class IconSwitcher extends LinearLayout{ 



public IconSwitcher(Context context) { 
    super(context); 

    ProgressBar pb = new ProgressBar(context); 
    ImageView iv = new ImageView(context); 

    addView(iv); 
    addView(pb); 
} 
} 

Đây là lớp học của tôi cho đến nay. Tuy nhiên, khi tôi thử và tham khảo nó với:

MenuItem refresh = (MenuItem)findViewById(R.id.main_menu_refresh); 
IconSwitcher ic = (IconSwitcher) refresh.getActionView(); 

Tôi gặp lỗi con trỏ null. về cách tạo IconSwitcher. Nút XML như sau:

<item 
    android:id="@+id/main_menu_refresh" 
    android:enabled="true" 
    android:icon="@drawable/refresh" 
    android:orderInCategory="1" 
    android:showAsAction="ifRoom" 
    android:title="@string/refresh" 
    android:actionViewClass="IconSwitcher"> 
</item> 

Tôi chỉ gặp khó khăn khi tham khảo Chế độ xem IconSwitcher đó.

Chỉnh sửa 2: Tôi hết sức gặp sự cố khi tham khảo Mục trình đơn.

MenuItem refresh = (MenuItem)findViewById(R.id.main_menu_refresh); 
refresh.setVisible(false); 

Cũng cung cấp cho tôi con trỏ rỗng khi tôi thử và đặt chế độ hiển thị. Có gì sai với tài liệu tham khảo của tôi?

+0

Đây không phải là lỗi tại setActionXem nhưng tại thời điểm bạn đang làm (MenuItem) findViewById (R.id.main_menu_refresh). Nó rõ ràng là một ClassCastException để cast ActionItemView đến MenuItem. – Namratha

+0

Tôi đã tìm ra. Tôi đã tìm thấy câu hỏi trước đây [SO] (http://stackoverflow.com/questions/7142722/replacing-an-actionbar-menu-item-icon-with-an-indeterminate-progressbar). Từ đó, tôi đã tìm thấy mã Google đã viết về việc này [ở đây] (http://developer.android.com/resources/samples/ActionBarCompat/src/com/example/android/actionbarcompat/ActionBarHelperHoneycomb.html). Về cơ bản nó đã được sao chép và dán vào thời điểm đó, và hoạt động hoàn hảo. –

Trả lời

0

Thay vì đặt lớp xem hành động của bạn đến một ProgressBar, đặt nó vào một lớp tùy chỉnh LinearLayout, như vậy:

class MyViewItem extends LinearLayout 

Thêm một ProgressBar và một ImageView như trẻ em trong constructor của nó với addView, và thiết lập các độ linh hoạt của trẻ em là GONE hoặc VISIBLE khi mã của bạn yêu cầu.

+0

Tôi không hiểu. Bạn có thể cho tôi biết thêm một chút chi tiết về lớp tùy chỉnh này không? Tôi đã thêm vào bài đăng chính để hiển thị những gì tôi đang gặp phải. –

+0

Bạn cần phải sử dụng tên đủ điều kiện trong XML, ví dụ: 'com.mydomain.mypackage.IconSwitcher', thay vì chỉ' IconSwitcher'. Hãy thử điều đó, xem mọi thứ có bắt đầu hoạt động không. – sastraxi

+0

Không, tôi vẫn có lỗi con trỏ null. Nó cũng chắc chắn là trên dòng 'iconSwitcher ic = (IconSwitcher) refresh.getActionView();'. Nếu tôi nhận xét rằng dòng ra, tôi không nhận được bất kỳ lỗi nào, nhưng tôi rõ ràng là không nhận được một nút năng động, chỉ cần biểu tượng tĩnh. Tôi có cần phải khai báo IconSwitcher trong tệp kê khai theo bất kỳ cách nào không? –

0

Cố gắng sử dụng:

<item 
    android:id="@+id/main_menu_refresh" 
    android:enabled="true" 
    android:icon="@drawable/refresh" 
    android:orderInCategory="1" 
    android:title="@string/refresh" 
    app:showAsAction="ifRoom" 
    app:actionViewClass="android.widget.ProgressBar"> 
</item> 

Chú giải này hai dòng:

app:showAsAction="ifRoom" 
    app:actionViewClass="android.widget.ProgressBar" 
0

Bạn có cố gắng lấy mục trình đơn của bạn như thế này?

MenuItem item = getToolbar().getMenu().findItem(Menu.FIRST); 
Các vấn đề liên quan