I'm new to Java and Android, and I'm working on my first test app.
I've progressed with it, but I'm blocked with a Dialog.
I show the dialog from the Activity like this:
//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() ;
}
And the dialog is correctly shown when the button of the Activity that triggers Action_ShowDialog_Buy is clicked. But after that, the Dialog itself has a button:
<!-- 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>
The button method Action_ShowDialog_Buy is implemented on the Activity:
public void Action_ShowDialog_Buy(View view) {
BuyDialog.dismiss() ;
}
but when I click on the Button in the Dialog I receive the 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'
and below:
Caused by: java.lang.NoSuchMethodException:BuyActivity.Action_ShowDialog_Buy
but as you can see above, the method exists on the Activity.
I think I understand this is some kind of scope issue, but I do not manage to understand it. Please note that I have readed Using onClick attribute in layout xml causes a NoSuchMethodException in Android dialogs but I need to understand, not just to copy code.
Many thanks
Thanks to everyone that tried to help.
I've managed to sort this out by creating a class derived from Dialog and using it, using this code:
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);
}
}
This allowed me to call the dialog as this:
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() ;
}
I managed to do this by reading Using onClick attribute in layout xml causes a NoSuchMethodException in Android dialogs but I still do not understand this Context issue.