android DialogFragment android:onClick=“buttonCancel” causes IllegalStateException could not find a method

匿名 (未验证) 提交于 2019-12-03 03:03:02

问题:

I have a problem with my Dialog Fragment. I wanted to use android:onClick attribute as in my opinion code is more clear then.

In my layout I have the following declaration:

<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"         /> 

Now my 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) {      }  } 

I now when I try to click cancel button I get:

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 

Any idea? Is that perhaps somehow related with the fact I use import android.support.v4.app.DialogFragment (support v4)? How to solve that (I still would prefer to use android:onClick in xml layout).

回答1:

I would try a different approach which works fine for me:

  1. implement an OnClickListener into your fragment:

    public class DialogNewDatabase extends DialogFragment implements OnClickListener` 
  2. have a button with an unique id in xml, which does NOT need android:clickable

    <Button  android:id="@+id/dialog_new_database_button_cancel" /> 
  3. override the method onClick() within your fragment and insert a reaction on your click:

    public void onClick(View v) {          switch (v.getId()) {     case R.id.dialog_new_database_button_cancel:         // your stuff here         this.dismiss();          break;               default:                         break;    } }    
  4. import the necessary:

    import android.view.View.OnClickListener;  
  5. start the onClickListener on the button:

    private Button bCancel = null; bCancel = (Button) findViewById(R.id.dialog_new_database_button_cancel); bCancel.setOnClickListener(this); // it is possible that you might need the refrence to the view. // replace 2nd line with (Button) getView().findViewById(...); 

    This way you can handle even more clickable buttons in the same onClick-method. You just need to add more cases with the proper ids of your clickable widgets.



回答2:

I don't think that is related to the support fragment.

The issue seems to arise from the fact that you are registering a onClick on XML that fires up based on the activity that the fragment was binded at the time of the click.

As your "buttonCancel" method does not exists in the activity (because it is inside the fragment), it fails.

I don't think that really is a desirable solution, but you can register your "buttonCancel" method on your activity for that error to go away, and make that "buttonCancel" method registered on the activity only call the method that exists in the fragment, in case you want to keep your action / view behaviour inside the fragment.



回答3:

Try:

@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;      private void buttonCancel (View view) {     dismiss();     }     private void buttonOK (View view) {     } } 


易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!