Autore Topic: Lanciare Dialog da AppWidgetProvider  (Letto 1745 volte)

Offline misterade

  • Nuovo arrivato
  • *
  • Post: 14
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Nexus One
  • Sistema operativo:
    Mac OS X
Lanciare Dialog da AppWidgetProvider
« il: 07 Novembre 2010, 11:33:24 CET »
0
Salve ragazzi, sono nuovo del forum e mi sto dedicando in questo periodo allo studio di come sviluppare un widget (ho già fatto qualche piccola app minore).
Quello che sto cercando di fare è abbastanza banale, immaginare un widget con un bottone, premendo il bottone viene lanciato un Dialog dal quale è possibile fare alcune scelte.
Il problema è che il Dialog non viene lanciato dandomi:

Citazione
BadTokenException: unable to add window -- token null is not for application

presumo che il problema sia nel context che ho passato al Dialog (gli ho passato il context del widget).
Qualcuno di voi sa dove sto sbagliando?

Offline Qlimax

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 757
  • Respect: +202
    • Google+
    • _Qlimax
    • Mostra profilo
    • www.egsolutions.ch
  • Dispositivo Android:
    Galaxy Nexus - Nexus One - Wildfire - Magic
  • Play Store ID:
    egsolutions.ch
  • Sistema operativo:
    Ubuntu 12.04, Windows 7
Re:Lanciare Dialog da AppWidgetProvider
« Risposta #1 il: 07 Novembre 2010, 14:02:27 CET »
0
Devi usare un'activity, settandole (nel manifest) l'attributo theme in questo modo:
Codice (XML): [Seleziona]
<activity android:theme="@android:style/Theme.Dialog">

Offline misterade

  • Nuovo arrivato
  • *
  • Post: 14
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Nexus One
  • Sistema operativo:
    Mac OS X
Re:Lanciare Dialog da AppWidgetProvider
« Risposta #2 il: 07 Novembre 2010, 14:55:40 CET »
0
Perfetto grazie mille, adesso funziona :)

Solo che succede una cosa che non capisco bene.
Questo mio widget ha anche una Activity a parte che lo configura (ma non una Activity che viene lanciata quando aggiungo il widget nella home, si trova a parte nella lista dei programmi diciamo) se io:
  • apro questa Activity
  • poi premo il tasto Home
  • poi premo il button sul widget per lanciare il Dialog
mi riapre l'Activity con il Dialog.
Se invece di premere il tasto Home premo il tasto Indietro, allora il Dialog si apre sulla Home come vorrei.
Sapresti darmi delucidazioni?

Offline Qlimax

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 757
  • Respect: +202
    • Google+
    • _Qlimax
    • Mostra profilo
    • www.egsolutions.ch
  • Dispositivo Android:
    Galaxy Nexus - Nexus One - Wildfire - Magic
  • Play Store ID:
    egsolutions.ch
  • Sistema operativo:
    Ubuntu 12.04, Windows 7
Re:Lanciare Dialog da AppWidgetProvider
« Risposta #3 il: 07 Novembre 2010, 15:44:18 CET »
0
Questo succede perchè, se non viene chiamato il metodo finish (tasto back),  l'activity di configurazione rimane nello stack di activity della stessa applicazione, dietro l'activity dialog
Qui i dettagli/soluzioni:
Application Fundamentals | Android Developers


Offline misterade

  • Nuovo arrivato
  • *
  • Post: 14
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Nexus One
  • Sistema operativo:
    Mac OS X
Re:Lanciare Dialog da AppWidgetProvider
« Risposta #4 il: 07 Novembre 2010, 16:54:41 CET »
0
Grazie ancora per la risposta, ma c'è sempre qualcosa che mi sfugge, nella documentazione non ho trovato un esplicito riferimento a quello che succede nel mio caso.
Nel senso che, da quello che capisco, quando io lancio il Dialog praticamente lancio una nuova Activity, non sto "torno indietro" nello stack dei task attivi, e quindi se lancio una nuova Activity quella si dovrebbe lanciare li dove sta, non capisco perché richiama l'Activity precedente dallo stack per poi avviare l'Activity del Dialog.
(Oddio spero di essere riuscito a spiegarmi XD)

Oppure va vista in questo modo:
nello stack c'è l'Activity di config, premo Home e quella resta nello stack, lancio il Dialog, viene poppato il Dialog nello stack dopo dell'Activity di configurazione, e quindi vedo l'Activity di configurazione?

Offline Qlimax

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 757
  • Respect: +202
    • Google+
    • _Qlimax
    • Mostra profilo
    • www.egsolutions.ch
  • Dispositivo Android:
    Galaxy Nexus - Nexus One - Wildfire - Magic
  • Play Store ID:
    egsolutions.ch
  • Sistema operativo:
    Ubuntu 12.04, Windows 7
Re:Lanciare Dialog da AppWidgetProvider
« Risposta #5 il: 07 Novembre 2010, 17:02:36 CET »
0
guardala come un applicazione normale, senza appwidget.

hai un'activity aperta, lanci un dialog .  sotto il dialog si vede l'activity.

Offline misterade

  • Nuovo arrivato
  • *
  • Post: 14
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Nexus One
  • Sistema operativo:
    Mac OS X
Re:Lanciare Dialog da AppWidgetProvider
« Risposta #6 il: 07 Novembre 2010, 17:29:37 CET »
0
Ok, vedendola così ci sta anche, solo che adesso non riesco a trovare il flag giusto per "sistemare" la cosa.
Ho provato così:

