我创建了一个自定义对话框和一个布局xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Tap Me"
android:onClick="dialogClicked" />
</LinearLayout>
在对话框类中,我实现了“dialogClicked(View v)”方法:
public class TestDialog extends Dialog {
public TestDialog(final Context context)
{
super(context);
}
@Override
protected void onCreate(final Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.dialog);
}
public void dialogClicked(final View view)
{
System.out.println("clicked");
}
}
当我点击按钮时,我得到一个NoSuchMethodException'dialogClicked'。在布局xml中设置onClick处理程序适用于活动,但不适用于对话框。有任何想法吗?我做错了什么?
答案 0 :(得分:25)
在Activity中定义方法(dialogClicked)。 并修改TestDialog,如下面的代码:
public class TestDialog extends Dialog {
Context mContext;
public TestDialog(final Context context)
{
super(context);
mContext=context;
}
@Override
protected void onCreate(final Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
LinearLayout ll=(LinearLayout) LayoutInflater.from(mContext).inflate(R.layout.dialog, null);
setContentView(ll);
}
}
我认为它有效:)
答案 1 :(得分:6)
我认为这个问题属于范围之一。我不确定你是如何在xml中解决这个问题的,但是你的布局xml中的dialogClicked方法基本上不知道在哪里找到你在对话框类中定义的方法。
我看到在自定义布局中绑定按钮的标准方法如下。
public class TestDialog extends Dialog implements android.view.View.OnClickListener
{
protected void onCreate(final Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.dialog);
((Button)findViewById(R.id.dialog_btn_mybutton)).setOnClickListener(this);
}
public void onClick(View view)
{
switch (view.getId())
{
case R.id.dialog_btn_mybutton:
//do stuff
// dismiss();
// cancel etc.
break;
}
}
}
希望有所帮助。仍然有兴趣知道是否有使用xml onClick绑定到该方法的解决方案。也许setContentView中还有一个参数?其他东西。
答案 2 :(得分:2)
我在View.java源代码中找到了以下代码:
public void onClick(View v) {
if (mHandler == null) {
try {
mHandler = getContext().getClass().getMethod(handlerName,
View.class);
...
- &GT;视图使用其上下文来解析onclick处理程序方法。
Noew来自Dialog.java源代码中的以下代码:
public Dialog(Context context, int theme) {
mContext = new ContextThemeWrapper(context, theme == 0 ? com.android.internal.R.style.Theme_Dialog : theme);
...
在对话框的构造函数中,创建ContextThemeWrapper的实例并将其设置为context。此实例既不是自定义对话框类,也不是调用活动,它可以是实现处理程序方法的地方。因此,视图无法找到onclick处理程序方法。
但我必须使用onclick XML attribut。有没有可用的解决方法?
答案 3 :(得分:1)
对话需要签名
dialogClicked(DialogInterface dialog, int id) { ... }
答案 4 :(得分:1)
android:onClick="method"
非常酷,但它在Android 1.5上无效,所以我一段时间都在避免。
简单的解决方法:
让Dialog
成为Activity
并使用android:theme="@android:style/Theme.Dialog"
中的AndroidManifest
。
答案 5 :(得分:1)
继Jett Hsieh的帖子之后,我使用showDialog和dismissDialog稍微改变了我的对话框,但获得android:onClick工作的基本原理是相同的,我的示例代码在下面以供将来参考。
public class ExampleActivity extends Activity {
static final int DIALOG_DISCLAIMER = 0;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
showDialog(DIALOG_DISCLAIMER);
}
protected Dialog onCreateDialog(int id)
{
Dialog dialog;
switch(id)
{
case DIALOG_DISCLAIMER:
dialog = new Dialog(this);
dialog.setContentView(R.layout.main_disclaimer);
LinearLayout ll = (LinearLayout) LayoutInflater.from(this).inflate(R.layout.main_disclaimer, null);
dialog.setContentView(ll);
break;
default:
dialog = null;
}
return dialog;
}
public void onClick(View v)
{
switch(v.getId())
{
case R.id.maindisclaimer_button_accept:
dismissDialog(DIALOG_DISCLAIMER);
break;
}
}
}
布局文件:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:id="@+id/linearLayout1"
android:padding="10dp"
android:orientation="vertical"
android:background="@drawable/roundedcorners">
<Button
android:id="@+id/maindisclaimer_button_accept"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="@string/string_accept"
android:onClick="onClick" >
</Button>
</LinearLayout>
答案 6 :(得分:0)
尝试在活动中定义该方法(dialogClicked),而不是在对话框中定义。
它可能使用反射,因此如果您使用不同的活动,只需在每个可能显示该对话框的活动中编写该方法
答案 7 :(得分:0)
一个对话框始终创建并显示为活动的一部分。根据Android参考资料:
If you decide to create a dialog outside of the onCreateDialog() method, it will not be attached to an Activity. You can, however, attach it to an Activity with setOwnerActivity(Activity).
另外,您是否正在传递getApplicationContext()返回的对象;到TestDialog的构造函数?
答案 8 :(得分:0)
系统查找布局膨胀的方法,或者将xml设置为内容的活动类。