Italian Orologio Widget

D

Deleted member 103

Guest
Ciao a tutti,

qualcuno può darmi una mano a far funzionare questo Widget come si deve?

Quello che iniziato darmi una mano, non so perché, ma ha lasciato perdere. :(

Si tratta di un semplice orologio, senza meteo o altro, e serve solo per me.
Tutti i widget che trovo sono tutti con un sacco di funzioni che a me non servono proprio.
 

Star-Dust

Expert
Licensed User
Longtime User
Ti posso mandare il codice di un vecchissimio mio programma meteo che usa i widget se ti serve. (ps. funziona)
 

Star-Dust

Expert
Licensed User
Longtime User
C'è un altro modo per aggiornare più frequentemente, e lo ha suggerito sempre Erel, ovvero creare un altro servizio (non widget) che ogni tot di tempo forzi l'aggiornamento.

Si può usare un timer dentro un service, ma lo sconsiglio fortemente, con le ultime novità di android 7 e 8 l'ideale sarebbe uno StartServiceAt per assicurarsi che ogni tot di tempo si forzi l'aggiornamento senza che il sistema uccida il servizio.
 
Last edited:

LucaMs

Expert
Licensed User
Longtime User
D

Deleted member 103

Guest
Ti posso mandare il codice di un vecchissimio mio programma meteo che usa i widget se ti serve. (ps. funziona)
Non sarebbe male. :)

Si può usare un timer dentro un service, ma lo sconsiglio fortemente, con le ultime novità di android 7 e 8 l'ideale sarebbe uno StartServiceAt per assicurarsi che ogni tot di tempo si forzi l'aggiornamento senza che il sistema uccida il servizio.
È proprio quello che uso, ma non funziona sempre.
B4X:
Sub Service_Start (StartingIntent As Intent)
    'Log(StartingIntent)
    If rv.HandleWidgetEvents(StartingIntent) Then Return
           
    'Reschedule the service every minute, so the clock gets updated correctly
    StartServiceAt(Me, TimeToNextMinute, False)
       
    rv_RequestUpdate

End Sub

Sub Service_Destroy

End Sub

'Calculate the time to the next full minute
Sub TimeToNextMinute As Long
    Dim ret As Long

    ret = DateTime.Now + DateTime.TicksPerMinute
    ret = ret - (ret Mod DateTime.TicksPerMinute)   
    Return ret
End Sub

Quindi un "normale" StartServiceAt non è sufficiente.
Infatti, è proprio questo il problema. :mad:

Ha scritto anche questo,
There are built-in clock controls. For example TextClock: https://developer.android.com/reference/android/widget/TextClock.html

You will need to manually add it to the generated XML layout (and make it read-only).
ma questo non l'ho capito come funziona. :(
 

Star-Dust

Expert
Licensed User
Longtime User
Spero ti siamo stati utili noi con qualche scemenza che abbiamo detto :p

Riguardando il mio vecchio codice ho visto come ho fatto a aggiornarlo a scadenza minore di 30 minuti.

B4X:
Sub Service_Start (StartingIntent As Intent)
    'If Widgr.HandleWidgetEvents(StartingIntent) Then Return
    If StartingIntent.Action = "android.appwidget.action.APPWIDGET_DELETED" Then Return
  
   ' Handle the widget events
    If Widgr.HandleWidgetEvents(StartingIntent) = False Then
      ' If the action is not handled by HandleWidgetEvents() then we
      ' probably were called by StartService() or StartServiceAt().
      ' So just update the widget.
      Widgr_RequestUpdate
    End If
  
   ' We have to be sure that we do not start the service
   ' again if all widgets are removed from homescreen
   If StartingIntent.Action <> "android.appwidget.action.APPWIDGET_DISABLED" Then
      StartServiceAt("", DateTime.Now+DateTime.TicksPerMinute/4, False)
   End If
End Sub
 

Star-Dust

Expert
Licensed User
Longtime User
leggendo la conversazione con Erel , capisco che nelle versioni più recente di Android questo potrebbe non funzionare. Il mio codice é vecchio e funziona bene con android 1.6 fino alla 4.4.

Il problema sembra più complesso di quanto immaginassi per versioni 5+. Io userei un servizio foreground con una notifica sempre accesa per aggiornare il Widget.

1) #StartCommandReturnValue: android.app.Service.START_STICKY
2) Service.StartForeground
3) Notify
4) StartServiceAtExact

