2012-11-23 4 views
2

Pourquoi j'obtiens une erreur d'Eclipse sous le code?Comment ouvrir ProgressDialog à partir de InputMethodService

code:

public class ServiceKeyboard extends InputMethodService implements KeyboardView.OnKeyboardActionListener 
{ 
    public static ProgressDialog progressDialog; 

... 
    @Override public void onStartInput(EditorInfo attribute, boolean restarting) 
    { 
     super.onStartInput(attribute, restarting); 
     progressDialog = new ProgressDialog(ServiceKeyboard.this); 
     progressDialog.setMessage(getString(R.string.sSpinner)); 
// after this line crash 
     progressDialog.show(); 
... 
... 
     if(progressDialog != null) progressDialog.dismiss(); 
    } 
} 

Erreur:

11-23 12:53:07.854: E/AndroidRuntime(23963): FATAL EXCEPTION: main 
11-23 12:53:07.854: E/AndroidRuntime(23963): android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application 
11-23 12:53:07.854: E/AndroidRuntime(23963): at android.view.ViewRootImpl.setView(ViewRootImpl.java:589) 
11-23 12:53:07.854: E/AndroidRuntime(23963): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:326) 
11-23 12:53:07.854: E/AndroidRuntime(23963): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:224) 
11-23 12:53:07.854: E/AndroidRuntime(23963): at android.view.WindowManagerImpl$CompatModeWrapper.addView(WindowManagerImpl.java:149) 
11-23 12:53:07.854: E/AndroidRuntime(23963): at android.app.Dialog.show(Dialog.java:277) 
11-23 12:53:07.854: E/AndroidRuntime(23963): at com.avanpost.mobile.ServiceKeyboard.onStartInput(ServiceKeyboard.java:354) 
11-23 12:53:07.854: E/AndroidRuntime(23963): at android.inputmethodservice.InputMethodService.doStartInput(InputMethodService.java:1549) 
11-23 12:53:07.854: E/AndroidRuntime(23963): at android.inputmethodservice.InputMethodService$InputMethodImpl.startInput(InputMethodService.java:388) 
11-23 12:53:07.854: E/AndroidRuntime(23963): at android.inputmethodservice.IInputMethodWrapper.executeMessage(IInputMethodWrapper.java:158) 
11-23 12:53:07.854: E/AndroidRuntime(23963): at com.android.internal.os.HandlerCaller$MyHandler.handleMessage(HandlerCaller.java:61) 
11-23 12:53:07.854: E/AndroidRuntime(23963): at android.os.Handler.dispatchMessage(Handler.java:99) 
11-23 12:53:07.854: E/AndroidRuntime(23963): at android.os.Looper.loop(Looper.java:137) 
11-23 12:53:07.854: E/AndroidRuntime(23963): at android.app.ActivityThread.main(ActivityThread.java:4745) 
11-23 12:53:07.854: E/AndroidRuntime(23963): at java.lang.reflect.Method.invokeNative(Native Method) 
11-23 12:53:07.854: E/AndroidRuntime(23963): at java.lang.reflect.Method.invoke(Method.java:511) 
11-23 12:53:07.854: E/AndroidRuntime(23963): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) 
11-23 12:53:07.854: E/AndroidRuntime(23963): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
11-23 12:53:07.854: E/AndroidRuntime(23963): at dalvik.system.NativeStart.main(Native Method) 

Quelle est la meilleure solution pour ouvrir la fenêtre avec ProgressDialog lorsque SoftKeyboard (InputMethodService) commencer?

J'essaie "new ProgressDialog (this);", "new ProgressDialog (getApplicationContext());" à la place "new ProgressDialog (ServiceKeyboard.this);", mais échoue.

+0

vous avez besoin d'une activité pour passer en contexte dans l'instanciation de votre ProgressDialog – njzk2

+0

je tente "nouvelle ProgressDialog (this);", « nouvelle ProgressDialog (getApplicationContext()); " à la place "new ProgressDialog (ServiceKeyboard.this);", mais échoue. –

+0

oui. car vous avez besoin d'une activité, pas d'une instance InputMethodService. Avez-vous une activité à portée de main? – njzk2

Répondre

0

Essayez d'appeler ProgressDialog depuis l'activité. Cela résoudra votre problème. Donnez-moi plus d'explications sur ce que vous essayez de faire.

+0

Application ne pas avoir d'activités. L'application est SoftKeyboard sur propre InputMethodService. Puis-je générer ProgressDialog à partir de InputMethodService sans aucune activité? –

+0

Oh, laissez-moi essayer et vous fournir une solution .. – Guna

+0

Vous ne pouvez pas le faire à partir du service ... Au lieu de cela, vous pouvez appeler une activité ..cela résoudra votre problème ... – Guna

1

J'ai rencontré un problème similaire lors de la création d'un InputMethodService sans activité associée. Cela ne fonctionne que dans l'API version 12 et supérieure, mais j'ai réussi à afficher un objet ProgressDialog en passant le jeton de fenêtre utilisé par la vue d'entrée. Tant que cela se produit, ProgressDialog peut être construit avec le contexte de l'application.

La raison pour laquelle cela nécessite la version 12 de l'API est que InputMethodService doit implémenter OnAttachStateChangeListener afin d'être averti lorsque la vue d'entrée est attachée à une fenêtre; essayer d'exécuter ce code plus tôt aboutit à un jeton nul. Il est probable qu'il y ait un autre endroit plus tard dans le cycle de vie pour mettre la demande de jeton, mais puisque mon IME avait déjà ces exigences d'API, je n'ai pas cherché à en trouver un.

Le code:

public class SampleKeyboardService extends InputMethodService 
            implements OnAttachStateChangeListener { 
    private View mInputView; 
    private ProgressDialog mProgress; 

    @Override 
    public View onCreateInputView() { 
     super.onCreateInputView(); 
     LayoutInflater inflater = 
      (LayoutInflater) getSystemService(Service.LAYOUT_INFLATER_SERVICE); 
     mInputView = inflater.inflate(R.layout.input, null); 
     mInputView.addOnAttachStateChangeListener(this); 
     return mInputView; 
    } 

    /* ... */ 

    @Override 
    public void onViewAttachedToWindow(View view) { 
     Window progressWindow = mProgress.getWindow(); // mProgress created earlier 
     WindowManager.LayoutParams layoutParams = progressWindow.getAttributes(); 
     layoutParams.token = view.getWindowToken(); 
     layoutParams.type = 
      WindowManager.LayoutParams.TYPE_APPLICATION_ATTACHED_DIALOG; 
     progressWindow.setAttributes(layoutParams); 
    } 
} 

Voir aussi https://stackoverflow.com/a/13962770/793212

Questions connexes