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

Программирование Android

Войти
Регистрация
Восстановить пароль
 
Krock21rus
74 / 74 / 19
Регистрация: 18.11.2013
Сообщений: 373
Завершенные тесты: 2
#1

Как сделать ежесекундное обновление виджета? - Программирование Android

13.02.2015, 16:40. Просмотров 656. Ответов 0
Метки нет (Все метки)

Здравствуйте, делаю виджет на подобии часов, он должен каждую секунду менять значения в своих textview.

Я пересмотрел всё, и русскоязычные, и англоязычные гайды, пытался делать бесконечный цикл с задержкой в секунду, но виджет работал только на эмуляторе genymotion android 4.4.4(SGS5), в случае с бесконечным циклом начинал работать непонятно когда, а в последней версии работает вроде сразу, но на телефоне, сколько не жди, не выходит текст.
вот код моей последней попытки:
MyWidget.java
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
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
package com.example.myapplication4.app;
 
import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.widget.RemoteViews;
import android.app.PendingIntent;
import android.app.AlarmManager;
 
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
 
public class MyWidget extends AppWidgetProvider {
    final String UPDATE_ALL_WIDGETS = "update_all_widgets";
    @Override
    public void onEnabled(Context context) {
        super.onEnabled(context);
        Intent intent = new Intent(context, MyWidget.class);
        intent.setAction(UPDATE_ALL_WIDGETS);
        PendingIntent pIntent = PendingIntent.getBroadcast(context, 0, intent, 0);
        AlarmManager alarmManager = (AlarmManager) context
                .getSystemService(Context.ALARM_SERVICE);
        alarmManager.setRepeating(AlarmManager.RTC, System.currentTimeMillis(),
                1000, pIntent);
    }
 
    @Override
    public void onDisabled(Context context) {
        super.onDisabled(context);
        Intent intent = new Intent(context, MyWidget.class);
        intent.setAction(UPDATE_ALL_WIDGETS);
        PendingIntent pIntent = PendingIntent.getBroadcast(context, 0, intent, 0);
        AlarmManager alarmManager = (AlarmManager) context
                .getSystemService(Context.ALARM_SERVICE);
        alarmManager.cancel(pIntent);
    }
 
    @Override
    public void onReceive(Context context, Intent intent) {
        super.onReceive(context, intent);
        if (intent.getAction().equalsIgnoreCase(UPDATE_ALL_WIDGETS)) {
            ComponentName thisAppWidget = new ComponentName(
                    context.getPackageName(), getClass().getName());
            AppWidgetManager appWidgetManager = AppWidgetManager
                    .getInstance(context);
            int ids[] = appWidgetManager.getAppWidgetIds(thisAppWidget);
            for (int appWidgetID : ids) {
                updateWidget(context, appWidgetManager, appWidgetID);
            }
        }
    }
 
    @Override
    public void onUpdate(Context context, AppWidgetManager appWidgetManager,
                         int[] appWidgetIds) {
        super.onUpdate(context, appWidgetManager, appWidgetIds);
    }
 
    @Override
    public void onDeleted(Context context, int[] appWidgetIds) {
        super.onDeleted(context, appWidgetIds);
    }
    static void updateWidget(Context context, AppWidgetManager appWidgetManager, int widgetID) {
        try {
                RemoteViews widgetView = new RemoteViews(context.getPackageName(), R.layout.widget);
                widgetView.setTextViewText(R.id.tv1, getPeriod().getName());
                final String result;
                if (getPeriod().getEnd() - getMinutes() < 0)
                    result = "осталось " + (getPeriod().getEnd() + 1440 - getMinutes()) + "." + (60 - new GregorianCalendar().get(Calendar.SECOND)) + " минут";
                else
                    result = "осталось " + (getPeriod().getEnd() - getMinutes()) + "." + (60 - new GregorianCalendar().get(Calendar.SECOND)) + " минут";
                widgetView.setTextViewText(R.id.tv2, result);
                appWidgetManager.updateAppWidget(widgetID, widgetView);
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }
    static class Period {
        private String name;
        private int start;
        private int end;
 
        public Period(String name, int start, int end) {
            this.name = name;
            this.start = start;
            this.end = end;
        }
        public String getName()
        {
            return this.name;
        }
        public int getStart()
        {
            return this.start;
        }
        public int getEnd()
        {
            return this.end;
        }
    }
 
    static public int getMinutes() {
        Calendar a = new GregorianCalendar();
        a.setTime(new Date(System.currentTimeMillis()));
        return a.get(Calendar.HOUR_OF_DAY)*60+a.get(Calendar.MINUTE);
    }
    static public Period getPeriod() {
        Period[] Periods = new Period[] {
                new Period("1ый урок", 480, 520), // 8.00 8.40
                new Period("1ая перемена", 520, 525), // 8.40 8.45
                new Period("2ой урок", 525, 565), // 8.45 9.25
                new Period("2ая перемена", 565, 575), // 9.25 9.35
                new Period("3ий урок", 575, 615), // 9.35 10.15
                new Period("3я перемена", 615, 630), // 10.15 10.30
                new Period("4ый урок", 630, 670), // 10.30 11.10
                new Period("4ая перемена", 670, 685), // 11.10 11.25
                new Period("5ый урок", 685, 725), // 11.25 12.05
                new Period("5ая перемена", 725, 745), // 12.05 12.25
                new Period("6ой урок", 745, 785), // 12.25 13.05
                new Period("6ая перемена", 785, 800), // 13.05 13.20
                new Period("7ой урок", 800, 840), // 13.20 14.00
                new Period("7ая перемена", 840, 850), // 14.00 14.10
                new Period("8ой урок", 850, 890), // 14.10 14.50м
                new Period("8ая перемена", 890, 900), // 14.50 15.00
                new Period("9ый урок", 900, 940), // 15.00 15.40
                new Period("9ая перемена", 940, 945), // 15.40 15.45
                new Period("10ый урок", 945, 985), // 15.45 16.25
        };
        for (int i = 0; i < Periods.length; i++) {
            if (Periods[i].getStart() <= getMinutes() && Periods[i].getEnd() > getMinutes())
                return Periods[i];
        }
        return new Period("Свободное время", Periods[Periods.length - 1].getEnd(), Periods[0].getStart());
    }
}
layout/widget.xml
XML
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
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">
    <TextView
            android:id="@+id/tv1"
            android:layout_width="match_parent"
            android:layout_height="50dp"
            android:background="#6600ff00"
            android:gravity="center_horizontal"
            android:textColor="#000"
            android:textSize="18sp">
    </TextView>
    <TextView
            android:id="@+id/tv2"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:gravity="center_horizontal"
            android:textColor="#000"
            android:textSize="18sp"
            android:layout_below="@+id/tv1" android:layout_alignParentLeft="true"
            android:layout_alignParentStart="true" android:background="#6600ff00">
    </TextView>
</RelativeLayout>
xml/widget_metadata.xml
XML
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
<appwidget-provider
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:initialLayout="@layout/widget"
        android:minHeight="40dp"
        android:minWidth="250dp"
        android:updatePeriodMillis="0">
 
AndroidManifest.xml
[XML]<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.myapplication4.app">
 
