2011-05-05 5 views
1

catch 블록에있는 사용자에 대한 경고 메시지를 표시하려고합니다. 차이점은 내 try/catch는 주 활동의 onCreate() 안에 있으므로 애플리케이션이 열리 자마자 실행됩니다.예외를 catch하는 동안 Android에서 맞춤 AlertDialog 표시

나는 (내가 dialog.dismiss()this.finish()와 활동의 종료 후에서 대화 상자에 대한 OnClick()이)이 시도했습니다

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에 경고로 표시하고 다른 처리되지 않은 예외가 발생할 때까지 흐름을 유지 한 다음 기본 "죄송합니다/강제 종료"Android 대화 상자를 표시하는 것을 볼 수 있습니다. LogCat의 대화 상자와 관련된 다른 예외는 없습니다.

캐치에 대한 내 AlertDialog가 표시되지 않는 이유는 무엇입니까? 작성자가 필요로하는 컨텍스트에 대해 생각했지만 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() 메서드는 흥미로울 것입니다. 또한 코드의 어느 시점에서 다이얼로그를 닫는 것에 대한이 내용은 흥미 롭습니다. 활동주기 호출을 통해 대화 상자를 연 직후 대화 상자를 닫을 수 있습니까? – Stephan

+0

이 스레드를 확인하십시오 http://stackoverflow.com/questions/4371842/progressdialog-problem-during-activiy-oncreatevoid-in-android – ernazm

+0

alertdialog를 표시하기 위해 처리기를 추가하는 방법에 대해 자세히 설명해 줄 수 있습니까? –

답변

0

활동의 생명점에 문제가있었습니다!

은 내가 한 Heres는 무엇을 :

 } 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으로 이동하려고 시도했지만 같은 방식으로 작동하지 않았습니다. ( –

+0

같은 방식으로 작동하지 않습니까? 대화 상자가 표시되지 않았거나 닫히지 않았거나, 구체적으로? – Femi

+0

대화 상자가 표시되지 않고 예외 (facade.getInstance(). isInitialized() ...) 후 nullpointer로 인해 강제 종료가 표시됩니다. catch 블록 (예외로 인해 nullpointer가 발생했습니다). –