2012-03-30 41 views
5

Tôi có một appwidget thực sự đơn giản (hai chế độ xem văn bản và một nút). Tôi đã thử nghiệm nó trên một Touchpad, Droid 1, và một Droid Razr. Nó hoạt động trên mọi thứ ngoại trừ Razr. Khi tôi thêm tiện ích vào màn hình chính, nó không hiển thị; nó chỉ là vô hình. Nếu tôi giữ vị trí nơi nó sẽ là nó chọn một widget và nếu tôi di chuyển nó xung quanh tôi thấy các vật dụng khác di chuyển ra khỏi con đường nhưng nó hoàn toàn vô hình.Android AppWidget không hiển thị trên một số điện thoại

Tôi đặt một số bánh mì nướng trong các phương pháp onReceiveonEnabledToast hiển thị tất cả thông tin phù hợp (ví dụ: hành động ý định và tính năng bổ sung).

Bất kỳ ai có kinh nghiệm với điều này?

EDIT: Hãy ghi nhớ điều này chỉ để gỡ lỗi và không làm theo thông lệ tốt nhất

public class GoogleTalkWidget extends AppWidgetProvider { 

    Button sendMessage; 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     Toast.makeText(context, "Received Intent Action = " + 
       intent.getAction(), Toast.LENGTH_SHORT).show(); 

     if(intent.getAction().equals(Utils.RECEIVED_MESSAGE_WIDGET)){ 
      RemoteViews views = new RemoteViews(context.getPackageName(), 
       R.layout.main_widget); 

      views.setTextViewText(R.id.widget_message, 
       (CharSequence)intent.getStringExtra("MESSAGE")); 

      views.setTextViewText(R.id.widget_sender, 
       (CharSequence)intent.getStringExtra("SENDER")); 

      Toast.makeText(context, "Received " + 
       intent.getStringExtra("MESSAGE") + " FROM " + 
       intent.getStringExtra("SENDER"), Toast.LENGTH_SHORT).show(); 

      ComponentName cn = new ComponentName(context, 
       GoogleTalkWidget.class); 

      AppWidgetManager.getInstance(context).updateAppWidget(cn, views); 

     } 
     super.onReceive(context, intent); 
    } 

    @Override 
    public void onEnabled(final Context context){ 
     super.onEnabled(context); 

     Toast.makeText(context, "Enabled", Toast.LENGTH_SHORT).show(); 
    } 

} 
+0

'onReceive()'? Bạn có nghĩa là 'onUpdate()' của 'AppWidgetProvider' của bạn? – CommonsWare

+0

bạn cũng có thể ghi đè lên phương thức 'onReceive()' trong appwidget ... Tôi nghĩ rằng họ đã để nó trong vì các phiên bản trước của Android có một số vấn đề với 'onDelete' – Eliezer

+0

Tôi hiểu điều đó. Tuy nhiên, 'onUpdate()' thường là nơi bạn sẽ cung cấp 'RemoteViews' để khai báo những gì nên đi trong widget ứng dụng. Có phải 'onUpdate()' đang được gọi và bạn có cung cấp thành công 'RemoteViews' không? Có điều gì trong LogCat có thể liên quan (ví dụ: dấu vết ngăn xếp) không? – CommonsWare

Trả lời

1

Điều tốt nhất tôi có thể nghĩ đến (phải không có lỗi hoặc sự cố khác với launcher của Razr) là tài nguyên của bạn không được cấu hình đúng. Có lẽ Razr có mật độ dpi khác nhau và không có nguồn lực cho mật độ đó trong dự án của bạn.

Hãy thử ví dụ để di chuyển tất cả các mục đích tạo nên tiện ích của bạn vào thư mục res \ drawable-nodpi và xem cách thức hoạt động.

EDIT: tôi thấy cái gì lạ trong mã của bạn

Trong phương pháp onReceive lớp GoogleTalkWidget của bạn, widget của bạn chỉ được cập nhật khi thông điệp Utils.RECEIVED_MESSAGE_WIDGET nhận được. Tôi không biết thông điệp này là gì nhưng một widget ứng dụng, lần đầu tiên được thêm vào màn hình chính, nó nhận được android.appwidget.action.APPWIDGET_UPDATE và bất kỳ bộ lọc ý định nào khác được đăng ký trong tệp kê khai và chúng được phát sóng bởi hệ thống tại thời điểm đó (và các ý tưởng phát sóng dính của khóa học).

