【发布时间】:2014-05-25 02:05:07
【问题描述】:
我的对话片段有问题。我想使用 android:onClick 属性,因为我认为代码更清晰。
在我的布局中,我有以下声明:
<Button
android:id="@+id/dialog_new_database_button_cancel"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="@string/button_cancel"
android:maxLines="1"
style="?android:attr/buttonBarButtonStyle"
android:onClick="buttonCancel"
/>
现在是我的 DialogFragment
import android.os.Bundle;
import android.support.v4.app.DialogFragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
public class DialogNewDatabase extends DialogFragment {
public DialogNewDatabase() {
// Empty constructor required for DialogFragment
super();
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
super.onCreateView (inflater, container, savedInstanceState);
View view = inflater.inflate(R.layout.dialog_new_database, container);
getDialog().setTitle("Hello");
return view;
}
@Override
public void onCreate(Bundle bundle) {
setCancelable(true);
setRetainInstance(true);
super.onCreate(bundle);
}
@Override
public void onDestroyView() {
if (getDialog() != null && getRetainInstance())
getDialog().setDismissMessage(null);
super.onDestroyView();
}
public void buttonCancel (View view) {
dismiss();
}
public void buttonOK (View view) {
}
}
现在当我尝试单击取消按钮时,我得到:
java.lang.IllegalStateException: Could not find a method buttonCancel(View) in the activity class android.view.ContextThemeWrapper for onClick handler on view class android.widget.Button with id 'dialog_new_database_button_cancel'
at android.view.View$1.onClick(View.java:3031)
at android.view.View.performClick(View.java:3511)
at android.view.View$PerformClick.run(View.java:14105)
at android.os.Handler.handleCallback(Handler.java:605)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4482)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:787)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:554)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.NoSuchMethodException: buttonCancel [class android.view.View]
at java.lang.Class.getConstructorOrMethod(Class.java:460)
at java.lang.Class.getMethod(Class.java:915)
at android.view.View$1.onClick(View.java:3024)
... 11 more
有什么想法吗?这可能与我使用 import android.support.v4.app.DialogFragment (support v4) 的事实有关吗?如何解决(我还是更喜欢在 xml 布局中使用 android:onClick)。
【问题讨论】:
-
@gunar 它不能解决问题。该讨论仅表明无法在使用 Fragments 时管理 onClick。
-
您的问题是您使用的是
onClick属性。在那个链接中,我强调了为什么不应该使用这个属性。但是如果你很固执并且想要使用它,在这种情况下,你必须将 Activity 的操作委托给DialogFragment,就像下面的 reis_eliel 回答一样。 -
@gunar 非常感谢您的帮助。我可能会使用传统的 setOnClickListener(new Button.OnClickListener() { ... 但我真的不明白为什么 google 会添加一些不起作用的东西。(
-
它们有效,但您不知道如何使用它们:P ...顺便说一句,将您的问题标记为已接受。否则人们会停止回复你。
标签: java android android-layout