Question

I am working on to use the custom dialog from outside the activity, i have written the dialog code in a class and then call that dialog in the Activity on click of the button. But that is not working for me Application crashes when i click on the showDialog Button. Below is the code

Activity code

package com.Customers;

import android.os.Bundle;
import android.app.Activity;
import android.content.Context;
import android.content.res.Resources.Theme;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class MainActivity extends Activity {
    Context context;
    int theme;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.dialog);
        Button showDialog=(Button)findViewById(R.id.show_dialog);
        showDialog.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                Custom_Dialog calcDialog=new Custom_Dialog(context,R.style.myCoolDialog);
                calcDialog.dailogCalculator();
            }
        });
    }
}

Custom Dialog Class

package com.Customers;

import android.app.Dialog;
import android.content.Context;
import android.view.View;
import android.view.Window;
import android.widget.Button;
import android.widget.EditText;

public class Custom_Dialog extends Dialog implements android.view.View.OnClickListener{
        Context mContext;
        protected Custom_Dialog(Context context, int theme) {
            super(context, theme);
         }
        public boolean TouchEvent(int actionOutside) {
            return false;
    }

    public void dailogCalculator(){
                Custom_Dialog alertbox = new Custom_Dialog(mContext, R.style.myCoolDialog);
                alertbox.requestWindowFeature(Window.FEATURE_NO_TITLE);
                alertbox.setContentView(R.layout.calculator);
                EditText calcDisplay=(EditText)alertbox.findViewById(R.id.editText1);
                Button value1=(Button) alertbox.findViewById(R.id.button1);
                value1.setOnClickListener(this);
                Button value2=(Button) alertbox.findViewById(R.id.button2);
                value2.setOnClickListener(this);
                Button value3=(Button) alertbox.findViewById(R.id.button3);
                value3.setOnClickListener(this);
                Button value4=(Button) alertbox.findViewById(R.id.button4);
                value4.setOnClickListener(this);
                Button value5=(Button) alertbox.findViewById(R.id.button5);
                value5.setOnClickListener(this);
                Button value6=(Button) alertbox.findViewById(R.id.button6);
                value6.setOnClickListener(this);
                Button value7=(Button) alertbox.findViewById(R.id.button7);
                value7.setOnClickListener(this);
                Button value8=(Button) alertbox.findViewById(R.id.button8);
                value8.setOnClickListener(this);
                Button value9=(Button) alertbox.findViewById(R.id.button9);
                value9.setOnClickListener(this);
                Button value00=(Button) alertbox.findViewById(R.id.button00);
                value00.setOnClickListener(this);
                Button value0=(Button) alertbox.findViewById(R.id.button0);
                value0.setOnClickListener(this);
                Button backspaceBtn=(Button) alertbox.findViewById(R.id.backspace);
                backspaceBtn.setOnClickListener(this);
                Button Ok_dialog=(Button)alertbox.findViewById(R.id.ok_dialog);
                Ok_dialog.setOnClickListener(this);
                Button Qty_btn=(Button)alertbox.findViewById(R.id.btn_qty);
                Qty_btn.setOnClickListener(this);
                alertbox.show();  
    }
        @Override
        public void onClick(View v) {

            switch(v.getId()){
            case R.id.button1:

                break;
            case R.id.button2:

                break;
            case R.id.button3:

                break;
            case R.id.button4:

                break;
            case R.id.button5:

                break;
            case R.id.button6:

                break;
            case R.id.button7:

                break;
            case R.id.button8:

                break;
            case R.id.button9:

                break;
            case R.id.button0:
                break;
            case R.id.button00:
                break;
            case R.id.backspace:
                break;
            case R.id.btn_qty:
                break;
            case R.id.ok_dialog:
                break;
            }

        }   

    }

Logcat

03-04 16:54:47.293: E/AndroidRuntime(275):  at java.lang.reflect.Method.invokeNative(Native Method)
03-04 17:16:22.793: E/AndroidRuntime(332): FATAL EXCEPTION: main
03-04 17:16:22.793: E/AndroidRuntime(332): java.lang.NullPointerException
03-04 17:16:22.793: E/AndroidRuntime(332):  at android.app.Dialog.<init>(Dialog.java:141)
03-04 17:16:22.793: E/AndroidRuntime(332):  at com.Customers.Custom_Dialog.<init>(Custom_Dialog.java:13)
03-04 17:16:22.793: E/AndroidRuntime(332):  at com.Customers.MainActivity$1.onClick(MainActivity.java:24)
03-04 17:16:22.793: E/AndroidRuntime(332):  at android.view.View.performClick(View.java:2408)
03-04 17:16:22.793: E/AndroidRuntime(332):  at android.view.View$PerformClick.run(View.java:8816)
03-04 17:16:22.793: E/AndroidRuntime(332):  at android.os.Handler.handleCallback(Handler.java:587)
03-04 17:16:22.793: E/AndroidRuntime(332):  at android.os.Handler.dispatchMessage(Handler.java:92)
03-04 17:16:22.793: E/AndroidRuntime(332):  at android.os.Looper.loop(Looper.java:123)
03-04 17:16:22.793: E/AndroidRuntime(332):  at android.app.ActivityThread.main(ActivityThread.java:4627)
03-04 17:16:22.793: E/AndroidRuntime(332):  at java.lang.reflect.Method.invokeNative(Native Method)
03-04 17:16:22.793: E/AndroidRuntime(332):  at java.lang.reflect.Method.invoke(Method.java:521)
03-04 17:16:22.793: E/AndroidRuntime(332):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
03-04 17:16:22.793: E/AndroidRuntime(332):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
03-04 17:16:22.793: E/AndroidRuntime(332):  at dalvik.system.NativeStart.main(Native Method)

Please guide me that where i am doing wrong. It really helps the others as well.

Was it helpful?

Solution

Change Custom_Dialog constructor as :

Context mContext;
        protected Custom_Dialog(Context context, int theme) {
            super(context, theme);
           this.mContext=context;  //<<<<<<  initialize  mContext here
         }

and also inside MainActivity onCreate initialize context with Activity Context before passing it to Custom_Dialog constructor as :

 //......your code here
 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.dialog);
        context=MainActivity.this //<<<<< initialize  context here
        //......your code here

OTHER TIPS

You are not instantiating the context mContext inside the constructor. Problem seems to be there.

Try this way. It will solve it.

   public class MainActivity extends Activity {
    Context context;
    int theme;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.dialog);
        context= this;
        Button showDialog=(Button)findViewById(R.id.show_dialog);
        showDialog.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                Custom_Dialog calcDialog=new Custom_Dialog(context,R.style.myCoolDialog);
                calcDialog.show();
            }
        });
    }
}

Custom Dialog.java

@Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

            requestWindowFeature(Window.FEATURE_NO_TITLE);
            setContentView(R.layout.calculator);

            EditText calcDisplay=(EditText)findViewById(R.id.editText1);
            Button value1=(Button) findViewById(R.id.button1);
            value1.setOnClickListener(this);
            Button value2=(Button) findViewById(R.id.button2);
            value2.setOnClickListener(this);
            ....... 

  }

This is not the rightway i think. You have to create a activity with Theme dialog and call this activity. The activity should look like a dialog.

<activity android:theme="@android:style/Theme.Dialog" />

You have to create dialog in a separate class like this

   Custom_Dialog alertbox = new Custom_Dialog(currentActivity);

currentActivity is the current activity reference.

later

LayoutInflater layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

So you have to pass both context and current activity references for the other class.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top