    <application android:allowBackup="true"
        android:label="@string/app_name"
        android:icon="@drawable/ic_launcher"
        android:theme="@style/AppTheme">
        <receiver
                android:name="MyWidget">
            <intent-filter>
                <action
                        android:name="android.appwidget.action.APPWIDGET_UPDATE">
                </action>
            </intent-filter>
            <meta-data
                    android:name="android.appwidget.provider"
                    android:resource="@xml/widget_metadata"
                    android:widgetCategory="home_screen|keyguard"
                    android:resizeMode="horizontal|vertical">
            </meta-data>
        </receiver>
    </application>
 
</manifest>
аналогичное приложение(не виджет) я создал, с бесконечным циклом, и оно на телефоне прекрасно работает.
</appwidget-provider>[/XML]
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.02.2015, 16:40
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как сделать ежесекундное обновление виджета? (Программирование Android):

Как при обновлении виджета получить настройки и применить их - Программирование Android
Доброго времени. Создаю виджет, который отображает кол-во дней от некой начальной даты. (просто так для изучения). При первом создании...

Ежесекундное обновление числа в файле - PHP
Здравствуйте форумчане. Такой вопрос. как реализовать следующее. Допустим в файле 1.txt записана цифра 5. Каждую секунду к...

Постоянный вывод и ежесекундное обновление текущей даты и времени - Delphi
как осуществить? procedure TForm2.FormActivate(Sender: TObject); begin Edit1.Text:=DateTimeToStr(now); end; и при клике, но...

Как навести мышку на x,y внутри виджета относительно 0,0 виджета (левого верхнего угла виджета)? - C++ Qt
Как навести мышку на x,y внутри виджета относительно 0,0 этого виджета (левого верхнего угла виджета)? Или, как получить координаты x,y...

Создать ежесекундное обновление функции ТДАТА, при этом нормально работать в Excel - VBA
возможно ли создать ежесекундное оновление функции ТДАТА() и при етом нормально работать в екселе

Обновление данных виджета - C++ Qt
Подскажите, как быстро сделать обновление информации в виджете. С помощью таймеров и слотов, или есть другой способ?

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.02.2015, 16:40
Привет! Вот еще темы с ответами:

Как в yii сделать $this->controller->render('application.') из виджета? - PHP
Добрый день. Виджеты лежат в папке extensions (protected/extentions/widgets) Пытаюсь подцепить кусочек...

Обновление виджета (приложения) (перерисовка) - C++ Qt
Здравствуйте уважаемые форумчане. Есть QList в который занесены значения, пробегаясь в цикле по этому листу заполняются ветки...

Обновление элементов виджета каждую секунду - Python
Есть таймер, на нем 3 кнопки. На данном этапе пытаюсь заставить работать кнопку start. Каждую секунда должно меняться значение текста трех...

Как сделать такой плагин, чтобы 3 виджета-соцсетей были в вкладках - jQuery
Кто знает как называется или как сделать такой плагин, чтобы 3 виджета-соцсетей были в вкладках.


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

Или воспользуйтесь поиском по форуму:
Ответ Создать тему
Опции темы

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