Nếu tôi ở vị trí của bạn tôi sẽ thay đổi phương pháp onReceive như sau:

@Override 
public void onReceive(Context context, Intent intent) { 
    Toast.makeText(context, "Received Intent Action = " + 
      intent.getAction(), Toast.LENGTH_SHORT).show(); 
    super.onReceive(context, intent); 

    String msg = "No messages yet"; 

    RemoteViews views = new RemoteViews(context.getPackageName(), 
      R.layout.main_widget); 

    if(intent.getAction().equals(Utils.RECEIVED_MESSAGE_WIDGET)){ 
     msg = intent.getStringExtra("MESSAGE"); 

     views.setTextViewText(R.id.widget_sender, 
      (CharSequence)intent.getStringExtra("SENDER")); 

     Toast.makeText(context, "Received " + 
      intent.getStringExtra("MESSAGE") + " FROM " + 
      intent.getStringExtra("SENDER"), Toast.LENGTH_SHORT).show(); 

     ComponentName cn = new ComponentName(context, 
      GoogleTalkWidget.class); 
    } 

    views.setTextViewText(R.id.widget_message, msg); 

    AppWidgetManager.getInstance(context).updateAppWidget(cn, views); 
} 

và xem những gì sẽ xảy ra.

Nếu tiện ích của bạn không xuất hiện thì đó có thể là vấn đề với Razr nhưng điều này không giống vì tôi cho rằng toàn bộ các tiện ích khác hoạt động tốt.

Hơn nữa, mặc dù mã của bạn chỉ dành cho gỡ lỗi, cách tiếp cận của bạn hơi có vấn đề. Nơi tốt nhất để cập nhật chế độ xem tiện ích của bạn là trong phương thức onUpdate của AppWidgetProvider chứ không phải trong onReceive. Android cung cấp phương thức onUpdate cho mục đích đó và onReceive để thông báo cho bạn rằng một chương trình phát sóng đã đăng ký đã đến. Sự khác biệt cơ bản là trong phương thức onUpdate, Android đã trích xuất tất cả các tham số cần thiết cho bạn từ các tính năng bổ sung Intent đã nhận. Một điều nữa về cập nhật widget là bạn nên cung cấp giá trị android: updatePeriodMillis ngoài 0 (2100000 là một giá trị tốt) trong tệp xml widget của bạn ngay cả khi bạn không muốn cập nhật định kỳ cho tiện ích của mình. Tôi thấy ở đâu đó rằng phương pháp onReceive có thể không được gọi nếu giá trị này là 0.

Xin lưu ý rằng AppWidgetProvider là một Broadcast Receiver chỉ tồn tại miễn là phương thức onReceive thực hiện công việc của nó, sau khi nó bị phá hủy. không phải là một nơi tốt cho mã "tương tác" như người nghe UI vv Tôi đang nói với bạn điều này bởi vì bạn có một nút khai báo (Button sendMessage;) ở đầu lớp GoogleTalkWidget của bạn.

Hy vọng điều này sẽ giúp ...

+0

Ngay bây giờ tôi chỉ đang cố gắng để làm cho nó hoạt động như vậy xương rất trần của nó .. .no drawables hoặc bất cứ điều gì như thế .... chỉ là một textview và nút – Eliezer

+0

@Eliezer Xem câu trả lời đã chỉnh sửa của tôi ... – Christos

+0

Đối với nội dung của 'onReceive' tôi chưa cập nhật bài đăng này vì tôi đã quên nó và tiếp tục khi tôi vẫn không thể giải quyết vấn đề. Vì tôi đã đăng câu hỏi tôi đã thử lấy các phần mã cho đến khi tôi chỉ có một 'onUpdate' được gọi là' super' và đó là nó; vẫn không hoạt động. Đối với 'onUpdate' vs' onReceive' tôi đã không thực sự cho nó nhiều suy nghĩ kể từ khi dự án này đã đi trên backburner do vấn đề này với Razr nhưng đầu vào của bạn được đánh giá cao! – Eliezer

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