2017-07-01 18 views
0
我在与我的应用程序显示以下错误麻烦

Android的 - 内存泄漏与弹出窗口中Recyclerview

“E /窗口管理器:android.view.WindowLeaked:活动com.awt.myapp.MyList有泄露的窗口android.widget.PopupWindow $ PopupDecorView {84fdb1f VE ..... ....... D 0,0-369,120}原来在这里添加...“

基本上我有一个recyclerview和适配器中,我在每行中都有一堆文本视图,并且绑定时单击它们的监听器,因为单击其中一个文本视图会弹出一个窗口。问题是,如果我在弹出窗口仍然可见时点击Android后退按钮,则会出现上述错误。

我明白,在我的活动,持有recyclerview我可以添加一个“onBackPressed()”方法,但在这里我不知道如何获取适配器内任何弹出窗口的引用(和关闭它在这个阶段),因为我相信这是我需要做的。

下面是我的点击监听器的代码,我曾与一些选项尝试和具有setFocusable只是导致后退按钮停止工作,所以不知道这是必要的。

tv.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View moreInfoView) { 

       myPopupWindow.setBackgroundDrawable(new ColorDrawable()); 
       //myPopupWindow.setFocusable(true); 
       myPopupWindow.setTouchable(false); // Ignores taps 
       myPopupWindow.setOutsideTouchable(true); // Disappear when tapping anywhere on screen 
       int position = -tv.getHeight(); 
       myPopupWindow.showAsDropDown(tv, 0, position); 
       ((MyList) context).onToggleMoreInfo("show"); 
       myPopupWindow.setOnDismissListener(new PopupWindow.OnDismissListener() { 
        @Override 
        public void onDismiss() { 
         ((MyList) context).onToggleMoreInfo("hide"); 
        } 
       });     
      } 
     }); 

希望这是有道理的,如果你需要更多的信息让我知道。任何意见,将不胜感激。

回答

0

如果您创建适配器上的监听器实现的活动,当你点击的项目的话来说,你可以弹出窗口的逻辑出口活动,并覆盖上回压到dimiss它。

+0

好了,去研究如何去这样做,可能会回来了疑问:d感谢。 – Loop77

0

退出你的活动之前,您应该dissmiss在任何生命周期回调的弹出窗口(myPopupWindow),例如在onPause()或onDestroy()中。

+0

我不知道我是如何实际上定位从适配器内部创建的弹出窗口,但是从活动本身开始? – Loop77

+0

为什么你确定你弹出鉴于该适配器应该在你活动你对它的引用在您适配器和正确的数据[链接]在它充气(https://stackoverflow.com/questions/39474114/弹出式窗口在-recyclerview适配器) –

+0

因为存在用于recyclerview的每个元素的多个弹出窗口。我在适配器的ViewHolder中定义和扩充它。 – Loop77