Se bloquea la aplicación de Android (fragmento y xml onclick)

second_fragment.xml

  

SecondFragment.java

  public class SecondFragment extends Fragment { FragmentInterface iface; public interface FragmentInterface { public void buttonPressed(); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.second_fragment, container, false); } @Override public void onAttach(Activity activity) { super.onAttach(activity); // This makes sure that the container activity has implemented // the callback interface. If not, it throws an exception try { iface = (FragmentInterface) activity; } catch (ClassCastException e) { throw new ClassCastException(activity.toString() + " must implement FragmentInterface"); } } public void button(View view) { } } 

Soy novato y no tengo idea de por qué mi aplicación falla, cuando se presiona el botón? ¿Alguien puede explicar?

 01-03 13:28:25.612: E/AndroidRuntime(1276): FATAL EXCEPTION: main 01-03 13:28:25.612: E/AndroidRuntime(1276): java.lang.IllegalStateException: Could not find a method button(View) in the activity class com.sp.fragments.MainActivity for onClick handler on view class android.widget.Button with id 'f2_button' 01-03 13:28:25.612: E/AndroidRuntime(1276): at android.view.View$1.onClick(View.java:3584) 01-03 13:28:25.612: E/AndroidRuntime(1276): at android.view.View.performClick(View.java:4202) 01-03 13:28:25.612: E/AndroidRuntime(1276): at android.view.View$PerformClick.run(View.java:17340) 01-03 13:28:25.612: E/AndroidRuntime(1276): at android.os.Handler.handleCallback(Handler.java:725) 01-03 13:28:25.612: E/AndroidRuntime(1276): at android.os.Handler.dispatchMessage(Handler.java:92) 01-03 13:28:25.612: E/AndroidRuntime(1276): at android.os.Looper.loop(Looper.java:137) 01-03 13:28:25.612: E/AndroidRuntime(1276): at android.app.ActivityThread.main(ActivityThread.java:5039) 01-03 13:28:25.612: E/AndroidRuntime(1276): at java.lang.reflect.Method.invokeNative(Native Method) 01-03 13:28:25.612: E/AndroidRuntime(1276): at java.lang.reflect.Method.invoke(Method.java:511) 01-03 13:28:25.612: E/AndroidRuntime(1276): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 01-03 13:28:25.612: E/AndroidRuntime(1276): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 01-03 13:28:25.612: E/AndroidRuntime(1276): at dalvik.system.NativeStart.main(Native Method) 01-03 13:28:25.612: E/AndroidRuntime(1276): Caused by: java.lang.NoSuchMethodException: button [class android.view.View] 01-03 13:28:25.612: E/AndroidRuntime(1276): at java.lang.Class.getConstructorOrMethod(Class.java:460) 01-03 13:28:25.612: E/AndroidRuntime(1276): at java.lang.Class.getMethod(Class.java:915) 01-03 13:28:25.612: E/AndroidRuntime(1276): at android.view.View$1.onClick(View.java:3577) 01-03 13:28:25.612: E/AndroidRuntime(1276): ... 11 more 01-03 13:28:27.563: I/Process(1276): Sending signal. PID: 1276 SIG: 9 

Actividad:

Si tiene actividad y define el atributo android:onClick en XML, solo necesita definir un método con el mismo nombre en Activity.

Fragmento:

Pero cada vez que tenga Fragment y quiera definir click listener simplemente definiendo el atributo android:onClick , deberá definir un método con el mismo nombre en la actividad real desde donde se ha llamado a Fragment.

O, y de lo contrario, simplemente puede implementar un oyente de clic programáticamente.

Se ahorrará muchos problemas configurando onClickListener programáticamente (en lugar de a través de XML). Esto debería ayudarte a hacer lo que estás tratando de hacer:

 @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { final View view = inflater.inflate(R.layout.second_fragment, container, false); final View button = view.findViewById(R.id.f2_button); button.setOnClickListener( new OnClickListener() { @Override public void onClick(View v) { /* DO SOMETHING UPON THE CLICK */ } } ); return view; } 

Si defines onClick="button" en tu .xml, necesitas definir un método llamado public void button(View v) en la Actividad que llama al fragmento, no en el fragmento mismo.

 public class MainActivity extends FragmentActivity{ ... public void button(View v){ ... } ... } 

Su botón de método debe definirse en la clase MainActivity.

Esto ha funcionado para mí: (Android studio)

  @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.update_credential, container, false); Button bt_login = (Button) rootView.findViewById(R.id.btnSend); bt_login.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { System.out.println("Hi its me"); }// end onClick }); return rootView; }// end onCreateView