गतिविधि / सेवा / रिसीवर से प्रोग्रामेटिक रूप से विजेट अपडेट करें


97

मुझे पता है कि यह संभव है, लेकिन मैं मुख्य गतिविधि से अपने विजेट के अपडेट को ट्रिगर करने का तरीका नहीं समझ सकता। क्या कुछ सामान्य इरादे नहीं हैं जिन्हें मैं प्रसारित कर सकता हूं?

जवाबों:


191

यदि आप एक का उपयोग कर रहे हैंAppWidgetProvider , तो आप इसे इस तरह से अपडेट कर सकते हैं:

Intent intent = new Intent(this, MyAppWidgetProvider.class);
intent.setAction(AppWidgetManager.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 = AppWidgetManager.getInstance(getApplication())
    .getAppWidgetI‌​ds(new ComponentName(getApplication(), MyAppWidgetProvider.class));
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, ids);
sendBroadcast(intent);

30
आप कहां सेट करते हैं widgetId?
क्रिश बी

38
नीचे दिए गए उत्तर से @KrisB, यह करके सरणी प्राप्त करें: int ids [] = AppWidgetManager.getInstance (getApplication ())। GetAppWidgetIds (नया घटक नाम (getApplication) (, WidgetProvider.class));
MobileMon

11
आप एक निरंतर का उपयोग कर सकते हैं, हार्डकोड की कोई आवश्यकता नहीं है:intent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE);
मैरटिज़ ब्राइडिस

3
विजेट के लिए R.xml.mywidget का उपयोग करने के लिए @gelupa टिप्पणी का पालन न करें! यह पूरी तरह से गलत है और सिर्फ मुझे डिबगिंग के 4hours लागत !!! सही विजेट प्राप्त करने के लिए USE MobileMon समाधान
Ilja S.

