С Новым годом! Форум программистов, компьютерный форум, киберфорум
Программирование Android
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
7 / 17 / 0
Регистрация: 30.09.2021
Сообщений: 232

Можно ли в виджете приложения со StackView изменить текст только в одном элементе стека?

17.05.2023, 17:53. Показов 546. Ответов 0

Студворк — интернет-сервис помощи студентам
Я сделала виджет со StackView и конфигурационным экраном. Я хочу из конфигурационного экрана изменять текст и фон в элементах стека. Точнее, в одном элементе виджета-стека за раз. Моя конфигурационная активность:
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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
public class ConfigActivity extends Activity {
 
int widgetID = AppWidgetManager.INVALID_APPWIDGET_ID;
Intent resultValue;
 
 public final static String WIDGET_PREF = "widget_pref";
 public final static String STECK_TEXT = "steck_text_";
 public final static String STECK_COLOR = "steck_color_";
 
 //Создаём строку для сохранения текстов в списке 
String textS;
 
 @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
 
// извлекаем ID конфигурируемого виджета из Intent
//Объявим Intent и привяжем его к полученному:
       Intent intent = getIntent();
//Создадим хранилище (Bundle) и выгрузим в
//него данные из полученного интента
       Bundle extras = intent.getExtras();
             if (extras != null) {
  //Получаем и настраиваем идентификатор виджета
 widgetID = extras.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID,
           AppWidgetManager.INVALID_APPWIDGET_ID);
}
         // и проверяем его корректность.
         //Если widgetID некорректный - выходим
    if (widgetID == AppWidgetManager.INVALID_APPWIDGET_ID) {
              finish();
 }
 
 // формируем intent ответа с ID для метода setResult
          resultValue = new Intent();             
resultValue.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, widgetID);
          // отрицательный ответ
      setResult(RESULT_CANCELED, resultValue);
 
          //Метод  setContentView() устанавливает
          //содержимое активити из layout-файла
            setContentView(R.layout.config);                     
}
 
 
//В onClick мы читаем выбранный цвет и введенный
//в поле текст и записываем эти значения в Preferences
public void onClick(View v) {
 
    //Получаем ID выбранного переключателя 
 int selRBColor = ((RadioGroup) findViewById(R.id.rgColor))
            .getCheckedRadioButtonId();
             int color = Color.RED;
 
switch (selRBColor) {
 
       case R.id.radioRed:
            color = Color.parseColor("#ff0040");
            break;
 
       case R.id.radioGreen:
            color = Color.parseColor("#00ffBF");
            break;
       case R.id.radioBlue:
            color = Color.parseColor("#0080ff");
            break;
}
 
                  //Создаём EditText
   EditText etText = (EditText) findViewById(R.id.etText);
         //получаем введенный пользователем текст
         //из элементов EditText, используя метод getText()                                              
  textS=etText.getText().toString();
 
         // Записываем значения текста с экрана в Preferences
         //и сохраняем его и выбранный цвет
SharedPreferences sp = getSharedPreferences(WIDGET_PREF, MODE_PRIVATE);
Editor editor = sp.edit();
editor.putString(STECK_TEXT + widgetID, etText.getText()
   .toString());
editor.putInt(STECK_COLOR + widgetID, color);
editor.commit();
 
//Метод getInstance(соntext) позволяет получить экземпляр
//AppWidgetManager с предоставленным объектом 
AppWidgetManager appWidgetManager = AppWidgetManager.                                                                              getInstance(this);          
 
//Мы вызываем метод updateWidget и передаем туда context,
//AppWidgetManager, SharedPreferences и ID экземпляра, чтобы
//обновить виджет сразу, а не через 40 мин.                                                              StackWidgetProvider.updateWidget(this, appWidgetManager, sp,                                                                               widgetID);         
 
              // Возвращаем положительный ответ
           setResult(RESULT_OK, resultValue);
             //Закрываем активность конфигуратора
            finish();
 }
}
Мой виджет изменяет либо текст и цвет во всех элементах стека, либо просто выдаёт с этими параметрами простой одиночный виджет без стека в зависимости от местонахождения этого куска кода:
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
RemoteViews rv = new RemoteViews(context.getPackageName(),
                                             R.layout.widget_item);
