2014-07-20 18 views
1

我想在我的應用程序中使用AlertDialog,但它需要給出輸入。所以我被迫創建一個接口,並重寫我的自定義DialogFragment類中的onAttach()方法。一旦我在Dialog類和MainActivity中正確設置了一切,我試圖運行我的應用程序,它給了我一個指向空指針的運行時異常等等。即時通訊不知道爲什麼這是,我需要幫助,請幫助。在下面,我將介紹我的接口方法的覆蓋,我的.show()方法被調用的地方,我的DialogFragment類的代碼,以及最後的錯誤日誌。對話框片段在執行到MainActivity後拋出空指針異常

public class MainActivity extends FragmentActivity implements CDia_exp.NDListener 
{ 

    //Integers and Strings for performing calculations 
     int a; 
     int b; 
     static int deci_cnt; 
     int cnt; 
     int temp; 
     Double exp_x; 
     Double exp; 
     Double [] num_trk; 
     String [] op_trk; 
     String num_hold; 
     String op_hold; 
     String del_hold; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 


    //....Lots of other code here....... 

    //Exp_x Button 
      opSet[6].setOnClickListener(new View.OnClickListener() 
      { 
       public void onClick(View v) 
       { 
        if(num_hold != "") 
        { 
         cDia_exp.show(getSupportFragmentManager(), "exp_x"); 
         del_hold = tViews[0].getText().toString(); 
         for(int x = num_hold.length() - 1; x >= 0; x--) 
         { 
          del_hold = del_hold.substring(0, del_hold.length() - 1); 
         } 
         num_hold = exp.toString(); 
         tViews[0].setText(del_hold + num_hold); 
         return; 
        } 
        else 
        { 
        return; 
        } 
       } 
      }); 
    } 

    //Objects and Overrides for calling foreign functions 
     CTrim cTrim = new CTrim(); 
     CDia cDia = new CDia(); 
     CDia_exp cDia_exp = new CDia_exp(); 

     EditText exp_inp = (EditText) findViewById(R.id.exp_inp); 

     @Override 
     public void onDPClick(DialogFragment dialog) 
     { 
      exp = Double.parseDouble(num_hold); 
      exp_x = Double.parseDouble(exp_inp.getText().toString()); 
      for(double x = exp_x; x > 0; x--) 
      { 
       exp *= exp; 
      } 

     } 



    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.main, menu); 
     return true; 
    } 

} 

我的自定義DialogFragment類

package com.example.musicalc; 

import android.app.Activity; 
import android.app.AlertDialog; 
import android.app.Dialog; 
import android.content.DialogInterface; 
import android.os.Bundle; 
import android.support.v4.app.DialogFragment; 
import android.view.LayoutInflater; 


public class CDia_exp extends DialogFragment 

{ 

    public interface NDListener 
    { 
     public void onDPClick(DialogFragment dialog); 
    } 


    NDListener expListener; 


    @Override 
    public void onAttach(Activity activity) 
    { 
     super.onAttach(activity); 

     try 
     { 
      expListener = (NDListener) activity; 
     } 
     catch(ClassCastException e) 
     { 
      throw new ClassCastException(activity.toString() + "does not implement NDListener"); 
     } 
    } 


    @Override 
    public Dialog onCreateDialog(Bundle savedInstanceState) 
    { 

     AlertDialog.Builder aDia = new AlertDialog.Builder(getActivity()); 
     LayoutInflater inflater = getActivity().getLayoutInflater(); 

     aDia.setView(inflater.inflate(R.layout.calc_dia, null)).setPositiveButton(R.string.diaOk_b, new DialogInterface.OnClickListener() 
     { 
      @Override 
      public void onClick(DialogInterface dialog, int id) 
      { 
       expListener.onDPClick(CDia_exp.this); 
      } 
     }).setNegativeButton(R.string.cancel_b, new DialogInterface.OnClickListener() 
     { 
      @Override 
      public void onClick(DialogInterface dialog, int id) 
      { 
       getDialog().cancel(); 
      } 
     }); 


     return aDia.create(); 

    } 
} 