5
आईडी के लिए: `int widgetIDs [] = AppWidgetManager.getInstance (activity) .getAppWidgetIds (नया ComponentName (गतिविधि,
widget.class

75

जब मैंने किसी सेवा / या क्रिया से विजेट को अपडेट करने का तरीका खोजा तो यह मदद मिली (लेकिन हर संदर्भ से संभव हो सकती है):

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);

मुझे पता है कि मैं यहां 6 महीने देरी से कूद रहा हूं। लेकिन मैं एंड्रयू से सहमत हूं। मैंने इस सूत्र में मूल विधि की कोशिश की। और आईडी के हड़पने के कारण कुछ के बारे में यह असफल होना शुरू हो गया। यह विधि (सीधे खेतों को मैन्युअल रूप से अपडेट करने के लिए) बेहतर काम करती है। मेरे उद्देश्यों के लिए, कम से कम।
durbnpoisn

अद्भुत सामान। पता नहीं कैसे तुम इस के साथ समाप्त हो गया, लेकिन मेरे विजेट के सभी उदाहरणों के लिए ठीक और चिकनी काम करता है। :)
अतुल ओ होलिक

यह मेरे लिए भी काम किया। मुझे लगा कि हमें ब्रॉडकास्ट और ऑनरेक्टिव करने की जरूरत है, लेकिन मेरी जरूरतें पूरी तरह से फिट हैं
stingray_

30

तो किसी गतिविधि से विजेट अपडेट करने के लिए, आप इसे इस तरह से कर सकते हैं:

Intent intent = new Intent(this, DppWidget.class);
intent.setAction("android.appwidget.action.APPWIDGET_UPDATE");
int ids[] = AppWidgetManager.getInstance(getApplication()).getAppWidgetIds(new ComponentName(getApplication(), DppWidget.class));
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS,ids);
sendBroadcast(intent);

मेरे लिये कार्य करता है :)


यह onRecieve ओवरराइड विधि को कॉल करता है। लेकिन मैं कैसे onUpdate पद्धति को कॉल करना चाहता हूं।
अमित थापर

25

इसे इस्तेमाल करे:

int[] ids = AppWidgetManager.getInstance(getApplication()).getAppWidgetIds(new ComponentName(getApplication(), MyWidget.class));
        MyWidget myWidget = new MyWidget();
        myWidget.onUpdate(this, AppWidgetManager.getInstance(this),ids);

2
आश्चर्यजनक, केवल इस छोटे से उत्तर ने इसे हल कर दिया। मैं अभी भी विजेट वर्ग को तुरंत समझने और सीधे onUpdate पद्धति को कॉल करने के निहितार्थ को नहीं जानता, लेकिन हे, यह अंत में काम करता है :)
हेनरिक डी सूसा

1
धन्यवाद। मैं अभी इसका परीक्षण कर रहा हूं और प्रतिक्रिया दूंगा। परीक्षण किया और काम करने की पुष्टि की। मैं सोच रहा हूं, अगर विभिन्न प्रकार के विजेट हैं, तो क्या यह एक ही काम करेगा? (काम करने के तरीके से +1)
Si8

मैं हमेशा आईडी 0 प्राप्त करता
हूं

यह एंड्रॉइड ओरेओ पर कोई वर्कअराउंड फिक्स नहीं करेगा?
१ed:०३ पर स्टैडओवरफ़्लो

15

यदि आप एक विजेट के साथ काम कर रहे हैं, जो विजेट के आइटम को अपडेट करने के लिए ListView, GridView या StackView जैसे संग्रह का उपयोग करता है, तो निम्नानुसार करें:

Context context = getApplicationContext();
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
ComponentName thisWidget = new ComponentName(context, StackWidgetProvider.class);
int[] appWidgetIds = appWidgetManager.getAppWidgetIds(thisWidget);
appWidgetManager.notifyAppWidgetViewDataChanged(appWidgetIds, R.id.stack_view);

इस विधि से InformAppWidgetViewDataChanged (), आप विजेट आइटम्स को वास्तविक समय में किसी भी नए डेटा को लाने के लिए मजबूर कर सकते हैं।


12
int widgetIDs[] = AppWidgetManager.getInstance(getApplication()).getAppWidgetIds(new ComponentName(getApplication(), WidgetProvider.class));

for (int id : widgetIDs)
    AppWidgetManager.getInstance(getApplication()).notifyAppWidgetViewDataChanged(id, R.id.widget_view);
}

1
मिन-एपी स्तर की आवश्यकता है: 11.
अनिरुद्ध रामनाथन

बहुत बढ़िया। आपको लूप करने की ज़रूरत नहीं है, इसका एक संस्करण है notifyAppWidgetViewDataChanged()जो एक सरणी लेता है।
लॉरेंस Kesteloot

2

कोथलिन में फेथॉन का स्वीकृत समाधान:

    val intent = Intent(this, MyAppWidgetProvider::class.java)
    intent.action = AppWidgetManager.ACTION_APPWIDGET_UPDATE
    val ids = AppWidgetManager.getInstance(application).getAppWidgetIds(ComponentName(getApplicationContext(),MyAppWidgetProvider::class.java!!))
    intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, ids)
    sendBroadcast(intent)

जहां MyAppWidgetProvider AppWidgetProvider से लिया गया है:
class MyAppWidgetProvider : AppWidgetProvider() {


2

यदि आप प्रोग्राम को उस विजेट को अपडेट करने का प्रयास कर रहे हैं, जहां आपके पास YourWidgetProvider.class तक पहुंच नहीं है, उदाहरण के लिए, किसी अन्य मॉड्यूल या लाइब्रेरी से, आप YourWidgetProvider.class.getName () आउटपुट को कैप्चर कर सकते हैं और एक स्थिरांक बना सकते हैं:

val WIDGET_CLASS_NAME = "com.example.yourapplication.YourWidgetProvider"

आप तब इस का उपयोग करने में सक्षम होंगे:

val intent = Intent(AppWidgetManager.ACTION_APPWIDGET_UPDATE)
val widgetManager = AppWidgetManager.getInstance(context)
val ids = widgetManager.getAppWidgetIds(ComponentName(context, WIDGET_CLASS_NAME))
AppWidgetManager.getInstance(context).notifyAppWidgetViewDataChanged(ids, android.R.id.list)
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, ids)
context.sendBroadcast(intent)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.