2014-09-28 44 views
0

的setMessage()空指針異常我試圖延長ProgressDialog類來創建我的自定義對話框。當我嘗試執行以下實現。這是給空指針異常的setmessage()調用在定製的Android對話框

可有人請解釋如何做呢?

private class SubProgressDialog extends ProgressDialog { 

    Textview tvdialogtext; 
    public SubProgressDialog(Context context) { 

     super(context); 
    } 


    @Override 
    public void setMessage(CharSequence message) { 
     // TODO Auto-generated method stub 

     tvdialogtext.setText(message); 
    } 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     // TODO Auto-generated method stub 
     super.onCreate(savedInstanceState); 

     setContentView(R.layout.loadingdialog); 
     tvdialogtext = (TextView) dialog.findViewById(R.id.tvloading); 
     Typeface ttf = Typeface.createFromAsset(this.getContext() 
       .getAssets(), "calibriitalic.ttf"); 
     ImageView ivloading = (ImageView) dialog 
       .findViewById(R.id.ivloading); 
     ivloading.setBackgroundResource(R.animator.loading); 
     AnimationDrawable anim = (AnimationDrawable) ivloading 
       .getBackground(); 
     anim.start(); 
     anim.setVisible(true,true); 

     tvdialogtext.setTypeface(ttf); 

     tvdialogtext.setTextColor(Color.parseColor("#ffffff")); 
     tvdialogtext.setShadowLayer(25f, 0, 0, Color.WHITE); 

    } 

    @Override 
    public void onBackPressed() { 
     /** dismiss the progress bar and clean up here **/ 
     if (dialog != null) { 
      dialog.dismiss(); 
     } 
     running = false; 
     finish(); 
     help.comeinfromleft(); 
    } 
} 

logcat的

09-28 21:17:48.154: E/AndroidRuntime(27745): Caused by: java.lang.NullPointerException 
09-28 21:17:48.154: E/AndroidRuntime(27745): at   m sfs com.anshul.guessthegaana.OnePlayerArena$SubProgressDialog.setMessage(OnePlayerArena.java:1552) 
09-28 21:17:48.154: E/AndroidRuntime(27745): at  com.anshul.guessthegaana.OnePlayerArena$GetSongsFromServer.onPreExecute(OnePlayerArena.java:1  191) 
09-28 21:17:48.154: E/AndroidRuntime(27745): at   android.os.AsyncTask.executeOnExecutor(AsyncTask.java:586) 
09-28 21:17:48.154: E/AndroidRuntime(27745): at android.os.AsyncTask.execute(AsyncTask.java:534) 
09-28 21:17:48.154: E/AndroidRuntime(27745): at com.anshul.guessthegaana.OnePlayerArena.onCreate(OnePlayerArena.java:247) 
09-28 21:17:48.154: E/AndroidRuntime(27745): at android.app.Activity.performCreate(Activity.java:5165) 
09-28 21:17:48.154: E/AndroidRuntime(27745): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1103) 
09-28 21:17:48.154: E/AndroidRuntime(27745): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2419) 

初始化呼叫

 dialog = new SubProgressDialog(this); 
     dialog.setMessage("Preparing the Game"); 

     dialog.setIndeterminate(false); 

     dialog.show(); 

回答

0

我覺得你的問題是在這裏:

tvdialogtext = (TextView) dialog.findViewById(R.id.tvloading); 

如果tvDialogText在R.layout.loadingdialog定義只需使用:

tvdialogtext = (TextView) findViewById(R.id.tvloading); 

如果不是,請告訴我們您在哪裏初始化dialog

希望它可以幫助

+0

到OnCreate中調用工作正常。 NPE在setmessage()中。仍然給你的解決方案嘗試沒有幫助。添加初始化代碼。 – 2014-09-28 16:55:12

0

終於想出

的問題是,這是調用對話框的的AsyncTask叫上活動的的onCreate所以對話框沒有實例化。

所以當對話從調用的OnCreate活動的異步任務調用

的setmessage應該爲以後的實例

工作中使用的對話框中提出了一個默認的消息的解決辦法

工作代碼

private class SubProgressDialog extends ProgressDialog { 

    TextView tvdialogtext; 

    public SubProgressDialog(Context context) { 

     super(context); 
    } 

    @Override 
    public void setMessage(CharSequence message) { 
     // TODO Auto-generated method stub 
     // super.setMessage(message); 

     if (tvdialogtext != null) { 

      tvdialogtext.setText(message); 
     } 
    } 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     // TODO Auto-generated method stub 
     super.onCreate(savedInstanceState); 

     setContentView(R.layout.loadingdialog); 


     tvdialogtext.setTypeface(ttf); 

     // Your Default Text 
     tvdialogtext.setText("Preparing The Game"); 


    } 

    @Override 
    public void onBackPressed() { 
     /** dismiss the progress bar and clean up here **/ 
     if (dialog != null) { 
      dialog.dismiss(); 
     } 
     running = false; 
     finish(); 
     help.comeinfromleft(); 
    } 
} 
0

最簡單的方法來解決這個問題只是創建ProgressDialog到你的onPreExecute()m方法並在全球範圍內宣佈。

像這樣:

progressDialog = new ProgressDialog(MyActivity.this);