2012-04-20 117 views
4

好吧,這讓我瘋狂。我開發了一個App-widget。一切工作正常。如何從其他活動啓動Android AppWidget的配置活動?

我有一個配置活動,每次在主屏幕上添加一個小部件時都會啓動並且很漂亮。我保存每個部件ID的用戶設置等。

小部件有一些按鈕,其中一個按鈕啓動一個關於信息活動的「關於活動」。

「關於活動」有一個按鈕,我想用它來啓動啓動「關於活動」的小部件標識的配置活動。我想這樣做的原因是因爲我希望用戶能夠配置我的小部件的任何實例的內容,而不必刪除它並再次添加(以啓動配置活動)。

配置活動需要AppWidgetManager.EXTRA_APPWIDGET_ID才能完成作業(保存此特定widgetid的用戶設置),所以當我從另一個活動調用它時,我必須以某種方式傳遞此額外信息。顯而易見的想要做的是這樣的:

startActivity(new Intent(context,act_configure.class).putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, ???)); 

現在我的問題是哪裏是widgetid?我發現了一百萬種方法來獲取widgetids(數組),但沒有一個關於如何獲得啓動「關於活動」的特定widgetid的線索。

任何有關這方面的幫助都會讓我花費數小時來找到解決方案,值得一提。先謝謝你。

p.s.請原諒我的英語,因爲他們不是我的母語......

+0

那麼我應該得到一些徽章。似乎我問了最困難的android appwidgets問題... – Christos 2012-04-25 13:11:30

+0

爲什麼不把widget ID插入開始你的活動的意圖?所以關於知道id並且可以使用它來開始配置 – zapl 2012-05-01 02:13:20

+0

這正是我想要實現的,但是我找不到widget ID。它只在一個地方,在widget提供者的onUpdate方法中。所以基於這個事實和Cory Chaltron的回答,我終於成功地完成了這項工作。請在接受的答案和我的回答中查看評論。非常感謝你。 – Christos 2012-05-01 19:19:34

回答

1

你是如何設置你的小部件視圖?我有一個應用程序,用於遍歷活動窗口小部件,並在那裏配置RemoteView。您可以在附加到「關於」按鈕的onClick中設置您的小部件ID。

final AppWidgetManager widgetManager = AppWidgetManager.getInstance(this); 
final ComponentName widgetName = new ComponentName(this, WidgetProvider.class); 

final int[] widgetIds = widgetManager.getAppWidgetIds(widgetName); 

for (int widgetId : widgetIds) { 
    final RemoteViews remoteViews = new RemoteViews(getPackageName(), R.layout.widget); 

    // This is the important part :-D 
    remoteViews.findViewById(R.id.your_about_button).setOnClickListener(... a listener to start your about activity that puts the widget id in the extra like you suggest in your question ...); 

    widgetManager.updateAppWidget(widgetId, remoteViews); 
} 
+0

我接受你的答案,因爲它打開了我的眼睛,並指出我正確的方向。但是,如果用戶有多個小部件實例在運行,則必須使「Intent」唯一,才能使其工作。這就是爲什麼我張貼我的答案,以防萬一有人想要完整的解決方案。謝謝。 – Christos 2012-05-01 19:22:14

+0

RemoteViews沒有findViewById方法,並且點擊通過setOnClickPendingIntent – 2013-10-01 12:09:17

1

感謝Cory Chaltron這裏是我的問題的解決方案。

在窗口小部件提供程序onUpdate方法中,我應該創建一個「唯一」意圖傳遞給待處理意圖,以處理關於該活動的啓動。由於Android比較Intents的方式,將WidgetID傳遞給extras的功能不夠,您還應該將其作爲數據傳遞給intent以實現唯一性。所以這裏是代碼:

Intent aboutIntent = new Intent(cx, act_about.class); 
aboutIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, widgetIds[i]); 
// Make this unique for this appWidgetId 
aboutIntent.setData(Uri.withAppendedPath(Uri.parse("customuri://widget/id/"), String.valueOf(widgetID))); 
PendingIntent aboutPendingIntent = PendingIntent.getActivity(cx, 0, aboutIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK), PendingIntent.FLAG_UPDATE_CURRENT); 
views.setOnClickPendingIntent(R.id.cmdabout, aboutPendingIntent) 

雖然我回答我自己的問題,我不接受它,因爲它是基於科裏的答案。謝謝大家的幫助...

+2

或者''aboutIntent.setData(aboutIntent.toUri(Intent.URI_INTENT_SCHEME));'也可以工作(它編碼額外元素)來管理。 – Karakuri 2013-04-28 22:51:19

+0

你需要將它解析成像這樣的''aboutIntent.setData(Uri.parse(aboutIntent.toUri(Intent.URI_INTENT_SCHEME)));' – 2014-01-26 14:55:56