2009-06-22 11 views
9

J'ai besoin d'une boîte de dialogue contextuelle pour afficher un message provenant d'un thread différent, mais la boîte de dialogue ne doit pas dépendre de Activity i.e.Boîte de dialogue PopUp Android à partir du fil d'arrière-plan

Cela peut-il être fait? Parce que la boîte de dialogue est gérée par activité, j'ai pensé à utiliser un service mais encore une fois ce serait un thread de plus ajouté et je veux éviter cela.

Autres options disponibles?

+0

Je crois qu'il essaie de demander ceci: Comment pouvez-vous démarrer une boîte de dialogue à partir d'un service qui s'exécute dans un thread séparé? Il peut y avoir un certain nombre d'activités en cours d'exécution. Pour afficher une boîte de dialogue, vous devez spécifier l'activité en cours. –

+0

Une solution possible est d'utiliser une activité: http://stackoverflow.com/posts/3912748/revisions –

+0

https://stackoverflow.com/a/29804684/2149195 – RBK

Répondre

17

Si vous essayez de demander comment afficher une boîte de dialogue lorsque votre activité n'est pas concentrée sur le téléphone de l'utilisateur, essayez plutôt d'utiliser les notifications. Ouvrir une boîte de dialogue sur une application différente interrompt l'utilisateur lorsqu'il peut faire autre chose. Des Android UI guidelines:

Utilisez le système de notification - ne pas boîtes de dialogue d'utilisation en place des notifications

Si vos besoins en services de base pour informer un utilisateur, utilisez le système standard de notification - n'utilisez pas une boîte de dialogue ou un toast pour les avertir. Une boîte de dialogue ou du pain grillé serait immédiatement prendre focus et interrompre l'utilisateur, en prenant attention loin de ce qu'ils faisaient: l'utilisateur pourrait être au milieu du texte de frappe le moment, les de dialogue apparaît et pourrait accidentellement agir sur la dialogue. Les utilisateurs sont habitués à traiter avec des notifications et peuvent tirer vers le bas la nuance de notification à leur commodité pour répondre à votre message .

Un guide pour créer des notifications est ici: http://developer.android.com/guide/topics/ui/notifiers/notifications.html

+0

salut, Comme je téléphone ont délégué de l'application qui toujours écouter les changements à l'interface utilisateur est-il quelque chose de similaire dans Android? – Sam97305421562

+0

Facebook Messenger (bulles) ne suit pas cette règle. . . – sospedra

+0

@Bursos Je ne suis pas sûr de savoir ce que vous voulez dire. Facebook ne suit souvent pas les directives de l'interface utilisateur Android. De plus, les bulles ne prennent pas le contrôle de l'utilisateur comme le ferait un dialogue. – Intrications

1

Autre solution:

AlertDialog dialog; 
//add this to your code 
    dialog = builder.create(); 
    Window window = dialog.getWindow(); 
    WindowManager.LayoutParams lp = window.getAttributes(); 
    lp.token = mInputView.getWindowToken(); 
    lp.type = WindowManager.LayoutParams.TYPE_APPLICATION_ATTACHED_DIALOG; 
    window.setAttributes(lp); 
    window.addFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM); 
//end addons 
alert.show(); 
+1

Alors ... où pensez-vous que je pourrais obtenir un mInputView dans un fil de fond? ;) – Janusz

+0

(nouveau AlertDialog.Builder (myAppContext)). Create() me donne java.lang.RuntimeException: Impossible de créer un gestionnaire dans un thread qui n'a pas appelé Looper.prepare(). –

+0

vous devez utiliser le contexte d'activité et non le contexte de l'application. – Sulby

1

si je vous comprends bien, vous pouvez utiliser une classe de base pour toutes vos activités

public abstract class BaseActivity extends Activity{ 
    protected static BaseActivity current_context = null; 

    @override 
    protected void onPause(){ 
     current_context = null; 
     super.onPause(); 
    } 

    @override 
    protected void onResume(){ 
     current_context = this; 
     super.onResume(); 
    } 

    public static void showDialog(/*your parameters*/){ 
     //show nothing, if no activity has focus 
     if(current_context == null)return; 
     current_context.runOnUiThread(new Runnable() { 
      @override 
      public void run(){ 
       AlertDialog.Builder builder = 
        new AlertDialog.Builder(current_context); 
       //your dialog initialization 
       builder.show(); 
      } 
     }); 
    } 
} 

dans votre fil afficher votre boîte de dialogue avec BaseActivity.showDialog(..) Mais cette approche ne fonctionne pas si vous voulez afficher votre boîte de dialogue au-dessus de toute activité du périphérique cible.

Questions connexes