2010-05-09 9 views
5

매우 단순한 AlertDialog, 텍스트 상자가있는 사용자 정의보기 및 alertdialog 긍정적 인 제출 버튼을 사용하고 있습니다. 사용자가 대화 상자를 닫기 전에 입력란에 텍스트가 입력되었는지 확인하고 싶습니다.대화 상자 입력 확인

  • 할 방법
    • 텍스트 상자가 비어 있지 때까지 (일부 의 onChange에서) (텍스트 상자 핸들러를 입력) 버튼을 제출 함 : 나는 각에 대한 질문에, 두 가지 가능성을 참조 텍스트 상자의 내용이 언제 변경되는지 알 수 있습니까?
    • AlertDialog의 버튼 객체에 대한 참조를 어떻게 얻습니까? 비어 있다면 제출 버튼의 의 onclick에
  • 체크()와 대화 상자의 기각 을 취소 할 수 있습니다.
    • AlertDialog의 버튼으로이 작업을 수행 할 수 있습니까?

가 (사용자 정의 대화 대)하지만 AlertDialog에 가능한 옵션 중 하나를인가 ... 대화 상자가 수동으로() 또는 (취소) 기각 호출하지 않고 일축, 그래서 나는 확실하지 않다?

제 생각에는 두 번째 옵션이 가장 단순하다고 생각하지만 가능하면 가능합니다.

답변

3

내가 생각하는 가장 쉬운 방법은 XML 파일에서 자신의 대화 상자를 정의하는 것입니다. 그럼 당신은 (어딘가에 활동 수업이 예에서) 매우 간단 표시 할 수 있습니다

Dialog dialog = new Dialog(this); 
dialog.setContentView(R.layout.your_dialog_file); 

Button yourButton = dialog.findViewById(R.id.yourButton); 
final EditText text = dialog.findViewById(R.id.yourTextEdit); 
yourButton.setOnClickListener({ 

public void onClick(View view) { 
    if (! (text.getText().toString.equals(""))) { 
     //go on here and dismiss dialog 
    } 

}); 
1

여기 입력을 확인하고 입력이 유효하지 않은 경우 화면에 경고 대화를 유지하는 방법입니다. 실제로 대화 상자를 제거하고 대화 상자를 새로 만듭니다.

setPostiveButton의 onClick 함수에서 유효성 검사를 수행하십시오. 정상적으로 수행되지 않는 경우 사용자에게 토스트를 보여줍니다. 그런 다음 대화 상자에서 removeDialog를 호출하십시오. 다음은 까다로운 부분이며 대화 상자에서 비동기 적으로 showDialog를 호출합니다 (해당하는 경우 args 사용). 또한 사용자 입력을 잃지 않으려면 입력 한 값을 대화 상자를 호출하는 번들에 넣어야합니다. 물론 다이얼로그의 셋업 코드는 번들 내의 값을 찾아서 다이얼로그 필드를 적절하게 채워 넣어야합니다.

그래서 코드는 다음과 같이 보일 것이다 :

alert.setPositiveButton(id, 
new DialogInterface.OnClickListener() { 
    public void onClick(DialogInterface dialog, int whichButton) 
    { 
    if ((your validation conditions)) { 
     // validation conditions not satisfied 
     removeDialog(myDialogId); 
     Toast.makeText(blah blah).show(); 
     // now create a new args bundle for the dialog 
     Bundle newArgs = new Bundle(); 
     // now copy whatever you need from the args used to invoke to dialog 
     newArgs.putIntegerArrayList("items", myList); 
     // now save the user's input in a bundle 
     newArgs.putString("dialogToFieldContent", toString); 
     final Bundle finalArgs = newArgs; 
     Handler handler = new Handler(); 
     handler.post(new Runnable() { 
      @Override 
      public void run() { 
      showDialog(myDialogId, finalArgs); 
      } 
     }); 
    } 
    else { 
     // if everything is ok 
    } 
    } 
}); 
+0

어디에서 대화 ID를 가져 옵니까? 최소한의 기능적인 예를 제공해 주실 수 있습니까? –

4

내가 입력 필드에 TextWatcher를 설정을하고, 검증 조건이 충족 될 경우 다음 긍정적 버튼을 가능하게한다. 기본적으로 양수 버튼을 사용 중지합니다.

AlertDialog.Builder builder = new AlertDialog.Builder(getSherlockActivity()); 
final View dialogView = LayoutInflater.from(getSherlockActivity()).inflate(R.layout.create_playlist, null); 
final EditText inputField = (EditText) dialogView.findViewById(R.id.edit_newPlaylistName); 
... //proceed to setup dialog using builder 
final AlertDialog alertDialog = builder.show(); 
alertDialog.setCanceledOnTouchOutside(true); 
final Button button = alertDialog.getButton(AlertDialog.BUTTON_POSITIVE); 
button.setEnabled(false); 
inputField.addTextChangedListener(new TextWatcher() { 
    @Override 
     public void beforeTextChanged(CharSequence s, int start, int count, int after) { 
    } 

    @Override 
    public void onTextChanged(CharSequence s, int start, int before, int count) { 
     // my validation condition 
     if (inputField.getText().length() > 0) { 
      button.setEnabled(true); 
     } else { 
      button.setEnabled(false); 
     } 
    } 

    @Override 
    public void afterTextChanged(Editable s) { 

    } 
});