// Читаем параметры настройкиPreferences
 
 sp = context.getSharedPreferences(
                                                      
ConfigActivity.WIDGET_PREF, Context.MODE_PRIVATE);
 
 if (position<mCount) {             
//Создаём строку для сохранённого текста
String steckText = sp.getString(ConfigActivity.STECK_TEXT+ widgetID, "");                                                                          
 
//Создаём int для сохранённого цвета
int steckColor = sp.getInt(ConfigActivity.STECK_COLOR +  widgetID, 1);                                                                                                                         
 
// Настраиваем внешний вид элемента виджета                        
 
//Вызываем методы для формирования вида элемента виджета  
                                                 
 
rv.setTextViewText(R.id.widget_item, steckText);   
                                                                                       
 
rv.setInt(R.id.widget_item, "setBackgroundColor", steckColor);
                                                                            
 }
Я пыталась вставить этот кусок кода и в класс-сервис, и в класс-провайдер, и в конфигурационную активность. Но либо меняется текст и цвет всех элементов стека (если он в сервисе в методе getViewAt); либо формируется простой одиночный виджет без стека (если он в классе-провайдере или в конфигурационной активности в методе onClick); либо меняется цвет и текст только одного элемента стека, остальные прозрачные, они вроде бы есть, но нажать на них нельзя (это когда я попробовала вместо id виджета вставить позицию position элемента в SharedPreferences в конф. активности):
Java
1
2
3
4
5
Editor editor=sp.edit();
editor.putString(STECK_TEXT + position, etText.getText()
.toString());
editor.putInt(STECK_COLOR + position, color);
editor.commit();
в сервисе:
Java
1
2
3
4
5
6
//Создаём строку для сохранённого текста
 String steckText = sp.getString(ConfigActivity.STECK_TEXT
+ position, "");
 
//Создаём int для сохранённого цвета
int steckColor = sp.getInt(ConfigActivity.STECK_COLOR + position, 1);
; либо один элемент стека пытается измениться, но дальше слова "загрузка" ничего не меняется (когда вставила этот кусок в метод onDataSetChanged). Я пробовала указать и id виджета, и позицию элемента в имени при сохранении в SP, но это ничего не изменило.

Я понимаю, почему получаю такие результаты, но не знаю, как мне это исправить. Как изменить текст и цвет только в одном элементе стека? Помогите, пожалуйста, если кто-то делал это. Я прочитала все учебники, в которых есть хоть что-то про виджеты, и все статьи в интернете, но нигде ничего по этому вопросу нет.

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

Я не понимаю, как и где мне указать, что я изменяю только один элемент в стеке, а не все сразу. И почему после первого выбора параметров в конфигурационной активности стек формируется в соответствии с параметрами заданными в сервисе, а не в соответствии с параметрами выбранными на конфигурационном экране?

Я думаю, что, может быть, нужно попытаться после конфигурационной активности или в ней формировать новый элемент списка объектов с выбранными параметрами для стека, и только потом формировать стек из списка объектов? Но тогда придётся переделывать весь код. Может быть, есть способ исправить мой код?

Это важно: У меня телефон с API19, поэтому я не могу использовать возможности, которые появились позже.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
17.05.2023, 17:53
Ответы с готовыми решениями:

Можно ли изменить фон в элементе TDBGRID?
Здравствуйте! Подскажите пожалуйста можно ли изменить фон в элементе TDBGRID, имеется вид фон самого элемента,а не ячеек. Спасибо

Можно ли изменить цвет текста при выключенном элементе?
Хочу сделать текст &quot;Поиск&quot; другим цветом, когда тот неактивен. Банальное &quot;if (!SearchButton.Enabled)&quot; не помогает.

программа с меню, в котором можно установить цвет фона приложения, изменить размер окна приложения, получим информацию
Программа с меню, в котором можно установить цвет фона приложения, изменить размер окна приложения, получим информацию об авторе ...

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
17.05.2023, 17:53
Помогаю со студенческими работами здесь

Создать несколько графиков на одном виджете
Вот документация доступной теперь QCharts http://doc.qt.io/qt-5/qtcharts-scatterchart-example.html. Нужно построить несколько графиков на...

Как можно изменить (увеличивать) область стека для исполняемого модуля на VB?
Уважаемые знатоки! Подскажите, как можно изменить (увеличивать) область стека для исполняемого модуля на VB?

Как сделать две таблицы в одном виджете?
Есть DockWidget на нем Widget на котором слой, в котором две таблицы.. :) мне надо чтобы эти таблицы хорошо выглядели, и чтобы перемещая...

Сделать через процедуры. (одном. массив, программа внутри, её нужно только изменить)
Задача 2В одномерный массив заданного размера N (от 2 до 30) ввести произвольные натуральные числа, Определить начало и конец первой, самой...

При изменении текста в одном TextBox изменить текст в другом (конвертер валют)
Здравствуйте. Приспичило мне сделать что-то наподобие конвертера валют. Заглох в самом начале. Есть text1 и text2. При изменении text1...


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

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru