这是我的问题:
我正在尝试显示一个AlertDialog,但我似乎无法做到。
这是我的代码:
tv.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View arg0)
{
final EditText input = new EditText(c);
AlertDialog.Builder adb = new AlertDialog.Builder(c);
adb.setTitle(lb)
.setMessage("Test")
.setView(input)
.setPositiveButton("Ok", new DialogInterface.OnClickListener()
{
@Override
public void onClick(DialogInterface dialog, int which)
{
//tv.setText(input.getEditableText().toString());
Toast.makeText(c, input.getEditableText().toString(), Toast.LENGTH_LONG).show();
}
})
.setNegativeButton("Cancel", new DialogInterface.OnClickListener()
{
public void onClick(DialogInterface dialog, int whichButton)
{
dialog.cancel();
}
}).show();
}
});
我想在用户点击标签时显示此AlertDialog,然后在用户按OK时使用编辑文本更改标签值。
但是当谈到点击对话框时,它会崩溃。
07-18 16:04:59.240: E/AndroidRuntime(10503): FATAL EXCEPTION: main
07-18 16:04:59.240: E/AndroidRuntime(10503): android.view.WindowManager$BadTokenException: Unable to add window --
token null is not for an application
07-18 16:04:59.240: E/AndroidRuntime(10503): at android.view.ViewRootImpl.setView(ViewRootImpl.java:710)
07-18 16:04:59.240: E/AndroidRuntime(10503): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:345)
07-18 16:04:59.240: E/AndroidRuntime(10503): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:224)
07-18 16:04:59.240: E/AndroidRuntime(10503): at android.view.WindowManagerImpl$CompatModeWrapper.addView(WindowManagerImpl.java:149)
07-18 16:04:59.240: E/AndroidRuntime(10503): at android.app.Dialog.show(Dialog.java:277)
07-18 16:04:59.240: E/AndroidRuntime(10503): at android.app.AlertDialog$Builder.show(AlertDialog.java:932)
07-18 16:04:59.240: E/AndroidRuntime(10503): at com.technicachat.webdatadomo.Consignes$2$1.run(Consignes.java:114)
07-18 16:04:59.240: E/AndroidRuntime(10503): at android.app.Activity.runOnUiThread(Activity.java:4784)
07-18 16:04:59.240: E/AndroidRuntime(10503): at com.technicachat.webdatadomo.Consignes$2.onClick(Consignes.java:90)
07-18 16:04:59.240: E/AndroidRuntime(10503): at android.view.View.performClick(View.java:4211)
07-18 16:04:59.240: E/AndroidRuntime(10503): at android.view.View$PerformClick.run(View.java:17267)
07-18 16:04:59.240: E/AndroidRuntime(10503): at android.os.Handler.handleCallback(Handler.java:615)
07-18 16:04:59.240: E/AndroidRuntime(10503): at android.os.Handler.dispatchMessage(Handler.java:92)
07-18 16:04:59.240: E/AndroidRuntime(10503): at android.os.Looper.loop(Looper.java:137)
07-18 16:04:59.240: E/AndroidRuntime(10503): at android.app.ActivityThread.main(ActivityThread.java:4898)
07-18 16:04:59.240: E/AndroidRuntime(10503): at java.lang.reflect.Method.invokeNative(Native Method)
07-18 16:04:59.240: E/AndroidRuntime(10503): at java.lang.reflect.Method.invoke(Method.java:511)
07-18 16:04:59.240: E/AndroidRuntime(10503): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1006)
07-18 16:04:59.240: E/AndroidRuntime(10503): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:773)
07-18 16:04:59.240: E/AndroidRuntime(10503): at dalvik.system.NativeStart.main(Native Method)
我收到此消息之前的行数较少:
07-18 16:04:56.645: I/Choreographer(10503): Skipped 32 frames! The application may be doing too much work on its main thread.
我知道这意味着什么,但我只是展示一个对话框,这不是很多工作!
我希望你们能帮助我!
再见
答案 0 :(得分:25)
您的变量c
应为YourActivity.this
而不是getApplicationContext()
答案 1 :(得分:2)
我从1,2天开始面对这个问题,但我通过改变
解决了这个问题final Dialog dialogView = new Dialog(getApplicationContext());
到
final Dialog dialogView = new Dialog(Leave_Notification_Activity.this);
你不应该使用getApplicationContext()来传递YourActivity.this来解决这个问题。
答案 2 :(得分:1)
您需要考虑几件事情。
您正在自定义警报对话框,例如定位按钮和设置边距等布局参数。
如果您这样做,使用V7支持的警报对话框将解决问题。确保已在项目中导入 v7支持库。
将android.app.AlertDialog.Builder
更改为android.support.v7.app.AlertDialog.Builder
您正在活动的Activity或子类中或片段内创建警报对话框 使用
始终传递活动上下文并不 baseContext
或applicationContext
传递错误的上下文(例如applicationContext或baseContext)将导致WindowManager-BadToken异常
在活动中......
AlertDialog.Builder dialog = new AlertDialog.Builder(this);
在活动的子类......
AlertDialog.Builder dialog = new AlertDialog.Builder(MainActivity.this);
在片段中......
AlertDialog.Builder dialog = new AlertDialog.Builder(getActivity()); // Activity inherits from Context and hence will work.
我发现,对警报对话框进行大量自定义可以很好地与v7 Support AlertDialog类配合使用。
在我的情况下,如果有多个按钮,我必须将警报对话框的按钮居中并设置左右边距。将导入更改为v7支持解决了该问题。
希望这有帮助。
答案 3 :(得分:0)
试试这个吐司。
Toast.makeText(getApplicationContext(), input.getEditableText().toString(), Toast.LENGTH_LONG).show();
答案 4 :(得分:0)
如果没有创建AlertDialog
类对象,则无法显示任何内容。
AlertDialog ad=adb.create();
ad.show();
现在它可以检查一次。
答案 5 :(得分:0)
如果您使用的是Kotlin,则应使用this@YourActivity
而不是applicationContext
。
答案 6 :(得分:0)
就我而言,只需在builder中添加一个主题: AlertDialog.Builder(this,R.style.MyDialogTheme)