Firestore: DB를 활용해서 간단한 댓글 기능을 만들기② - LinearLayout 동적 생성, AlertDialog

2 분 소요

목차

1: Firestore: DB를 활용해서 간단한 댓글 기능을 만들기① - DB에서 댓글 읽어 오기

2: Firestore: DB를 활용해서 간단한 댓글 기능을 만들기② - LinearLayout 동적 생성, AlertDialog) <현재>

3: Firestore: DB를 활용해서 간단한 댓글 기능을 만들기③ - 동적 생성 뷰, 내용 입력 받아 DB에 올리기



1편에 이어서~

댓글 만들기, createComment()

public void createComment(String who, String what, String when, int isMyComment, String docID){
  LinearLayout commentBox = new LinearLayout(this);
  commentBox.setOrientation(LinearLayout.VERTICAL);
  commentBox.setTag(docID);
  if( isMyComment == 1 ){
    commentBox.setOnClickListener(new View.OnClickListener(){
      @Override
      public void onClick(View v){
        Log.d("ClickedMyComment", docID);
        builder.setPositiveButton("확인", new DialogInterface.OnClickListener(){
          @Override
          public void onClick(DialogInterface dialog, int which){
            Log.d("ClickedMyComment", "확인");
            mDatabase.collection("catInfo/" + catName + "/comments").document(docID)
                    .delete()
                    .addOnSuccessListener(new OnSuccessListener<Void>(){
                      @Override
                      public void onSuccess(Void aVoid){
                        Log.d("ClickedMyComment", "DocumentSnapshot successfully deleted!");
                      }
                    })
                    .addOnFailureListener(new OnFailureListener(){
                      @Override
                      public void onFailure(@NonNull Exception e){
                        Log.w("ClickedMyComment", "Error deleting document", e);
                      }
                    });
            commentBox.setVisibility(View.GONE);
          }
        });
        builder.setNegativeButton("취소", new DialogInterface.OnClickListener(){
          @Override
          public void onClick(DialogInterface dialog, int which){
            Log.d("ClickedMyComment", "취소");
          }
        });
        //builder.setIcon(R.drawable.ic_launcher);
        builder.setTitle("댓글을 지우시겠습니까?");
        AlertDialog alertDialog = builder.create();
        alertDialog.show();
      }
    });
  }
  commentBox.addView(createTextView(who, 1, isMyComment));
  commentBox.addView(createTextView(what, 2, isMyComment));
  commentBox.addView(createTextView(when, 3, isMyComment));
  LL_comments.addView(commentBox);
}

LinearLayout에 닉네임(who), 내용(what), 날짜(when) TextView를 담아 댓글 하나를 만드는 함수다.
5

LinearLayout commentBox = new LinearLayout(this);
commentBox.setOrientation(LinearLayout.VERTICAL);
commentBox.setTag(docID);

LinearLayout 역시 동적 생성할 수 있다~~ LinearLayout이므로 .setOrientation()은 꼭 해주자. 동적 생성했으므로 이들을 구별해 주기 위해 tag도 달아 주면 좋다. 나중에 tag로 뷰를 찾을 수도 있다.

  commentBox.addView(createTextView(who, 1, isMyComment));
  commentBox.addView(createTextView(what, 2, isMyComment));
  commentBox.addView(createTextView(when, 3, isMyComment));
  LL_comments.addView(commentBox);

함수 맨 끝이다. commentBox에 닉네임(who), 내용(what), 날짜(when) TextView를 createTextView() 함수로 각각 생성해 추가해 주고, LL_comments라는 최종 댓글창 LinearLayout에 commentBox를 추가해 준다.

만약 isMyComment == 1, 즉 내 댓글이라면 삭제 기능을 넣어준다. .setOnClickListener()로 클릭했을 때 알림창(AlertDialog)을 띄워 주자.

알림창(AlertDialog) 띄우기

builder.setPositiveButton("확인", new DialogInterface.OnClickListener(){
  @Override
  public void onClick(DialogInterface dialog, int which){
    Log.d("ClickedMyComment", "확인");
    mDatabase.collection("catInfo/" + catName + "/comments").document(docID)
            .delete()
            .addOnSuccessListener(new OnSuccessListener<Void>(){
              @Override
              public void onSuccess(Void aVoid){
                Log.d("ClickedMyComment", "DocumentSnapshot successfully deleted!");
              }
            })
            .addOnFailureListener(new OnFailureListener(){
              @Override
              public void onFailure(@NonNull Exception e){
                Log.w("ClickedMyComment", "Error deleting document", e);
              }
            });
    commentBox.setVisibility(View.GONE);
  }
});
builder.setNegativeButton("취소", new DialogInterface.OnClickListener(){
  @Override
  public void onClick(DialogInterface dialog, int which){
    Log.d("ClickedMyComment", "취소");
  }
});
//builder.setIcon(R.drawable.ic_launcher);
builder.setTitle("댓글을 지우시겠습니까?");
AlertDialog alertDialog = builder.create();
alertDialog.show();

builder.setPositiveButton()builder.setNegativeButton()에 각 버튼 이름과 수행할 내용을 넣어 주면 된다.
확인 버튼에서 DB에 작성된 댓글 문서를 받아온 인자 docID로 찾아 삭제한다. 그리고 commentBox.setVisibility(View.GONE);으로 해당 댓글을 현재 창에서도 삭제시킨다.
취소 버튼에서는 딱히 할 일이 없으므로 .setNegativeButton()은 그냥 로그만 띄우고 비워 뒀다.

mDatabase.document(documentPath).delete();

DB에서 문서 삭제~~ 매우 간단

이후 .setIcon()으로 아이콘을 설정할 수도 있고, .setTitle()로 알림 내용도 설정한다.
</br>

주의할 점

AlertDialog.Builder builder;
builder = new AlertDialog.Builder(this);

builder 변수는 createComment() 함수 내에서 선언하지 않고 onCreate()에서 초기화 시켜 준다. 함수 내에서 선언할 경우 정확한 오류 메세지는 기억이 나지 않는데 context가 문제가 있는 건지 자꾸 오류가 뜨기 때문~~
</br>

댓글남기기