Próbowałem rozwiązać mój problem za pomocą tego linku

aktualizacja - Zorientowałem się, że coś jest nie tak z ustawiaczem oczekującej intencji - za każdym razem, gdy klikam widok obrazu - intencja wysyła dodatkowe szczegóły ostatnio zdefiniowanego widżetu - co oznacza, że ​​​​inne oczekujące intencje, które zostały zdefiniowane na - dodane widżety były uruchamiane przez nowsze widżety

Mam widżet aplikacji, który pokazuje obrazek wybrany przez użytkownika. (wiele widżetów - wiele obrazków) mój problem to: nieważne, który widżet nacisnę na ekranie - aktualizowany jest tylko ostatnio dodany widżet: oto mój kod

Mój kod dostawcy xml widget

<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
    android:initialLayout="@layout/widget_Test"
    android:minHeight="146dip"
    android:minWidth="146dip"
    android:updatePeriodMillis="0" />

Mój kod XML manifestu

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.test"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk android:minSdkVersion="8" />

    <uses-permission android:name="android.permission.BIND_REMOTEVIEWS" >
    </uses-permission>

    <application
            android:icon="@drawable/icon"
            android:label="@string/app_name" >
            <activity
                    android:name=".Activities.WidgetConfig"
                    android:screenOrientation="portrait" >

                    <!-- prbbly delete this line -->
                    <action android:name="android.appwidget.action.APPWIDGET_CONFIGURE" />
            </activity>
            <!-- Test Widget -->
            <receiver
                    android:name=".Simple.Widget"
                    android:label="@string/app_widget_Test" >
                    <intent-filter>
                            <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
                    </intent-filter>

                    <meta-data
                            android:name="android.appwidget.provider"
                            android:resource="@xml/widget_Test_provider" />
            </receiver>

            <service android:name=".Simple.Widget$TestWidgetService" />
    </application>

</manifest>

Dostawca widżetów

public class Widget extends AppWidgetProvider
{
    public static String PREFENCES_WIDGET_CONFIGURE = "ActionConfigureWidget";
    public  static int[] widgets;

    @Override
    public void onUpdate(Context context, AppWidgetManager appWidgetManager,
                    int[] appWidgetIds)
    {
            Intent svcIntent = new Intent(context, TESTWidgetService.class);
            widgets = appWidgetIds;
            context.startService(svcIntent);
    }

    public static class TESTWidgetService extends Service
    {
            @Override
            public void onStart(Intent intent, int startId)
            {
                    super.onStart(intent, startId);
                    // Update the widget
                    RemoteViews remoteView = buildRemoteView(this);

                    // Push update to homescreen
                    Mngr.getInstance().pushUpdate(remoteView,
                                    getApplicationContext(), Widget.class);

                    // No more updates so stop the service and free resources
                    stopSelf();
            }

            public RemoteViews buildRemoteView(Context context)
            {
                    RemoteViews remoteViews = new RemoteViews(context.getPackageName(),
                                    R.layout.widget_TEST);
                    if (widgets != null)
                    {
                            int length = widgets.length;

                            for (int i = 0; i < length; i++)
                            {
                                    Intent configIntent = new Intent(context,
                                                    WidgetConfig.class);

                                    configIntent.setAction(Widget.PREFENCES_WIDGET_CONFIGURE);
                                    String number = AppWidgetManager.EXTRA_APPWIDGET_ID
                                                    + "number";
                                    configIntent.putExtra(number, length);
                                    String widgetID = AppWidgetManager.EXTRA_APPWIDGET_ID + i;
                                    int id = widgets[i];
                                    configIntent.putExtra(widgetID, id);
                                    PendingIntent runTESTPendingIntent = PendingIntent
                                                    .getActivity(context, 0, configIntent,
                                                                    PendingIntent.FLAG_UPDATE_CURRENT);

                                    remoteViews.setOnClickPendingIntent(R.id.TESTWidgetImage,
                                                    runTESTPendingIntent);

                                    Mngr controller = Mngr.getInstance();

                                    controller.updateTESTWidget(context, remoteViews);
                            }
                    }
                    return remoteViews;
            }

            @Override
            public void onConfigurationChanged(Configuration newConfig)
            {
                    int oldOrientation = this.getResources().getConfiguration().orientation;

                    if (newConfig.orientation != oldOrientation)
                    {
                            // Update the widget
                            RemoteViews remoteView = buildRemoteView(this);

                            // Push update to homescreen
                            Mngr.getInstance().pushUpdate(remoteView,
                                            getApplicationContext(), Widget.class);
                    }
            }

            @Override
            public IBinder onBind(Intent arg0)
            {
                    // TODO Auto-generated method stub
                    return null;
            }
    }
}

Moja aktywność konfiguracyjna

