Форум программистов, компьютерный форум CyberForum.ru

Обработка клика на виджете - Android

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.89
dubok79
 Аватар для dubok79
323 / 121 / 11
Регистрация: 01.11.2012
Сообщений: 586
09.11.2012, 23:31     Обработка клика на виджете #1
Есть серия виджетов. Каждый имеет свой идентификатор. По этому идентификатору сохраняются настройки и по ним же соотв. виджет обновляется. Поставил в qppwidget-provider инструкцию android:focusable="true" для обработки клика на виджете. В методе onUpdate делаю следующее:
Java
1
2
3
4
5
6
7
8
9
                public static String ACTION_WIDGET_CONFIGURE = "ConfigureWidget";
                ...
        RemoteViews updateViews = new RemoteViews(context.getPackageName(), R.layout.widget_layout);
        Intent configIntent = new Intent(context, PreferencesActivity.class);
        configIntent.setAction(ACTION_WIDGET_CONFIGURE);
        configIntent.putExtra(ACTION_WIDGET_CONFIGURE, appWidgetId);
        PendingIntent configPendingIntent = PendingIntent.getActivity(context, 0, configIntent, 0);
        updateViews.setOnClickPendingIntent(R.id.widget_imageview, configPendingIntent);
        appWidgetManager.updateAppWidget(appWidgetId, updateViews);
На экране несколько копий одного и того же виджета с разными настройками. Хочу по нажатию перейти к настройкам. Тапаю на виджет. Открывается активити настроек PreferencesActivity, но с данными по умолчанию.
Если в строке
Java
1
PendingIntent configPendingIntent = PendingIntent.getActivity(context, 0, configIntent, PendingIntent.FLAG_UPDATE_CURRENT);
поставить FLAG_UPDATE_CURRENT, то открывается последнее сохраненное состояние этого активити не зависимо от кликнутого виджета.
В PreferencesActivity.java в методе onCreate написано следующее:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setResult(RESULT_CANCELED);
        setContentView(R.layout.activity_preferences);
 
        Intent intent = getIntent();
        Bundle extras = intent.getExtras();
        if (extras != null) {
            mAppWidgetId = extras.getInt(
                    AppWidgetManager.EXTRA_APPWIDGET_ID,
                    AppWidgetManager.INVALID_APPWIDGET_ID);
            if (intent.getAction().equals(WidgetActivity.ACTION_WIDGET_CONFIGURE)) {
                mAppWidgetId = extras.getInt(
                        WidgetActivity.ACTION_WIDGET_CONFIGURE,
                        AppWidgetManager.INVALID_APPWIDGET_ID);
            }
        }
        if (mAppWidgetId == AppWidgetManager.INVALID_APPWIDGET_ID) {
            finish();
        }
 
        String preffilename = PREFERENCES_FILE_NAME+"_"+String.valueOf(mAppWidgetId);
        try{
            mSettings = getSharedPreferences(preffilename, Context.MODE_PRIVATE);
            readPreferences();
        }
        catch(Exception e){Toast.makeText(PreferencesActivity.this, e.getMessage(), Toast.LENGTH_LONG).show(); return;}
    }
в методе readPreferences обычное считывание настроек. Но сюда почему то всегда приходит идешка самого первого виджета, а не тапнутого. Помогите разобраться...запарился уже.

Добавлено через 16 часов 18 минут
Никаких мыслей ни у кого нет? Уточню вопрос: как мне определить на каком виджете я тапнул? Как узнать ид тапнутого виджета.

Добавлено через 7 часов 31 минуту
Вот решение. Нужно разместить в том же месте где формируется Intent в файле java виджета
В общем это выглядит так:

Intent configIntent = new Intent(context, PreferencesActivity.class);
configIntent.setAction(ACTION_WIDGET_CONFIGURE);
Uri data = Uri.withAppendedPath(Uri.parse(URI_SCHEME + "://widget/id/"),String.valueOf(appWidgetId));
configIntent.setData(data);
PendingIntent configPendingIntent = PendingIntent.getActivity(context, 0, configIntent, PendingIntent.FLAG_UPDATE_CURRENT);
updateViews.setOnClickPendingIntent(R.id.widget_imageview, configPendingIntent);
appWidgetManager.updateAppWidget(appWidgetId, updateViews);

Жирным выделено то чего не хватало.

Добавлено через 2 минуты
URI_SCHEME: просто константа с чем угодно.

Это работает, но почему? Бог знает

Добавлено через 46 минут
Короче, кому нужен будет пример могу скинуть целиком. Все работает, проверил.

Результат взял отсюда: http://stackoverflow.com/questions/4...ng-last-widget
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.11.2012, 23:31     Обработка клика на виджете
Посмотрите здесь:

Android Нарисовать график на виджете
Обработка checkbox'ов Android
Android Создать кнопку и действие на нее на виджете
Как добавить поддержку прокрутки в собственном виджете? Android
Android Изменить размер шрифта в виджете
Android Обработка событий
Android Обработка нажатий
Android Как в виджете отловить, что экран повернулся
Android Открытие приложенея после клика на нотификации (Service, notification)
Android Текст в виджете
Android Обработка смс
Android Прозрачность Layout для клика

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

Текущее время: 11:39. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru