2011-05-05 59 views
1

我試圖在catch塊中顯示用戶的警報消息。不同之處在於我的try/catch位於主活動的onCreate()之內,所以只要應用程序打開,它就會執行。在Android中顯示自定義AlertDialog,同時捕獲異常

我已經試過這(我有一個對話框中OnClick()在活動結束時與dialog.dismiss()this.finish()後):

catch (SQLException e) { 
     AlertDialog.Builder builder = new AlertDialog.Builder(this) 
     .setTitle(getString(R.string.label_title_error)) 
     .setIcon(R.drawable.error_icon) 
     .setMessage(getString(R.string.msg_error_sql)) 
     .setPositiveButton(getString(R.string.label_ok), this); 

     AlertDialog dialogSQL = builder.create(); 
     dialogSQL.show(); 

     e.printStackTrace(); 
    } 

,我也試過這樣:

catch (NumberFormatException e) { 
     AlertDialog.Builder dialog = new AlertDialog.Builder(this); 
     dialog.setTitle(getString(R.string.label_title_error)); 
     dialog.setIcon(R.drawable.error_icon); 
     dialog.setMessage(getString(R.string.msg_error_numberformat)); 
     dialog.setNeutralButton(getString(R.string.label_ok), null); 

     dialog.create().show(); 

     e.printStackTrace(); 
    } 

強制調試時出現的異常,我可以看到它只是捕獲異常,在LogCat中顯示(作爲警告),並保持流動狀態,直到遇到另一個未經處理的異常,然後顯示默認的「Sorry!/ Force Close」Android對話框。 LogCat中沒有與對話相關的其他例外。

爲什麼它不顯示我的自定義AlertDialogs的捕獲?我想到了Builder需要的上下文,但是如果onCreate()之前的super()在此代碼之前,那麼它爲什麼會顯示消息?

謝謝大家。

更新:好的,根據要求,這裏有更多的代碼。

public class PinActivity extends Activity implements OnClickListener, android.content.DialogInterface.OnClickListener{ 

private Facade facade = null; 

public static int INSERT_SAL = 0; 
public static int INSERT_OK = 1; 
public static int INSERT_CANCEL = 2; 

EditText edtIniPin; 
TextView txtSelecPin; 
TextView txtCancPin; 

int pinMaxLengthInt; 

private String[] serviceNames; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    Log.v("FLUXO", "PIN -->> ON CREATE"); 
    super.onCreate(savedInstanceState); 

    facade = Facade.getInstance(); 
    try { 
     serviceNames = facade.loadApplication(this); 
     facade.loadParameters(0); 

     setContentView(R.layout.pin_screen); 

     //Instanciando Views da Tela 
     edtIniPin = (EditText) findViewById(R.id.editTextPin); 
     txtSelecPin = (TextView) findViewById(R.id.btn_select_pin); 
     txtCancPin = (TextView) findViewById(R.id.btn_cancel_pin); 

     pinMaxLengthInt = Facade.getInstance().getPinSize(); 

     InputFilter[] FilterArray = new InputFilter[1]; 
     FilterArray[0] = new InputFilter.LengthFilter(pinMaxLengthInt); 
     edtIniPin.setFilters(FilterArray); 

     edtIniPin.addTextChangedListener(new TextWatcher() { 

      @Override 
      public void onTextChanged(CharSequence s, int start, int before, int count) { 
       if (edtIniPin.getText().length() > 0) { 
        txtCancPin.setText(getString(R.string.btn_clean)); 
       } 
       else if (edtIniPin.getText().length() == 0){ 
        txtCancPin.setText(getString(R.string.btn_exit)); 
       } 
       else if (edtIniPin.getText().length() == Facade.getInstance().getPinSize()){ 
        edtIniPin.setEnabled(false); 
       } 
      } 

      @Override 
      public void beforeTextChanged(CharSequence s, int start, int count, int after) { 
      } 

      @Override 
      public void afterTextChanged(Editable s) { 
      } 
     }); 

    } catch (SQLException e) { 
     AlertDialog.Builder builder = new AlertDialog.Builder(this) 
     .setTitle(getString(R.string.label_title_error)) 
     .setIcon(R.drawable.error_icon) 
     .setMessage(getString(R.string.msg_error_sql)) 
     .setPositiveButton(getString(R.string.label_ok), this); 

     AlertDialog dialogSQL = builder.create(); 
     dialogSQL.show(); 

     e.printStackTrace(); 
    } catch (CorruptedAppException e) { 
     AlertDialog.Builder builder = new AlertDialog.Builder(this) 
     .setTitle(getString(R.string.label_title_error)) 
     .setIcon(R.drawable.error_icon) 
     .setMessage(getString(R.string.msg_error_corrupted)) 
     .setPositiveButton(getString(R.string.label_ok), this); 

     AlertDialog dialogCorrupted = builder.create(); 
     dialogCorrupted.show(); 

     e.printStackTrace(); 
    } catch (NoServiceAvailableException e) { 
     AlertDialog.Builder builder = new AlertDialog.Builder(this) 
     .setTitle(getString(R.string.label_title_error)) 
     .setIcon(R.drawable.error_icon) 
     .setMessage(getString(R.string.msg_error_noservice)) 
     .setPositiveButton(getString(R.string.label_ok), this); 

     AlertDialog dialogNoService = builder.create(); 
     dialogNoService.show(); 

     e.printStackTrace(); 
    } catch (NumberFormatException e) { 

     AlertDialog.Builder dialog = new AlertDialog.Builder(this); 
     dialog.setTitle(getString(R.string.label_title_error)); 
     dialog.setIcon(R.drawable.error_icon); 
     dialog.setMessage(getString(R.string.msg_error_numberformat)); 
     dialog.setNeutralButton(getString(R.string.label_ok), null); 

     dialog.create().show(); 

    e.printStackTrace(); 
    } 

} 

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 
    Log.v("FLUXO", "PIN -->> ON ACTIVITY RESULT"); 
    if (resultCode == INSERT_OK) { 
     String[] initCode = (String[]) data.getSerializableExtra("init_code"); 

     try { 
      Facade.getInstance().insertInitCode(serviceNames[0], initCode, this); 
     } catch (NumberFormatException e) { 
      AlertDialog.Builder builder = new AlertDialog.Builder(this) 
      .setTitle(getString(R.string.label_title_error)) 
      .setIcon(R.drawable.error_icon) 
      .setMessage(getString(R.string.msg_error_numberformat)) 
      .setPositiveButton(getString(R.string.label_ok), this); 

      AlertDialog dialog = builder.create(); 
      dialog.show(); 

      e.printStackTrace(); 

     } catch (SQLException e) { 
      AlertDialog.Builder builder = new AlertDialog.Builder(this) 
      .setTitle(getString(R.string.label_title_error)) 
      .setIcon(R.drawable.error_icon) 
      .setMessage(getString(R.string.msg_error_sql)) 
      .setPositiveButton(getString(R.string.label_ok), this); 

      AlertDialog dialog = builder.create(); 
      dialog.show(); 

      e.printStackTrace(); 

     } catch (CorruptedAppException e) { 
      AlertDialog.Builder builder = new AlertDialog.Builder(this) 
      .setTitle(getString(R.string.label_title_error)) 
      .setIcon(R.drawable.error_icon) 
      .setMessage(getString(R.string.msg_error_corrupted)) 
      .setPositiveButton(getString(R.string.label_ok), this); 

      AlertDialog dialog = builder.create(); 
      dialog.show(); 

      e.printStackTrace(); 
     } 
    } 
    else if (resultCode == INSERT_CANCEL){ 
     this.finish(); 
    } 

} 

@Override 
protected void onStart() { 
    Log.v("FLUXO", "PIN -->> ON START"); 
    super.onStart(); 
    txtSelecPin.setOnClickListener(this); 
    txtCancPin.setOnClickListener(this); 
} 

@Override 
protected void onResume() { 
    Log.v("FLUXO", "PIN -->> ON RESUME"); 
    super.onResume(); 

    if (!facade.isInitialized(serviceNames[0], this)) { 
     Intent itInicial = new Intent(this, InitialActivity.class); 
     startActivityForResult(itInicial, INSERT_SAL); 
    } 
} 

@Override 
protected void onStop() { 
    Log.v("FLUXO", "PIN -->> ON STOP"); 
    super.onStop(); 
} 

@Override 
protected void onPause() { 
    Log.v("FLUXO", "PIN -->> ON PAUSE"); 
    super.onPause(); 
} 

@Override 
public void onBackPressed() { 
    Log.v("FLUXO", "PIN -->> ON BACK KEY PRESSED"); 
    super.onBackPressed(); 
    moveTaskToBack(true); 
} 

@Override 
protected void onDestroy() { 
    Log.v("FLUXO", "PIN -->> ON DESTROY"); 
    super.onDestroy(); 
} 

/** 
* Método chama próxima tela 
*/ 
private void nextScreen(){ 
    Log.v("FLUXO", "PIN -->> NEXT SCREEN"); 
    Intent it = new Intent(this, ValueActivity.class); 
    startActivity(it); 
} 

@Override 
public void onClick(View v) { 
     //lots of stuff (...) 
} 

@Override 
public void onClick(DialogInterface dialog, int which) { 
    dialog.dismiss(); 
    System.exit(0); 
} 

}

+0

你能表現出更多的位碼?特別是onCreate()方法會很有趣。此外,有關在代碼中的某些時刻在對話框中調用dismiss的內容很有趣。在通過活動生命週期調用打開對話框後不久,您可能會忽略該對話框? – Stephan 2011-05-05 14:52:28

+0

檢查這個線程http://stackoverflow.com/questions/4371842/progressdialog-problem-during-activiy-oncreatevoid-in-android – ernazm 2011-05-05 15:20:56

+0

你可以更具體地關於添加處理程序來顯示alertdialog? – 2011-05-05 17:15:03

回答

0

這是一個活動的生命危機的問題!

繼承人我所做的:

 } catch (NumberFormatException e) { 
     showDialog(
       R.string.label_title_error, 
       R.drawable.error_icon, 
       R.string.msg_error_noservice, 
       R.string.label_ok); 
     error = true; 
     e.printStackTrace(); 

    } 

這:

@Override 
protected void onResume() { 
    Log.v("FLUXO", "PIN -->> ON RESUME"); 
    super.onResume(); 
    if (!error) { 
     if (!facade.isInitialized(serviceNames[0], this)) { 
      Intent itInicial = new Intent(this, InitialActivity.class); 
      startActivityForResult(itInicial, INSERT_SAL); 
     }  

    } 
} 
1

AlertDialog一般需要其父上下文是可見的正常工作(在我的經驗,有人糾正我,如果我錯了)。除非出現其他錯誤(如果沒有完整的代碼,很難分辨出來),如果將它移動到onResume()函數中,您可能會做出正確的工作。

+0

我已經嘗試移動到onResume,但它沒有以同樣的方式工作:( – 2011-05-05 16:44:51

+0

它沒有以同樣的方式工作?你的意思是它沒有顯示對話框,或它沒有強制關閉,或什麼特別是? – Femi 2011-05-05 16:47:24

+0

它沒有顯示對話框,然後緊接着因爲一個空指針(facade.getInstance()。isInitialized()...)catch塊(由於異常而發生的空指針)之後顯示強關閉。 – 2011-05-05 17:14:39