public class WidgetConfig extends ListActivity // implements
{
    private Bundle m_extras;
    private ArrayList<Test> m_tests = null;
    private int mAppWidgetId = AppWidgetManager.INVALID_APPWIDGET_ID;
    ImageAdapter m_adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.imagelist);

            Resources res = getResources();
            Mngr mngr = Mngr.getInstance();
            mngr.setResources(res);
            Context ctx = getApplicationContext();
            mngr.setContext(ctx);
            getTests();
            m_adapter = new ImageAdapter(ctx, R.layout.row, m_tests);
            ImageDownloader.Mode mode = ImageDownloader.Mode.CORRECT;
            m_adapter.getImageDownloader().setMode(mode);

            setListAdapter(m_adapter);

            Intent intent = getIntent();
            m_extras = intent.getExtras();
    }

    private void getTests()
    {
            m_tests = new ArrayList<Test>();

            Resources res = getResources();
            String[] TestNames = res.getStringArray(R.array.fav_Test_array);
            TypedArray imgs = getResources().obtainTypedArray(
                            R.array.fav_Test_integer);
            for (int i = 0; i < TestNames.length; i++)
            {
                Test o1 = new Test();
                String TestName = TestNames[i];
                int resID = imgs.getResourceId(i, -1);
                o1.setTestName(TestName);
                o1.setIMGID(resID);
                m_tests.add(o1);
            }
            imgs.recycle();

    }

    @Override
    protected void onListItemClick(ListView l, View v, int position, long id)
    {

        ListAdapter adapt = l.getAdapter();
        Object obj = adapt.getItem(position);
        if (obj != null)
        {
            Mngr mngr = Mngr.getInstance();
            Context context = getApplicationContext();
            String key = context.getString(R.string.TestWidget_string) + "_"
                + AppWidgetManager.EXTRA_APPWIDGET_ID;
            Test Test = (Test) obj;
            String val = Test.getIMGID().toString();
            mngr.putString(context, key, val);
            updateWidget();
        }

        super.onListItemClick(l, v, position, id);
    }

    private void updateWidget()
    {
        Context ctx = getApplicationContext();
        AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(ctx);
        setResult(RESULT_CANCELED);
        if (m_extras != null)
        {
            Intent resultValue = new Intent();

            int numberOfWidgets = m_extras.getInt(
                AppWidgetManager.EXTRA_APPWIDGET_ID + "number",
                AppWidgetManager.INVALID_APPWIDGET_ID);
            for (int i = 0; i < numberOfWidgets; i++)
            {

                String stringID = AppWidgetManager.EXTRA_APPWIDGET_ID + i;
                mAppWidgetId = m_extras.getInt(stringID,
                                AppWidgetManager.INVALID_APPWIDGET_ID);


                /*************************************************************/
                /*I Don't really know if I am using this piece of code right */
                Uri data = Uri.withAppendedPath(Uri.parse("ABCD"
                                + "://widget/id/"), String.valueOf(mAppWidgetId));
                resultValue.setData(data);
                /*************************************************************/

                RemoteViews views = new RemoteViews(ctx.getPackageName(),
                                R.layout.widget_Test);

                Mngr.getInstance().updateTestWidget(ctx, views);

                appWidgetManager.updateAppWidget(mAppWidgetId, views);
                resultValue.putExtra(stringID, mAppWidgetId);
            }

            setResult(RESULT_OK, resultValue);
            finish();
        }
    }
}

Mój kod menedżera

public void updateTestWidget(Context context, RemoteViews remoteViews)
{
    String key = context.getString(R.string.TestWidget_string) + "_"
            + AppWidgetManager.EXTRA_APPWIDGET_ID;

    String s = getString(context, key, "");
    if (s != null && s.equals("") == false)
    {
        int resID = Integer.valueOf(s);
        remoteViews.setImageViewResource(R.id.TestWidgetImage, resID);
    }
}

public void pushUpdate(RemoteViews remoteView, Context ctx, Class<?> cls)
{
    ComponentName myWidget = new ComponentName(ctx, cls);
    AppWidgetManager manager = AppWidgetManager.getInstance(ctx);
    manager.updateAppWidget(myWidget, remoteView);
}
5
Elad Gelman 18 luty 2012, 22:34

2 odpowiedzi

Najlepsza odpowiedź

Problemem nie jest Twoja konfiguracja, problem dotyczy Twojego widgetProvider. Miałem ten sam problem, co ty, ale rozwiązałem go za pomocą linku określiłeś. Musisz ustawić „zhakowany” zamiar w swoim configIntent w buildRemoteView.

3
Community 23 maj 2017, 13:24

Ten sam problem miałem testując swoją aplikację na emulatorze w wersji 2.2 lub 2.3. Na prawdziwym urządzeniu wszystko powinno działać poprawnie. Co więcej, w moim przypadku emulator 4.0 działał poprawnie. W każdym razie polecam przetestować go na prawdziwym urządzeniu.

0
Yury 19 luty 2012, 02:39