调用popupwindow的showAtLocation会导致应用程序崩溃

Mau*_*rez 10 android popup

我有一个从a扩展的类,View我试图显示popupWindow使用此代码

public class dbView extends View implements View.OnTouchListener {

    private void showDialog(String msg) {
        LayoutInflater layoutInflater;
        View dialogContent;
        final PopupWindow popupWindow;

        layoutInflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        dialogContent = layoutInflater.inflate(R.layout.pop_up_dialog, null);

        popupWindow = new PopupWindow(
                dialogContent,
                ViewGroup.LayoutParams.WRAP_CONTENT,
                ViewGroup.LayoutParams.WRAP_CONTENT);

        popupWindow.showAtLocation(this, Gravity.CENTER, 10, 10);

    }

}
Run Code Online (Sandbox Code Playgroud)

我的应用程序在尝试执行最后一行时崩溃.异常的消息是

无法在未调用Looper.prepare()的线程内创建处理程序

我已经找到了与该消息相关的答案,并且所有这些都涉及弹出窗口是在一个单独的线程上创建的,我应该使用 runOnUIThread但是如果我在VIEW中,我需要这个吗?这个问题的原因是什么?

Ell*_*ltz 4

这取决于你在哪里调用showDialog(String msg),我知道你是从 View 类调用它,但这并不意味着它在 UI 线程上,View 调用是在 UI 线程上处理的,但是如果你在 Thread 中进行 View 调用,你就会出现这个错误。我知道相同的代码可以自行解决,但是如果您在 View 类中运行 TimerTask 或 Threads,则应该仔细检查它们。而且runOnUithread您也可以在 View 类中调用post(runnable);(相同的机制Handler),这将确保可运行的调用将被发送到主线程。

简而言之,检查一下您在View课堂上调用它的位置