每當AlertDialog
顯示並且應用程序已關閉或銷燬時,我在logcat has leaked window
中得到此錯誤。我知道使用下面的onDestroy()
方法可以消除該錯誤,但只有在AlertDialog
位於活動中時才起作用。然而,在我的情況下,我使用適配器內部的AlertDialog
這顯示在下面的代碼當應用程序關閉時關閉AlertDialog內部適配器
@Override
public void onDestroy(){
super.onDestroy();
if(alertDialog != null && alertDialog.isShowing()) {
alertDialog.cancel();
}
}
logcat的錯誤。
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);
}
}
}
@覆蓋 公共無效的onPause(){ super.onPause(); (alertDialog!= null && alertDialog.isShowing()){ alertDialog.cancel(); } }希望這會幫助你 –
在Activity中創建對話框實例,並將它傳遞給Adapter。然後你可以在Activity中使用'dismiss'。 – TruongHieu