2

以下のコードで Eclipse からエラーが発生するのはなぜですか?

コード:

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();
    }
 }

エラー:

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)

softKeyboard(InputMethodService)の起動時にprogressDialogでウィンドウを開く最適な解決策は何ですか?

「new ProgressDialog( this);」、「new ProgressDialog( getApplicationContext());」を試す 代わりに「new ProgressDialog( ServiceKeyboard.this);」ですが、失敗します。

4

2 に答える 2

1

アクティビティが関連付けられていない InputMethodService を作成すると、同様の問題が発生しました。

これは API バージョン 12 以降でのみ機能しますが、入力ビューで使用されるウィンドウ トークンを渡すことで、ProgressDialog を表示することができました。それが発生する限り、ProgressDialog はアプリケーション コンテキストで構築できます。

これが API バージョン 12 を必要とする理由は、入力ビューがウィンドウにアタッチされたときに通知を受けるために、InputMethodService が OnAttachStateChangeListener を実装する必要があるためです。そのコードを先に実行しようとすると、null トークンが発生します。ライフサイクルの後半に、トークン リクエストを配置する別の場所が存在する可能性がありますが、私の IME にはこれらの API 要件が既に存在していたので、探す必要はありませんでした。

コード:

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);
  }
}

https://stackoverflow.com/a/13962770/793212も参照してください。

于 2013-09-24T22:29:19.303 に答える
0

Activity から ProgressDialog を呼び出してみてください。それはあなたの問題を解決します。あなたがやろうとしていることについてもっと説明してください。

于 2012-11-23T13:23:14.713 に答える