Firestore: DB를 활용해서 간단한 댓글 기능을 만들기② - LinearLayout 동적 생성, AlertDialog
목차
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를 담아 댓글 하나를 만드는 함수다.
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>
댓글남기기