2017-02-13 9 views
2

AlertDialogが表示され、アプリケーションが終了または破棄されるたびに、私はこのエラーをlogcat has leaked windowに取得します。私は、下記のonDestroy()メソッドを使用するとそのエラーを取り除きますが、AlertDialogがアクティビティの内部にある場合にのみ機能することがわかります。しかし、私の場合、私はアプリケーション終了時にアダプタ内のAlertDialogを終了する

@Override 
public void onDestroy(){ 
    super.onDestroy(); 
    if(alertDialog != null && alertDialog.isShowing()) { 
     alertDialog.cancel(); 
    } 
} 

Logcatエラー以下のコードに示されているアダプタの内側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); 
      } 

     } 
    } 
+1

@Override ます。public void onPause(){ super.onPause(); if(alertDialog!= null && alertDialog.isShowing()){ alertDialog.cancel(); } }これは役に立ちます。 –

+0

アクティビティでダイアログインスタンスを作成し、アダプタに渡します。次に、アクティビティで 'dismiss'を使用することができます。 – TruongHieu

答えて

0

私は1つ(であってもよい)の可能な解決策を持っています。

AlertDialog.Builder builder = new AlertDialog.Builder(mContext.getApplicationContext(), R.style.AppCompatAlertDialogStyle); 

注意して

AlertDialog.Builder builder = new AlertDialog.Builder(mContext, R.style.AppCompatAlertDialogStyle); 

を交換します。アプリケーションのコンテキストを使用して、アクティビティのコンテキストを交換してください。このリークの原因となっているアラートダイアログで、アクティビティに参照がある可能性があります。

0

あなたはインターフェイスを使用してコールバックを設定でき、あなたのアクティビティに通知します。

あなたのアダプタ

public class MyAdapter extends RecyclerView.Adapter <MyAdapter.ViewHolder>{ 

     private List<Movies> moviesList; 
     private Context mContext; 
     AlertDialog alertDialog; 
     private AdapterCallback callback; 



    public MyAdapter (Context context, List<Movies> list, AdapterCallback callback) { 
      mContext = context; 
      moviesList= list; 
      this.callback=callback; 
     } 

     @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) { 

       if(this.callback!=null) 
        callback.onButtonLongPress(holder.getAdapterPosition()) 
       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); 
      } 

     } 

    public interface AdapterCallback{ 
    void onButtonLongPress(int position); 
} 
    } 


**Your Activity** 

    public MyActivity extends Activity implement MyAdapter.AdapterCallback{ 
    ... 

    void onButtonLongPress(final int position){ 

      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(); 

      } 
} 
関連する問題