2010-11-01 32 views
12

Tôi có một widget, thiết lập của nó để khi tôi nhấp vào nó, nó sẽ mở ra một số cài đặt trong một hoạt động.Cập nhật Widget Android Từ Hoạt động

views.setOnClickPendingIntent(R.id.btnActivate, pendingIntent); 

Điều này định cấu hình một số cài đặt cho ứng dụng. Những gì tôi muốn đạt được là phải cập nhật tiện ích con của chế độ xem để phản ánh các cài đặt đã thay đổi khi Hoạt động tôi khởi chạy đóng. Sử dụng khoảng thời gian cập nhật hoặc bất kỳ loại bỏ phiếu nào khác không thích hợp cho việc này.

Tôi đã nhìn thấy một vài nơi đây và trong các tài liệu android mã này được sử dụng:

appWidgetManager.updateAppWidget(mAppWidgetId, views); 

Nhưng tôi không biết làm thế nào để có được những giá trị mAppWidgetId. Tôi cố gắng làm theo tấm gương cho một hoạt động cấu hình phụ tùng đây http://developer.android.com/guide/topics/appwidgets/index.html, nhưng trong đoạn mã sau,

Intent intent = getIntent(); 
Bundle extras = intent.getExtras(); 
if (extras != null) { 
    mAppWidgetId = extras.getInt(
      AppWidgetManager.EXTRA_APPWIDGET_ID, 
      AppWidgetManager.INVALID_APPWIDGET_ID); 
} 

extras luôn là null, vì vậy tôi không bao giờ có được AppWidgetID.

Ok, bây giờ tôi chỉ đang rambling. Bạn nghĩ tôi có thể làm gì?

Trả lời

17

Cuối cùng tôi đã tìm thấy câu trả lời tôi đang tìm kiếm, nó đã bị quá tải hàm updateAppWidget.

appWidgetManager.updateAppWidget(new ComponentName(this.getPackageName(), Widget.class.getName()), views); 

Điều này cho phép tôi truy cập tiện ích mà không cần phải biết appWidgetID. mã cuối cùng của tôi trong hoạt động của tôi là sau đó:

 // Create an Intent to launch ExampleActivity 
    Intent intent = new Intent(this, Settings.class); 
    PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, 0); 

    views.setOnClickPendingIntent(R.id.btnActivate, pendingIntent); 

    AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(this); 
    appWidgetManager.updateAppWidget(new ComponentName(this.getPackageName(), Widget.class.getName()), views); 
    finish(); 

tôi phải làm tất cả các công cụ thiết lập cùng tôi đã phải làm trong phương pháp onUpdate của Widget, nhưng bây giờ mỗi khi tôi thoát khỏi hoạt động của tôi các Widget được hiển thị đúng trạng thái.

+0

Cảm ơn bạn đã chia sẻ câu trả lời !!! Chúng ta phải đặt mã này ở đâu, bên trong hoạt động cài đặt tiện ích hoặc bên trong lớp tiện ích ??? – BamsBamx

+0

Nevermind, tôi đặt điều này bên trong phương thức updateWidget, thay đổi một số "này" theo "bối cảnh" và loại bỏ 'AppWidgetManager appWidgetManager = AppWidgetManager.getInstance (this)' Bây giờ nó đang làm việc ... cảm ơn! – BamsBamx

+1

Nếu bạn có nhiều cấu hình cho các tiện ích, bạn có thể muốn thử appWidgetManager.getAppWidgetIds (thành phần) và sau đó lặp lại chúng. – rwilson04

13

Có một cách khác để làm điều đó - vượt qua id phụ tùng trong mục đích cấp phát mà bạn sử dụng để bắt đầu hoạt động:

Intent clickIntent=new Intent(context, MyConfigActivity.class); 
clickIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, widgetId); 
// you have the widgetId here, since it's your onUpdate 
PendingIntent pendingIntent=PendingIntent 
     .getActivity(context, 0, 
       clickIntent, 
       PendingIntent.FLAG_UPDATE_CURRENT); 
views.setOnClickPendingIntent(R.id.btnActivate, pendingIntent); 

Hơn nữa, để tránh trùng lặp mã từ onUpdate(), bạn có thể phát sóng ý định quay lại AppWidgetProvider:

Intent intent = new Intent(this,MyAppWidgetProvider.class); 
intent.setAction("android.appwidget.action.APPWIDGET_UPDATE"); 

// Use an array and EXTRA_APPWIDGET_IDS instead of AppWidgetManager.EXTRA_APPWIDGET_ID, 
// since it seems the onUpdate() is only fired on that: 
int[] ids = {widgetId}; 
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS,ids); 
sendBroadcast(intent); 
+0

Cảm ơn bạn đã chia sẻ mã. Bây giờ tôi có thể cập nhật tiện ích từ hoạt động –

8

Tôi biết điều này đã được trả lời và chấp nhận cách đây. Tuy nhiên trong khi tôi đang tìm kiếm cùng một điều tôi đã đi qua một cách awesomely đơn giản để cập nhật các widget.

Đối với độc giả trong tương lai:

Phần tốt nhất, điều này làm việc cho tất cả các trường hợp của các phụ tùng và từ bất kỳ ngữ cảnh (Hoạt động, dịch vụ vv)

Heres mã,

Context context = this; 
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context); 
RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget_2x1); 
ComponentName thisWidget = new ComponentName(context, MyWidget.class); 
remoteViews.setTextViewText(R.id.my_text_view, "myText" + System.currentTimeMillis()); 
appWidgetManager.updateAppWidget(thisWidget, remoteViews); 

Courtesy - Stuck :)

+1

Điều này !! Tôi đã chiến đấu với lứa tuổi với cố gắng để có được một TextView trên một widget cập nhật, và điều này giải quyết nó. Cảm ơn bạn!! :) – wislon

+0

Chào mừng bạn nhất. Đó là niềm vinh hạnh cho tôi. Happy Coding. :) –

+0

Điều này làm việc cho tôi ... Cảm ơn bạn thân :) – user1090751

1

Thay vì thực hiện cuộc gọi từ hoạt động của bạn, tôi đặt trước để gửi yêu cầu truyền rộng tới tiện ích con để cập nhật. Phương thức onUpdate sẽ được kích hoạt và tất cả các bố trí widget sẽ được thông qua.

Đây là mã của tôi dưới đây:

1- gửi cast rộng từ hoạt động:

Intent intent = new Intent(ctxt, MyAppWidgetProvider.class); 
intent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE); 

int[] ids = {R.layout.appwidget}; 
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS,ids); 
ctxt.sendBroadcast(intent); 

và bây giờ, 2- thực hiện các phương pháp onUpdate:

Intent i = new Intent(ctxt, Settings.class); 
PendingIntent pi = PendingIntent.getActivity(ctxt, 0, i, 0); 

for (int widgetId : allWidgetIds) { 
    RemoteViews remoteViews = new RemoteViews(ctxt.getPackageName(), widgetId); 
    remoteViews.setTextViewText(R.id.statusMsg, msg); 
    remoteViews.setOnClickPendingIntent(R.id.rootView, pi); 
    AppWidgetManager mngr = AppWidgetManager.getInstance(ctxt); 
    ComponentName wdgt = new ComponentName(ctxt, MyAppWidgetProvider.class); 
    mngr.updateAppWidget(wdgt, remoteViews); 
} 

Đó là nó ! Tôi ước nó giúp bạn :)

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