2017-06-19 9 views
-3

私はLoginボタンを押すと、setError関数を使ってユーザ名とパスワードのedittextを検証しているので、PopupWindowをログイン用に実装しました。しかし、アプリケーションがクラッシュする例外"android.view.WindowManager $ BadTokenException:ウィンドウを追加することができません"PopupWindow:Editextの設定エラーがアンドロイドの不正なトークンエラーを示していますか?

その解決策はありますか?

Activity activity; 
PopupWindow popupLogin; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    toolbar = (Toolbar) findViewById(R.id.toolbar); 
    setSupportActionBar(toolbar); 
    activity = this; 

} 


    @Override 
     public boolean onOptionsItemSelected(MenuItem item) { 
      switch (item.getItemId()) { 
       case R.id.menu_login: 
        if (popupLogin == null || !popupLogin.isShowing()) 
         showLogin(); 

        return true; 

       default: 
        return super.onOptionsItemSelected(item); 
      } 
     } 


    private void showLogin() { 
      LayoutInflater inflater = (LayoutInflater) activity 
        .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      View popupView = inflater.inflate(R.layout.dialog_login, 
        null); 

      popupLogin = new PopupWindow(
        popupView, LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT); 
      Display display = activity.getWindowManager().getDefaultDisplay(); 
      popupLogin.setFocusable(true); 
      popupLogin.update(); 
      Point size = new Point(); 
      display.getSize(size); 


      Rect rectangle = new Rect(); 
      Window window = activity.getWindow(); 
      window.getDecorView().getWindowVisibleDisplayFrame(rectangle); 
      int topbar = rectangle.top + toolbar.getHeight(); 
      edtBroker = (EditText) popupView.findViewById(R.id.edit_broker_code); 
      edtUname = (EditText) popupView.findViewById(R.id.edit_username); 
      edtPwd = (EditText) popupView.findViewById(R.id.edit_pwd); 
      // popupLogin.setAnimationStyle(R.style.PopupWindowAnimation); 
      popupView.findViewById(R.id.btn_cancel).setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View view) { 
        popupLogin.dismiss(); 

       } 
      }); 
      popupView.findViewById(R.id.btn_login).setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View view) { 


        if (validate()) { 
         popupLogin.dismiss(); 
         doLogin(edtBroker.getText().toString().trim(), edtUname.getText().toString().trim(), edtPwd.getText().toString().trim()); 
        } 
       } 
      }); 

      popupLogin.showAtLocation(toolbar, Gravity.NO_GRAVITY, 0, topbar); 


     } 


private boolean validate() { 

     if (TextUtils.isEmpty(edtBroker.getText().toString())) { 
      edtBroker.setError(getString(R.string.plz_broker_code));//getting exception here 
      edtBroker.requestFocus(); 
      return false; 
     } 
     if (TextUtils.isEmpty(edtUname.getText().toString())) { 
      edtUname.setError(getString(R.string.plz_enter_username)); 
      edtUname.requestFocus(); 
      return false; 
     } 
     if (TextUtils.isEmpty(edtPwd.getText().toString())) { 
      edtPwd.setError(getString(R.string.plz_enter_password)); 
      edtPwd.requestFocus(); 
      return false; 
     } 
     if (!NetworkStatus.getConnectivityStatus(activity)) { 
      CommonUtility.showAlertToast(activity, getString(R.string.check_internet), ""); 
      return false; 
     } 

     return true; 
    } 

例外:

致命的な例外:メイン プロセス:com.app.stockeyez、PID:29076 android.view.WindowManager $ BadTokenException:ウィンドウを追加することができません - トークンandroid.view .ViewRootImpl $ W @ 33b573bは無効です。あなたの活動は実行されていますか? android.view.WindowManagerImpl.addViewでandroid.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:310) でandroid.view.ViewRootImpl.setView(ViewRootImpl.java:579) (WindowManagerImpl.java:85) ででandroid.widget.PopupWindow.invokePopup(PopupWindow.java:1258)android.widget.PopupWindow.showAsDropDown(PopupWindow.java:1110)で android.widget.PopupWindow.showAsDropDown(PopupWindow.java:1069)で アンドロイドで 。ウィジェット.Editor.showError(Editor.java:445) android.widget.Editor.setError(Editor.java:466) android.widget.TextView.setError(TextVie (MainActivity.java:484) at com.app.stockeyez.MainActivity。 $ 100(MainActivity.java:52) com.app.stockeyez.MainActivity $ 3.onClick(MainActivity.java:278) at android.view.View.performClick(View.java:5207) android.viewにアクセスしてください。 $ PerformClick.runを見る(View.java:21168) android.os.Handler.handleCallback(Handler.java:746) (android.os.Handler.dispatchMessage(Handler.java:95) )はアンドロイド。 Looper.loop(Looper.java:148) のandroid.app.ActivityThread.main(ActivityThread.java:5443) のjava.lang.reflect.Method.invoke(ネイティブメソッド) at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java :728) com.android.internal.os.ZygoteInit.mainで(ZygoteInit.java:618)

+0

エラーが発生した場所でコードを共有できますか? – sumit

+0

エラーが発生しましたedtBroker.setError(getString(R.string.plz_broker_code)); –

+0

誰かが私の質問に投票した理由を教えてください。私は実際にこの例外を受け取ります –

答えて

1

私はあなたがあなたの活動にapplicationContext()を使用していると思います。

getApplicationContext()の代わりに、ActivityName.thisを使用してください。

私はあなたの問題を解決すると思います。

+0

Dipali、間違っていることを私のコードで確認してください。 getApplicationContextを使用していません。 –

+0

getString()の代わりにgetResource()。getstring()を使用しました。 – dipali

+0

は試しましたが、まだ動作していません。ハードコーディングされたメッセージでも同じエラーが発生しました –

関連する問題