私は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)
エラーが発生した場所でコードを共有できますか? – sumit
エラーが発生しましたedtBroker.setError(getString(R.string.plz_broker_code)); –
誰かが私の質問に投票した理由を教えてください。私は実際にこの例外を受け取ります –