e se ancora non funzionasse
B4X:
Sub Service_Start (StartingIntent AsIntent)

  Do While A=A 'in barba al mio professore di informatica :p
    Widget.Update
    Doevents ' in barba a Erel
    Sleep(0) ' In barba a LucaMS
  loop

End Sub
 
Last edited:

udg

Expert
Licensed User
Longtime User
Adesso l'ho capito e funziona!

Complimenti! Presumo che sostituendo alle tue label un TextClock, questi faccia da solo in termini di sincronizzazione con l'orologio interno del device e quindi si aggiorni da sè. A quel punto il widget si ridurrebbe a poche righe. Ti andrebbe di condividerlo?
 

Star-Dust

Expert
Licensed User
Longtime User
Cambia smartphone. Cos'è un TextClock?
 

LordZenzo

Well-Known Member
Licensed User
Longtime User
leggendo la conversazione con Erel , capisco che nelle versioni più recente di Android questo potrebbe non funzionare. Il mio codice é vecchio e funziona bene con android 1.6 fino alla 4.4.

Il problema sembra più complesso di quanto immaginassi per versioni 5+. Io userei un servizio foreground con una notifica sempre accesa per aggiornare il Widget.

1) #StartCommandReturnValue: android.app.Service.START_STICKY
2) Service.StartForeground
3) Notify
4) StartServiceAtExact

e se ancora non funzionasse
B4X:
Sub Service_Start (StartingIntent AsIntent)

  Do While A<>A 'in barba al mio professore di informatica :p
    Widget.Update
    Doevents ' in barba a Erel
    Sleep(0) ' In barba a LucaMS
  loop

End Sub

Do While A<>A
non funziona, non ciclerebbe, devi scrivere Do While True (potrei sbagliare...ma non credo)
 
D

Deleted member 103

Guest
Complimenti! Presumo che sostituendo alle tue label un TextClock, questi faccia da solo in termini di sincronizzazione con l'orologio interno del device e quindi si aggiorni da sè. A quel punto il widget si ridurrebbe a poche righe. Ti andrebbe di condividerlo?
Devi cambiare il TextView con un TextClock.
B4X:
<?xml version="1.0" encoding="utf-8"?>
<AbsoluteLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent">
  <LinearLayout android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="horizontal" android:gravity="center" android:layout_x="0dp" android:layout_y="0dp">
    <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="vertical" android:gravity="center" android:layout_gravity="center_vertical">
      <AbsoluteLayout android:id="@+id/smhomeclock_pnlbase" android:layout_width="294dp" android:layout_height="200dp" android:layout_x="0dp" android:layout_y="0dp" android:visibility="visible">
        <AbsoluteLayout android:id="@+id/smhomeclock_pnlwidget" android:layout_width="294dp" android:layout_height="144dp" android:layout_x="0dp" android:layout_y="0dp" android:visibility="visible" android:background="@drawable/smhomeclock_pnlwidget_background">
          <TextClock android:id="@+id/smhomeclock_lbltime" android:layout_width="294dp" android:layout_height="130dp" android:layout_x="0dp" android:layout_y="-20dp" android:visibility="visible" android:text="00:00" android:gravity="top|center_horizontal" android:textColor="#FFFFFFFF" android:textSize="100dp" android:textStyle="normal" android:typeface="sans" />
          <TextView android:id="@+id/smhomeclock_lbldate" android:layout_width="294dp" android:layout_height="38dp" android:layout_x="0dp" android:layout_y="110dp" android:visibility="visible" android:text="Donnerstag, 26 Mai" android:gravity="center_vertical|center_horizontal" android:textColor="#FFFFFFFF" android:textSize="22dp" android:textStyle="normal" android:typeface="sans" />
        </AbsoluteLayout>
      </AbsoluteLayout>
    </LinearLayout>
  </LinearLayout>
</AbsoluteLayout>
Purtroppo mi sono adesso accorto che non funziona lo stesso.
Adesso provo il codice di @Star-Dust .
homeclock_02.png
 
D

Deleted member 103

Guest
La View TextClock funziona benissimo, infatti non c'è più bisogno di questo codice.
B4X:
Sub SetTime
    'rv.SetText("lblTime", DateTime.Time(DateTime.Now))
    rv.SetText("lblDate", DateTime.Date(DateTime.Now))
End Sub
quello che dovrebbe fare "rv.SetText("lblTime", DateTime.Time(DateTime.Now))" lo fa adesso TextClock.
 
Top