ক্রিয়াকলাপ / পরিষেবা / রিসিভার থেকে প্রোগ্রামে উইজেট আপডেট করুন


97

আমি জানি এটি সম্ভব, তবে আমি আমার ক্রিয়াকলাপের আপডেটটি মূল ক্রিয়াকলাপ থেকে সক্রিয় করার উপায় খুঁজে বের করতে পারি না। আমি প্রচার করতে পারি এমন কোনও সাধারণ অভিপ্রায় নেই?

উত্তর:


192

আপনি যদি এটি ব্যবহার করে থাকেন তবে আপনি 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
নীচের উত্তর থেকে @ ক্রিসবি, এটি করে অ্যারেটি পান: int ids [] = AppWidgetManager.getInstance (getApplication ())। GetAppWidgetIds (নতুন কম্পোনেন্টনাম (getApplication (), উইজেটপ্রভাইডার.ক্লাস));
মোবাইলমন

11
আপনি একটি ধ্রুবক ব্যবহার করতে পারেন, হার্ডকোডের দরকার নেই:intent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE);
মার্তিয়েড ব্রিডিস

4
উইজেটআইডি-র জন্য আর.এক্সএমএল.মিউইজেট ব্যবহার করতে @ গেগুপা মন্তব্য অনুসরণ করবেন না! এটি সম্পূর্ণরূপে ভুল এবং আমার ডিবাগিংয়ের জন্য 4 ঘন্টা খরচ হয় !!! সঠিক উইজেটআইডিআইড পেতে মোবাইলমনের সমাধানটি ব্যবহার করুন
ইলজা এস

4
আইডির জন্য: wid অন্তর্গত উইজেটআইডিস [] = অ্যাপ উইজেটম্যানেজআরটিস ইনটেন্স (ক্রিয়াকলাপ) .get অ্যাপ উইজেটআইডস (নতুন কম্পোনেন্টনাম (ক্রিয়াকলাপ, উইজেট.class)); `
আব্বাসালিম

76

যখন আমি কোনও পরিষেবা / বা ক্রিয়া থেকে কোনও উইজেট আপডেট করতে পারি তখন এটি অনুসন্ধান করেছিল (তবে প্রতিটি প্রসঙ্গেই এটি সম্ভব হতে পারে):

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

চমৎকার উপাদান. আপনি কীভাবে এটি শেষ করেছেন তা জানেন না তবে আমার উইজেটের সমস্ত দৃষ্টান্তের জন্য সূক্ষ্ম এবং মসৃণ কাজ করে। :)
অতুল হে হোলিক

এটি আমার পক্ষেও কাজ করেছিল। আমি ভেবেছিলাম আমাদের সম্প্রচার এবং অন রিসিভ করা দরকার, তবে আমার প্রয়োজনীয়তা এটির সাথে পুরোপুরি ফিট করে
স্টিংরে_

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

আমার জন্য কাজ কর :)


এটি অনরাইভ ওভাররাইড পদ্ধতিটিকে কল করে। তবে আমি কীভাবে অন আপডেট পদ্ধতিতে কল করতে চাই।
অমিত থাপার

25

এটা চেষ্টা কর:

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

4
আশ্চর্যজনকভাবে, শুধুমাত্র এই সামান্য উত্তর এটি সমাধান করেছে। আমি এখনও উইজেট শ্রেণীর তাত্ক্ষণিকভাবে প্রয়োগ করার এবং অনপ্লিট পদ্ধতিটি সরাসরি কল করার প্রভাবগুলি জানি না, তবে ওহে, শেষ পর্যন্ত এটি কার্যকর হয় :)
হেনরিক ডি সোসা

4
ধন্যবাদ আমি এখন এটি পরীক্ষা করে নিচ্ছি এবং প্রতিক্রিয়া পোস্ট করব। পরীক্ষিত এবং কাজ নিশ্চিত করেছেন। আমি ভাবছি, যদি বিভিন্ন ধরণের উইজেট থাকে তবে এটি কি একই রকম কাজ করবে? (কাজের জন্য +1)
Si8

আমি সর্বদা
আইডিস

এটি অ্যান্ড্রয়েড ওরিওতে কোনও কাজের চাপ ঠিক করবে না?
stuckedoverflow

15

আপনি যদি উইজেটের সাথে কাজ করছেন যা উইজেটের আইটেমগুলিকে আপডেট করতে তালিকাভিউ, গ্রিডভিউ বা স্ট্যাকভিউয়ের মতো সংগ্রহ ব্যবহার করে, নিম্নলিখিতভাবে করুন:

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

এই পদ্ধতির মাধ্যমে অ্যাপ্লিকেশন উইজেটভিউ ডেটাচেনজড () বিজ্ঞপ্তিটি দিয়ে আপনি উইজেট আইটেমগুলিকে রিয়েল টাইমে কোনও নতুন ডেটা আনতে বাধ্য করতে পারেন।


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

4
ন্যূনতম-এপিআই স্তর প্রয়োজন: ১১
অনিরুধ রমনাথন

অসাধারণ. আপনাকে লুপ করতে হবে না, এর একটি সংস্করণ রয়েছে notifyAppWidgetViewDataChanged()যা অ্যারে নেয়।
লরেন্স কেস্টেলুট 1

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)

মাই অ্যাপ্ল্যাভিজেটপ্রভাইডারটি যেখানে অ্যাপ উইজেটপ্রভাইডার থেকে প্রাপ্ত:
class MyAppWidgetProvider : AppWidgetProvider() {


2

আপনি যদি আপনার উইজেটপ্রোভিডার.ক্লাসের স্পষ্টভাবে অ্যাক্সেস না পেয়ে থাকেন এমন প্রোগ্রামটি উইজেটকে আপডেট করার চেষ্টা করছেন, যেমন অন্য মডিউল বা লাইব্রেরি থেকে, আপনি কীভাবে আপনার উইজেটপ্রোভিডার।

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)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.