Codice: [Seleziona]
Intent intent = new Intent(context,DialogTest.class);
intent.setFlags(intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.setFlags(intent.FLAG_ACTIVITY_NEW_TASK);
PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, 0);
remoteViews.setOnClickPendingIntent(R.id.widgetButton, pendingIntent);

Ma non sembra essere giusto :)
Sapresti darmi qualche altra dritta?

Offline Qlimax

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 757
  • Respect: +202
    • Google+
    • _Qlimax
    • Mostra profilo
    • www.egsolutions.ch
  • Dispositivo Android:
    Galaxy Nexus - Nexus One - Wildfire - Magic
  • Play Store ID:
    egsolutions.ch
  • Sistema operativo:
    Ubuntu 12.04, Windows 7
Re:Lanciare Dialog da AppWidgetProvider
« Risposta #7 il: 07 Novembre 2010, 18:24:21 CET »
0
prova a mettere questo attributo nell' "activity di configurazione" (quella che rimane dietro) nel manifest
Codice (XML): [Seleziona]
android:finishOnTaskLaunch="true"

Offline misterade

  • Nuovo arrivato
  • *
  • Post: 14
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Nexus One
  • Sistema operativo:
    Mac OS X
Re:Lanciare Dialog da AppWidgetProvider
« Risposta #8 il: 07 Novembre 2010, 18:29:27 CET »
0
No :(
ho provato anche a mettere nel manifest in corrispondenza dell'Activity del Dialog:
Codice: [Seleziona]
android:clearTaskOnLaunch="true"

Offline Qlimax

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 757
  • Respect: +202
    • Google+
    • _Qlimax
    • Mostra profilo
    • www.egsolutions.ch
  • Dispositivo Android:
    Galaxy Nexus - Nexus One - Wildfire - Magic
  • Play Store ID:
    egsolutions.ch
  • Sistema operativo:
    Ubuntu 12.04, Windows 7
Re:Lanciare Dialog da AppWidgetProvider
« Risposta #9 il: 07 Novembre 2010, 19:32:29 CET »
0

Offline misterade

  • Nuovo arrivato
  • *
  • Post: 14
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Nexus One
  • Sistema operativo:
    Mac OS X
Re:Lanciare Dialog da AppWidgetProvider
« Risposta #10 il: 07 Novembre 2010, 19:41:04 CET »
0
Così funziona, però c'è il fatto che se tengo premuto Home e torno sull'Activity che resta in lista, chiaramente mi riapre il Dialog.
Ho provato a mettere noHistory anche sul Dialog così che magari riavviasse l'Activity MAIN del manifest, ma invece riapre la Dialog.

Offline misterade

  • Nuovo arrivato
  • *
  • Post: 14
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Nexus One
  • Sistema operativo:
    Mac OS X
Re:Lanciare Dialog da AppWidgetProvider
« Risposta #11 il: 07 Novembre 2010, 19:44:08 CET »
0
Potrei usare la direttiva:
Codice: [Seleziona]
android:excludeFromRecents="true"
solo che così non mi resta l'Activity in lista, sarebbe un po' bruttino (però tutto ciò è molto interessante ^_^)

Offline Qlimax

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 757
  • Respect: +202
    • Google+
    • _Qlimax
    • Mostra profilo
    • www.egsolutions.ch
  • Dispositivo Android:
    Galaxy Nexus - Nexus One - Wildfire - Magic
  • Play Store ID:
    egsolutions.ch
  • Sistema operativo:
    Ubuntu 12.04, Windows 7
Re:Lanciare Dialog da AppWidgetProvider
« Risposta #12 il: 07 Novembre 2010, 19:56:30 CET »
0
Così funziona, però c'è il fatto che se tengo premuto Home e torno sull'Activity che resta in lista, chiaramente mi riapre il Dialog.
Ho provato a mettere noHistory anche sul Dialog così che magari riavviasse l'Activity MAIN del manifest, ma invece riapre la Dialog.
e cosa dovrebbe riaprire invece?

Offline misterade

  • Nuovo arrivato
  • *
  • Post: 14
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Nexus One
  • Sistema operativo:
    Mac OS X
Re:Lanciare Dialog da AppWidgetProvider
« Risposta #13 il: 07 Novembre 2010, 20:15:19 CET »
0
Dovrebbe riaprire l'Activity di configurazione.

Offline Qlimax

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 757
  • Respect: +202
    • Google+
    • _Qlimax
    • Mostra profilo
    • www.egsolutions.ch
  • Dispositivo Android:
    Galaxy Nexus - Nexus One - Wildfire - Magic
  • Play Store ID:
    egsolutions.ch
  • Sistema operativo:
    Ubuntu 12.04, Windows 7
Re:Lanciare Dialog da AppWidgetProvider
« Risposta #14 il: 07 Novembre 2010, 20:54:33 CET »
0
La lista riapre l'activity che sta in cima allo stack. in questo caso è il dialog.

Potresti però falsare il comportamento standard, verificando se l'activity del dialog è stata lanciata dalla history.
In quel caso, chiudi il dialog e fai partire l'activity di configurazione:

Codice (Java): [Seleziona]
@Override
    public void onNewIntent(Intent newIntent) {
        if ((newIntent.getFlags() & Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY) != 0) {
            finish();
            startActivity(new Intent(.....));  //lanci la activity di configurazione
        }

    }

« Ultima modifica: 07 Novembre 2010, 20:57:50 CET da Qlimax »