Одна кнопка на виджете не работает - PullRequest
2 голосов
/ 12 августа 2011

Я не знаю, что не так в моем коде, но каждый раз, когда я помещаю виджет на главный экран, button1 не работает. После перезагрузки телефона обе кнопки работают отлично ...

package cro.perger.bonbon;

import android.app.PendingIntent;
import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.widget.RemoteViews;



        public class HelloWidget extends AppWidgetProvider {

                @Override
                public void onUpdate(Context context, AppWidgetManager appWidgetManager,
                        int[] appWidgetIds) {

                            String encodedHash = Uri.encode("#");

                            for (int appWidgetId : appWidgetIds) {

                                Intent callIntent1  = new Intent("android.intent.action.CALL",
                                         Uri.parse("tel:*100" + encodedHash));
                                Intent callIntent2  = new Intent("android.intent.action.CALL",
                                         Uri.parse("tel:*200*1" + encodedHash));

                                PendingIntent pendingIntent1 = PendingIntent.getActivity(context, 0, callIntent1, 0);
                                PendingIntent pendingIntent2 = PendingIntent.getActivity(context, 0, callIntent2, 0);

                                RemoteViews views1 = new RemoteViews(context.getPackageName(), R.layout.widget);
                                views1.setOnClickPendingIntent(R.id.button1, pendingIntent1);

                                RemoteViews views2 = new RemoteViews(context.getPackageName(), R.layout.widget);
                                views2.setOnClickPendingIntent(R.id.button2, pendingIntent2);

                                appWidgetManager.updateAppWidget(appWidgetId, views1);
                                appWidgetManager.updateAppWidget(appWidgetId, views2);
                            }

                }
    }

Любая помощь, пожалуйста ??

РЕДАКТИРОВАТЬ 2: Хорошо, теперь это работает, но теперь у меня есть еще два вопроса. Сначала я управлял тремя кнопками для отправки сообщений, но я всегда получал одно и то же тело сообщения, независимо от того, какую кнопку я нажимаю. И второе, что мне нужно, чтобы изменить этот код, чтобы сообщение отправлялось автоматически (теперь открывается только составленное сообщение) ...

package cro.perger.bonbon;

import android.app.PendingIntent;
import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.widget.RemoteViews;



        public class HelloWidget extends AppWidgetProvider {

                @Override
                public void onUpdate(Context context, AppWidgetManager appWidgetManager,
                        int[] appWidgetIds) {

                            String encodedHash = Uri.encode("#");

                            for (int appWidgetId : appWidgetIds) {

                                Intent callIntent1  = new Intent("android.intent.action.CALL",
                                         Uri.parse("tel:*100" + encodedHash));
                                Intent callIntent2  = new Intent("android.intent.action.CALL",
                                         Uri.parse("tel:*200*1" + encodedHash));

                                Intent sendIntent1 = new Intent(Intent.ACTION_VIEW);
                                sendIntent1.putExtra("sms_body", "Poruka 1");
                                sendIntent1.putExtra("address", "5556");
                                sendIntent1.setType("vnd.android-dir/mms-sms");

                                Intent sendIntent2 = new Intent(Intent.ACTION_VIEW);
                                sendIntent2.putExtra("sms_body", "Poruka 2");
                                sendIntent2.putExtra("address", "5556");
                                sendIntent2.setType("vnd.android-dir/mms-sms");

                                Intent sendIntent3 = new Intent(Intent.ACTION_VIEW);
                                sendIntent3.putExtra("sms_body", "Poruka 3");
                                sendIntent3.putExtra("address", "5556");
                                sendIntent3.setType("vnd.android-dir/mms-sms");

                                Intent openintent = new Intent(context, bonbon.class);

                                PendingIntent pendingIntent1 = PendingIntent.getActivity(context, 0, callIntent1, 0);
                                PendingIntent pendingIntent2 = PendingIntent.getActivity(context, 0, callIntent2, 0);
                                PendingIntent pendingIntent3 = PendingIntent.getActivity(context, 0, sendIntent1, PendingIntent.FLAG_UPDATE_CURRENT);
                                PendingIntent pendingIntent4 = PendingIntent.getActivity(context, 0, sendIntent2, PendingIntent.FLAG_UPDATE_CURRENT);
                                PendingIntent pendingIntent5 = PendingIntent.getActivity(context, 0, sendIntent3, PendingIntent.FLAG_UPDATE_CURRENT);
                                PendingIntent pendingIntent6 = PendingIntent.getActivity(context, 0, openintent, 0);

                                RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget);
                                views.setOnClickPendingIntent(R.id.button1, pendingIntent1);
                                views.setOnClickPendingIntent(R.id.button2, pendingIntent2);
                                views.setOnClickPendingIntent(R.id.button3, pendingIntent3);
                                views.setOnClickPendingIntent(R.id.button4, pendingIntent4);
                                views.setOnClickPendingIntent(R.id.button5, pendingIntent5);
                                views.setOnClickPendingIntent(R.id.button6, pendingIntent6);

                                appWidgetManager.updateAppWidget(appWidgetId, views);

                            }

                }

        }

1 Ответ

2 голосов
/ 12 августа 2011

То, что вы делаете, обновляет один и тот же виджет (appWidgetId) с двумя макетами (views1 и views2).В основном вы устанавливаете макет виджетов с намерением ожидания на button1 (-> views1).Затем вы перезаписываете его макетом, в котором только button2 имеет ожидающее намерение (-> views2).Я не уверен, почему это работает после перезапуска, может быть, Android замечает, что вы используете тот же ресурс базовой компоновки и не создаете его с нуля где-то во внутренних органах.

Итак, как вы делаете это правильно?

Вы можете просто сократить свой фрагмент кода.Создайте один макет, установите ожидающие намерения для обеих кнопок на одном макете и обновите, как вы сделали.Но только один раз вам никогда не понадобится более одного вызова updateAppWidget() за appWidgetId (это в основном то же самое, что setContentView () для нормальной деятельности).

Должно выглядеть так вконец:

Intent callIntent1  = new Intent("android.intent.action.CALL",
                             Uri.parse("tel:*100" + encodedHash));
Intent callIntent2  = new Intent("android.intent.action.CALL",
                     Uri.parse("tel:*200*1" + encodedHash));

PendingIntent pendingIntent1 = PendingIntent.getActivity(context, 0, callIntent1, 0);
PendingIntent pendingIntent2 = PendingIntent.getActivity(context, 0, callIntent2, 0);

RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget);
views.setOnClickPendingIntent(R.id.button1, pendingIntent1);
views.setOnClickPendingIntent(R.id.button2, pendingIntent2);

appWidgetManager.updateAppWidget(appWidgetId, views);
...