2013-03-04 44 views
0

我正在努力使用活动外部的自定义对话框,我已将对话框代码写入类中,然后在单击该按钮时在活动中调用该对话框。但是,这不适合我当我点击showDialog按钮时,应用程序崩溃。下面是代码使用活动外的自定义对话框

活动代码

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(); 
      } 
     }); 
    } 
} 

定制对话框类

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) 

请指导我在哪里做错了。它确实也有助于其他人。

+0

这是Custom_Dialog类中的13个数字行吗? – 2013-03-04 12:08:45

回答

1

变化Custom_Dialog构造函数:

//......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 
+0

好吧,我会尝试这个 – Suraj 2013-03-04 12:11:42

+0

仍然得到同样的问题点击showDialog按钮 – Suraj 2013-03-04 12:13:19

+0

@Suraj:看到我的答案,你将需要改变它在内部onCreate或其他内部Custom_Dialog类 – 2013-03-04 12:14:37

1

您还没有实例化的背景下mContext内:

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

而且里面MainActivity的onCreate它传递给Custom_Dialog构造函数之前,活动上下文初始化context构造函数。问题似乎在那里。

0

这不是我想的。您必须使用主题对话框创建一个活动并调用此活动。该活动应该看起来像一个对话框。

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

试试这个方法。它会解决它。

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(); 
      } 
     }); 
    } 
} 

定制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); 
      ....... 

    } 
0

你有一个单独的类来创建对话框这样

Custom_Dialog alertbox = new Custom_Dialog(currentActivity); 

currentActivity是当前活动的参考。

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

所以,你必须同时通过上下文和用于其他类当前活动的引用。