java android dialog onclick nosuchmethod

java - Error de Android Dialog NoSuchMethodException al usar XML onClick



(5)

Soy nuevo en Java y Android, y estoy trabajando en mi primera aplicación de prueba.

He progresado con eso, pero estoy bloqueado con un cuadro de diálogo.

Muestro el diálogo de la actividad de esta manera:

//BuyActivity.java public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_shop); initialize_PR(); display_PR(); BuyDialog=new Dialog(this); BuyDialog.setContentView(R.layout.dialog_buy); } public void Action_ShowDialog_Buy(View view) { BuyDialog.show() ; }

Y el diálogo se muestra correctamente cuando se hace clic en el botón de la actividad que activa Action_ShowDialog_Buy. Pero después de eso, el Diálogo mismo tiene un botón:

<!-- dialog_buy.xml --> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" > <!-- Other stuff --> <Button android:id="@+id/Button_Buy" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/Some_Other_Stuff" android:layout_centerHorizontal="true" android:text="@string/button_buy" android:onClick="Action_ShowDialog_Buy" /> </RelativeLayout>

El método de botón Action_ShowDialog_Buy se implementa en la actividad:

public void Action_ShowDialog_Buy(View view) { BuyDialog.dismiss() ; }

pero cuando hago clic en el botón en el cuadro de diálogo recibo el error:

java.lang.IllegalStateException: Could not find a method BuyActivity.Action_ShowDialog_Buy(View) in the activity class android.view.ContextThemeWrapper for onClick handler on view class android.widget.Button with id ''Button_Buy''

y por debajo:

Caused by: java.lang.NoSuchMethodException:BuyActivity.Action_ShowDialog_Buy

pero como puede ver arriba, el método existe en la Actividad.

Creo que entiendo que este es un tipo de problema de alcance, pero no logro entenderlo. Tenga en cuenta que he leído Usar el atributo onClick en el diseño xml causa una excepción NoSuchMethodException en los diálogos de Android, pero necesito entender, no solo para copiar el código.

Muchas gracias


Está intentando llamar al método "Action_ShowDialog_Buy", pero este método no existe en el objeto Dialog. Este método no debería estar en la Actividad, si lo especifica en el xml. Si desea manejar el clic en la Actividad, debe establecer onClickListener programáticamente:

Button b=(Button)BuyDialog.findViewById(R.id.Button_Buy); b.setOnClickListener(new OnClickListener(){ @Override onClick(View v){ BuyDialog.dismiss(); } });


y por debajo:

Caused by: java.lang.NoSuchMethodException:BuyActivity.ActionShowDialog_Buy

bloquear en este ActionShowDialog_Buy se olvida simbol _ en nombre del método


Tienes que usar set haciendo clic en true en tu archivo xml.

<!-- dialog_buy.xml --> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" > <!-- Other stuff --> <Button android:id="@+id/Button_Buy" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/Some_Other_Stuff" android:layout_centerHorizontal="true" android:text="@string/button_buy" android:onClick="Action_ShowDialog_Buy" android:clickable="true" /> </RelativeLayout>


Gracias a todos los que intentaron ayudar.

Me las he arreglado para resolver esto creando una clase derivada de Dialog y usándola, usando este código:

import android.app.Dialog; import android.content.Context; import android.os.Bundle; import android.view.LayoutInflater; import android.widget.RelativeLayout; public class BuyDialogClass extends Dialog { //Ensure this Dialog has a Context we can use Context mContext ; public BuyDialogClass(Context context) { super(context); mContext=context; //Store the Context as provided from caller } @Override protected void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); RelativeLayout ll=(RelativeLayout) LayoutInflater.from(mContext).inflate(R.layout.dialog_buy, null); setContentView(ll); } }

Esto me permitió llamar al diálogo de esta manera:

public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_shop); initialize_PR(); display_PR(); BuyDialog=new BuyDialogClass(this); //The setContentView is not necessary here as we call it on the onCreate //We can NOT access Dialog widgets from here, //because the dialog has not yet been shown. } public void Action_ShowDialog_Buy(View view) { BuyDialog.show() ; //NOW, after showing the dialog, we can access its widgets jobject_SeekBar_buy= (SeekBar) BuyDialog.findViewById(R.id.SeekBar_Dialog_Buy) ; jobject_SeekBar_buy.setMax(PR_num_coins/currentPR_buy_price) ; jobject_SeekBar_buy.setOnSeekBarChangeListener(this); } public void Action_Buy_PR(View view) { BuyDialog.dismiss() ; }

Logré hacer esto leyendo el atributo Utilizar onClick en el diseño xml provoca una excepción NoSuchMethodException en los diálogos de Android, pero sigo sin entender este problema de contexto.


El cuadro de diálogo usa ContextThemeWrapper

Ahora, excepción que estamos recibiendo ...

java.lang.IllegalStateException: Could not find a method android:onClick="method" in the activity class android.view.ContextThemeWrapper for onClick handler on view class android.widget.RadioButton with id ''statusSuspend''

Para deshacerte de esto, solo usa el inflador apropiado

LayoutInflater.from (context) en su lugar

  1. ((LayoutInflater) getSystemService (Context.LAYOUT_INFLATER_SERVICE))

  2. getLayoutInflater ()

Evite void setContentView (int layoutResID) en su lugar use void setContentView (View view)

Y use el mismo contexto en el constructor Dialog ie super (context)

Finalmente, no olvide definir android: onClick = "method" en Activity en su clase personalizada