AlertDialog
이 표시되고 응용 프로그램이 닫히거나 파괴 될 때마다이 오류가 logcat has leaked window
에 발생합니다. 나는 아래의 onDestroy()
메서드를 사용하여 해당 오류를 제거하지만 AlertDialog
이 작업 내에있는 경우에만 작동한다는 것을 알고 있습니다. 그러나 내 경우에는 내가응용 프로그램이 닫힐 때 어댑터 내부에서 AlertDialog를 닫습니다.
@Override
public void onDestroy(){
super.onDestroy();
if(alertDialog != null && alertDialog.isShowing()) {
alertDialog.cancel();
}
}
로그 캣 오류 아래의 코드에 표시되는 어댑터 내부의 AlertDialog
을 사용하고 있습니다.
Activity com.test.example.MovieList has leaked window
com.android.internal.policy.impl.PhoneWindow$DecorView{1ed0b473 V.E..... R.......
0,0-1080,543} that was originally added here at android.view.ViewRootImpl.<init>
(ViewRootImpl.java:363)
어댑터
public class MyAdapter extends RecyclerView.Adapter <MyAdapter.ViewHolder>{
private List<Movies> moviesList;
private Context mContext;
AlertDialog alertDialog;
public MyAdapter (Context context, List<Movies> list) {
mContext = context;
moviesList= list;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
mContext = parent.getContext();
View view = View.inflate(parent.getContext(), R.layout.movies, null);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(final ViewHolder holder, int viewType) {
final Movies movies = moviesList.get(holder.getAdapterPosition());
final String id = movies.getId()
holder.title.setText(movies.getTitle());
holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
AlertDialog.Builder builder = new AlertDialog.Builder(mContext, R.style.AppCompatAlertDialogStyle);
builder.setTitle(R.string.dialog_title);
builder.setPositiveButton("Delete", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
moviesList.remove(holder.getAdapterPosition());
DBHelper db = new DBHelper (mContext);
db.deleteMovie(movie);
notifyDataSetChanged();
db.close();
dialog.dismiss();
}
});
builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.cancel();
}
});
alertDialog = builder.create();
alertDialog.show();
return false;
}
});
}
@Override
public int getItemCount() {
return (moviesList != null? moviesList.size():0);
}
class ViewHolder extends RecyclerView.ViewHolder {
TextView title;
ViewHolder(View itemView) {
super(itemView);
title = (TextView) itemView.findViewById(R.id.movie_title);
}
}
}
@Override 공공 무효 onPause() { super.onPause(); if (alertDialog! = null && alertDialog.isShowing()) { alertDialog.cancel(); } } 희망이 도움이 될 것입니다 –
Activity에서 Dialog 인스턴스를 생성하고 어댑터로 전달하십시오. 그런 다음 활동에서'dismiss'를 사용할 수 있습니다. – TruongHieu