0

EditText의 일부 정보를 입력해야하는 대화 상자가 있습니다. 편집 텍스트가 비어있을 때 양수 버튼을 클릭하면 메시지가있는 Snackbar이 표시되고 대화 상자가 닫힙니다. 그러나 대화 상자를 다시 열면 앱에 오류가 발생하여 java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first 오류가 발생합니다. 여기닫힌 후 대화 상자를 다시 열 때 응용 프로그램이 충돌하는 경우

내가보기 팽창 한 방법은 다음과 같습니다

LayoutInflater inflater = this.getLayoutInflater(); 
addVenueDialog = inflater.inflate(R.layout.add_venue_dialog, null); 

을 여기에 자바 코드 편집 텍스트가 비어 있거나하지 않으면 대화 상자를 열고 확인 뒤에 : 나는 이유를 알고하지 않습니다

case R.id.nav_add_venue: 
      if (dialog == null) { 

       LayoutInflater inflater = this.getLayoutInflater(); 
       View addVenueDialog = inflater.inflate(R.layout.add_venue_dialog, null); 

       vName = (EditText) addVenueDialog.findViewById(R.id.vName); 
       vAddress = (EditText) addVenueDialog.findViewById(R.id.vAddress); 

       AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this); 
       builder.setTitle("Title"); 
       builder.setView(addVenueDialog); 
       builder.setPositiveButton("Add", new DialogInterface.OnClickListener() { 
        @Override 
        public void onClick(DialogInterface dialogInterface, int i) { 
         if (isNetworkAvailable()) { 
          if (vName.getText().toString().isEmpty()) { 
           Snackbar snackbar = Snackbar 
             .make(coordinatorLayout, "V name cannot be empty", Snackbar.LENGTH_SHORT); 
           snackbar.show(); 
          } else if (vAddress.getText().toString().isEmpty()) { 
           Snackbar snackbar = Snackbar 
             .make(coordinatorLayout, "V address cannot be empty", Snackbar.LENGTH_SHORT); 
           snackbar.show(); 
          } else { 
           mDatabase.child("vs").child(user.getUid()).child("V name").setValue(vName.getText().toString()); 
           mDatabase.child("vs").child(user.getUid()).child("V address").setValue(vAddress.getText().toString()); 
          } 
         } else { 
          Snackbar snackbar = Snackbar 
            .make(coordinatorLayout, "No internet connection", Snackbar.LENGTH_SHORT); 
          snackbar.show(); 
         } 
        } 
       }); 
       dialog = builder.create(); 
      } 
      dialog.show(); 
      break; 

닫은 후에 다시 한 번 대화 상자를 열면 앱이 충돌합니다.

알려 주시기 바랍니다.

+0

크래시가 있기 때문에 오류 메시지에 표시된대로 이미 다른 곳에 추가 한보기를 추가하고 있습니다. 즉, 경고 대화 상자를 처음 만들 때. 그런 대화 상자를 다시 만들면 다시보기를 다시 추가 할 수 없습니다. – njzk2

+0

@ njzk2 그래서 해결책은 무엇입니까? –

답변

1

하나 개의 간단한 솔루션을-사용하여 다시 AlertDialog와의 전역 인스턴스를 유지하는 것입니다 :

스위치의 경우 지금
//global 
private AlertDialog dialog; 

:

case R.id.nav_add_venue: 
    if(dialog == null) { 
     LayoutInflater inflater = this.getLayoutInflater(); 
     View addVenueDialog = inflater.inflate(R.layout.add_venue_dialog, null); 

     builder.setView(addVenueDialog); 

     final EditText vName = (EditText) addVenueDialog.findViewById(R.id.vName); 
     final EditText vAddress = (EditText) addVenueDialog.findViewById(R.id.vAddress); 

     // Other code // 
     dialog = builder.create(); 
    } 
    dialog.show(); 
    break; 

dismiss 대화 onDestroy 방법에 기억 메모리 누출 방지 :

public void onDestroy() { 
    super.onDestroy(); 
    if(dialog != null) { 
    dialog.dismiss(); 
    } 
} 
+0

이 경우에도 동일한 오류가 발생합니다./ –

+0

레이아웃 인플레이션 작업을 if 문 안에 넣습니다. 모든 대화 작성 작업은 그 안에 있어야합니다. –

+0

동일한 오류가 발생했습니다. :/ –