我有一个从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中,我需要这个吗?这个问题的原因是什么?
这取决于你在哪里调用showDialog(String msg),我知道你是从 View 类调用它,但这并不意味着它在 UI 线程上,View 调用是在 UI 线程上处理的,但是如果你在 Thread 中进行 View 调用,你就会出现这个错误。我知道相同的代码可以自行解决,但是如果您在 View 类中运行 TimerTask 或 Threads,则应该仔细检查它们。而且runOnUithread您也可以在 View 类中调用post(runnable);(相同的机制Handler),这将确保可运行的调用将被发送到主线程。
简而言之,检查一下您在View课堂上调用它的位置