現在的錯誤日誌

07-20 14:23:43.599: E/Trace(24173): error opening trace file: No such file or directory (2) 
07-20 14:23:43.622: D/AndroidRuntime(24173): Shutting down VM 
07-20 14:23:43.622: W/dalvikvm(24173): threadid=1: thread exiting with uncaught exception (group=0x4137d2a0) 
07-20 14:23:43.653: E/AndroidRuntime(24173): FATAL EXCEPTION: main 
07-20 14:23:43.653: E/AndroidRuntime(24173): java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.example.musicalc/com.example.musicalc.MainActivity}: java.lang.NullPointerException 
07-20 14:23:43.653: E/AndroidRuntime(24173): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2060) 
07-20 14:23:43.653: E/AndroidRuntime(24173): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2174) 
07-20 14:23:43.653: E/AndroidRuntime(24173): at android.app.ActivityThread.access$700(ActivityThread.java:141) 
07-20 14:23:43.653: E/AndroidRuntime(24173): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1267) 
07-20 14:23:43.653: E/AndroidRuntime(24173): at android.os.Handler.dispatchMessage(Handler.java:99) 
07-20 14:23:43.653: E/AndroidRuntime(24173): at android.os.Looper.loop(Looper.java:137) 
07-20 14:23:43.653: E/AndroidRuntime(24173): at android.app.ActivityThread.main(ActivityThread.java:5059) 
07-20 14:23:43.653: E/AndroidRuntime(24173): at java.lang.reflect.Method.invokeNative(Native Method) 
07-20 14:23:43.653: E/AndroidRuntime(24173): at java.lang.reflect.Method.invoke(Method.java:511) 
07-20 14:23:43.653: E/AndroidRuntime(24173): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:792) 
07-20 14:23:43.653: E/AndroidRuntime(24173): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:555) 
07-20 14:23:43.653: E/AndroidRuntime(24173): at dalvik.system.NativeStart.main(Native Method) 
07-20 14:23:43.653: E/AndroidRuntime(24173): Caused by: java.lang.NullPointerException 
07-20 14:23:43.653: E/AndroidRuntime(24173): at android.app.Activity.findViewById(Activity.java:1851) 
07-20 14:23:43.653: E/AndroidRuntime(24173): at com.example.musicalc.MainActivity.<init>(MainActivity.java:43) 
07-20 14:23:43.653: E/AndroidRuntime(24173): at java.lang.Class.newInstanceImpl(Native Method) 
07-20 14:23:43.653: E/AndroidRuntime(24173): at java.lang.Class.newInstance(Class.java:1319) 
07-20 14:23:43.653: E/AndroidRuntime(24173): at android.app.Instrumentation.newActivity(Instrumentation.java:1053) 
07-20 14:23:43.653: E/AndroidRuntime(24173): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2051) 
07-20 14:23:43.653: E/AndroidRuntime(24173): ... 11 more 
07-20 14:25:56.817: E/Trace(24308): error opening trace file: No such file or directory (2) 
07-20 14:25:56.934: D/AndroidRuntime(24308): Shutting down VM 
07-20 14:25:56.934: W/dalvikvm(24308): threadid=1: thread exiting with uncaught exception (group=0x4137d2a0) 
07-20 14:25:57.013: E/AndroidRuntime(24308): FATAL EXCEPTION: main 
07-20 14:25:57.013: E/AndroidRuntime(24308): java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.example.musicalc/com.example.musicalc.MainActivity}: java.lang.NullPointerException 
07-20 14:25:57.013: E/AndroidRuntime(24308): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2060) 
07-20 14:25:57.013: E/AndroidRuntime(24308): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2174) 
07-20 14:25:57.013: E/AndroidRuntime(24308): at android.app.ActivityThread.access$700(ActivityThread.java:141) 
07-20 14:25:57.013: E/AndroidRuntime(24308): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1267) 
07-20 14:25:57.013: E/AndroidRuntime(24308): at android.os.Handler.dispatchMessage(Handler.java:99) 
07-20 14:25:57.013: E/AndroidRuntime(24308): at android.os.Looper.loop(Looper.java:137) 
07-20 14:25:57.013: E/AndroidRuntime(24308): at android.app.ActivityThread.main(ActivityThread.java:5059) 
07-20 14:25:57.013: E/AndroidRuntime(24308): at java.lang.reflect.Method.invokeNative(Native Method) 
07-20 14:25:57.013: E/AndroidRuntime(24308): at java.lang.reflect.Method.invoke(Method.java:511) 
07-20 14:25:57.013: E/AndroidRuntime(24308): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:792) 
07-20 14:25:57.013: E/AndroidRuntime(24308): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:555) 
07-20 14:25:57.013: E/AndroidRuntime(24308): at dalvik.system.NativeStart.main(Native Method) 
07-20 14:25:57.013: E/AndroidRuntime(24308): Caused by: java.lang.NullPointerException 
07-20 14:25:57.013: E/AndroidRuntime(24308): at android.app.Activity.findViewById(Activity.java:1851) 
07-20 14:25:57.013: E/AndroidRuntime(24308): at com.example.musicalc.MainActivity.<init>(MainActivity.java:803) 
07-20 14:25:57.013: E/AndroidRuntime(24308): at java.lang.Class.newInstanceImpl(Native Method) 
07-20 14:25:57.013: E/AndroidRuntime(24308): at java.lang.Class.newInstance(Class.java:1319) 
07-20 14:25:57.013: E/AndroidRuntime(24308): at android.app.Instrumentation.newActivity(Instrumentation.java:1053) 
07-20 14:25:57.013: E/AndroidRuntime(24308): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2051) 
07-20 14:25:57.013: E/AndroidRuntime(24308): ... 11 more 
+0

