2017-06-19 65 views
-3

我已經實現了用於登錄的PopupWindow,當我按下Login按鈕時,我正在使用setError函數驗證用戶名和密碼的edittext。但應用程序崩潰,異常「android.view.WindowManager $ BadTokenException:無法添加窗口」PopupWindow:Editext設置錯誤在Android中顯示錯誤的令牌錯誤?

任何解決方案呢?

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.ViewRootImpl.setView(ViewRootImpl.java:579) 在android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:310) 在android.view.WindowManagerImpl.addView(WindowManagerImpl.java:85) 在android.widget.PopupWindow.invokePopup(PopupWindow.java:1258) 在android.widget.PopupWindow.showAsDropDown(PopupWindow.java:1110) 在android.widget.PopupWindow.showAsDropDown(PopupWindow.java:1069) 在機器人。 widget.Editor.showError(Editor.java:445) at android.widget.Editor.setError(Editor.java:466) at android.widget.TextView.setError(TextVie w.java:4943) at com.app.stockeyez.MainActivity。com.app.stockeyez.MainActivity.validate(MainActivity.java:484) at android.widget.TextView.setError(TextView.java:4928) 。訪問$ 100(MainActivity.java:52) at com.app.stockeyez.MainActivity $ 3.onClick(MainActivity.java:278) at android.view.View.performClick(View.java:5207) at android.view。查看$ PerformClick.run(View.java:21168) 在android.os.Handler.handleCallback(Handler.java:746) 在android.os.Handler.dispatchMessage(Handler.java:95) 在android.os。 Looper.loop(Looper.java:148)(本地方法) 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

使用getResource()。getstring()而不是getString() – dipali

+0

嘗試過,但仍然無法正常工作。也遇到硬編碼的消息,但同樣的錯誤 –