2010-05-01 35 views
10

Tôi phản hồi một nút nhấn trên appwidget của tôi theo phương pháp đánh lừa. Khi nút tôi nhấn, tôi muốn buộc các widget để gọi phương thức onupdate. Làm cách nào để tôi thực hiện việc này?Tiện ích con của Android để cập nhật

Cảm ơn trước!

+0

Tôi nghĩ đó là lệnh này: \t \t \t appWidgetManager.updateAppWidget (appWidgetId, lượt xem); Dù sao, làm thế nào để bạn nhận được nó để đáp ứng với một ai đó nhấp vào nó? Tôi đã hỏi trong một câu hỏi ở đây: http://stackoverflow.com/questions/2748590/clickable-widgets-in-android –

+0

xem http://stackoverflow.com/questions/2748590/clickable-widgets-in-android/2748759 # 2748759 – larham1

Trả lời

9

Tiện ích con không thể phản hồi nhấp chuột vì nó không phải là quá trình riêng biệt đang chạy. Nhưng nó có thể bắt đầu dịch vụ để xử lý lệnh của bạn:

public class TestWidget extends AppWidgetProvider { 
    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { 
     final int N = appWidgetIds.length; 

     // Perform this loop procedure for each App Widget that belongs to this provider 
     for (int i=0; i<N; i++) { 
      int appWidgetId = appWidgetIds[i]; 

      // Create an Intent to launch UpdateService 
      Intent intent = new Intent(context, UpdateService.class); 
      PendingIntent pendingIntent = PendingIntent.getService(context, 0, intent, 0); 

      // Get the layout for the App Widget and attach an on-click listener to the button 
      RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.appwidget_provider_layout); 
      views.setOnClickPendingIntent(R.id.button, pendingIntent); 

      // Tell the AppWidgetManager to perform an update on the current App Widget 
      appWidgetManager.updateAppWidget(appWidgetId, views); 
     } 
    } 

    public static class UpdateService extends Service { 
     @Override 
     public int onStartCommand(Intent intent, int flags, int startId) { 
      //process your click here 
      return START_NOT_STICKY; 
     } 
    } 
} 

Bạn cũng nên đăng ký dịch vụ mới trong file manifest của bạn:

<service android:name="com.xxx.yyy.TestWidget$UpdateService"> 

Bạn có thể tìm thấy một ví dụ về thực hiện UpdateService trong mẫu Wiktionary tiếng Việt trong SDK

Và đây là một cách tiếp cận tốt khác Clickable widgets in android

+0

Liên kết "một cách tiếp cận tốt" khác sẽ mâu thuẫn với tuyên bố ban đầu của bạn. Tiện ích con có thể phản hồi nhấp chuột mà không cần dịch vụ có liên quan bằng cách sử dụng trình xử lý onReceive với mục đích được gửi khi bạn nhấp vào mục tiện ích. Không có một dịch vụ liên quan là một giải pháp tốt hơn trong quan điểm của tôi. –

+0

onStart ngay bây giờ DEPRECATED –

3

Đây là loại thô, nhưng nó hoạt động khá tốt đối với tôi, vì tôi đã không tìm thấy cách thực hiện không chính xác để buộc cập nhật.

public class Foo extends AppWidgetManager { 
    public static Foo Widget = null; 
    public static Context context; 
    public static AppWidgetManager AWM; 
    public static int IDs[]; 

    public void onUpdate(Context context, AppWidgetManager AWM, int IDs[]) { 
     if (null == context) context = Foo.context; 
     if (null == AWM) AWM = Foo.AWM; 
     if (null == IDs) IDs = Foo.IDs; 

     Foo.Widget = this; 
     Foo.context = context; 
     Foo.AWM = AWM; 
     Foo.IDs = IDs; 
....... 
    } 
} 

Bây giờ, bất cứ nơi nào tôi muốn buộc các phụ tùng để cập nhật, nó đơn giản như:

if (null != Foo.Widget) Foo.Widget.onUpdate(null, null, null); 
+0

Nếu người dùng có hai phiên bản của các tiện ích của bạn, chỉ một phiên bản sẽ được cập nhật. –

+1

@Kernald Sau đó, bạn phải chỉ cập nhật một trong các ID trong 'IDs []'. Vòng quanh tất cả chúng. – Izkata

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