看來您在某些參考文獻中有問題。你在MainActivity.java:43上得到一個NullPointerException。在Eclipse(或您的IDE)中檢查該行以獲取更多信息。您也可以發佈完整的代碼以獲取更多詳細信息。 –

回答

0

由於一些試驗和計算器我已經位於回答一些研究。

問題是,編譯器無法定位視圖,因爲它位於我的activity_main.xml文件的單獨xml文件中,或者因爲我在與MainActiviy.java分開的類中創建了對話框。

爲了解決這個問題,我在我的MainActivity.java類中創建了onCreate方法之外的對話框。此外,我創建了一個佈局充氣器,以在我的MainActivity中的視圖中充氣我的佈局,這是關鍵所在,因爲LayoutInflater提供了直接將我的EditText調用到代碼中的方法。

宣佈我的EditText如下:當固定的空指針代碼:

LayoutInflater inflater = LayoutInflater.from(this); 

//Inflater "inflates" layout into View as a value 

final View infV = inflater.inflate(R.layout.calc_dia, null); 

//Use layout value inflated in View "infV" to find EditText 

final EditText eDTemp = (EditText) infV.findViewById(R.id.expInp); 

***該對話框的完整代碼如下****

public void showCD() 
      { 
       LayoutInflater inflater = LayoutInflater.from(this); 
       final View infV = inflater.inflate(R.layout.calc_dia, null); 
       final EditText eDTemp = (EditText)infV.findViewById(R.id.expInp); 
       TextView tView0 = (TextView)findViewById(R.id.calcView); 
       AlertDialog.Builder builder = new AlertDialog.Builder(this); 
       builder.setView(infV).setPositiveButton("Ok", new  
       DialogInterface.OnClickListener() 
       { 
        @Override 
        public void onClick(DialogInterface dialog, int which) 
        { 
       }}).setNegativeButton("Cancel", new DialogInterface.OnClickListener() 
       { 

        @Override 
        public void onClick(DialogInterface dialog, int which) 
        { 
         dialog.cancel(); 
        } 
       }); 

       AlertDialog alert = builder.create(); 
       builder.show(); 
      } 

當您準備好出現對話框時,只需調用包含它的函數即可。