razerdp / BasePopup

Android下打造通用便捷的PopupWindow弹窗库
https://github.com/razerdp/BasePopup
Apache License 2.0
5.2k stars 758 forks source link

在popwindow内部调用callInit函数无效 #146

Closed zhengdaone closed 5 years ago

zhengdaone commented 5 years ago

import android.animation.Animator; import android.content.Context; import android.view.View; import android.view.ViewGroup; import android.view.animation.Animation; import android.view.animation.OvershootInterpolator; import android.view.animation.TranslateAnimation; import android.widget.ExpandableListView; import android.widget.ListAdapter;

import carbon.pinyi.com.phone.infrastructure.utils.LayoutUtils; import carbon.pinyi.com.phone.service.business.listener.HandleNetworkError; import razerdp.basepopup.BasePopupWindow;

/**

public abstract class BaseFilterPopWindow extends BasePopupWindow implements HandleNetworkError { private Context context; private int width; private int height; private boolean isDestroyed = true; private View anchorView;

public BaseFilterPopWindow(Context context) {
    super(context);
}

public BaseFilterPopWindow(Context context, int w, int h) {
    super(context, w, h, false);
    this.context = context;
    this.width = w;
    this.height = h;
}

public BaseFilterPopWindow(Context context, int w, int h, boolean initImmediately) {
    super(context, w, h, false);
    this.context = context;
    this.width = w;
    this.height = h;
}

void setListViewHeight(ExpandableListView listView) {
    LayoutUtils.setListViewHeight(listView);
}

@Override
public void recreatePage() {
    this.dismiss();
    this.showPopupWindow(anchorView);
}

@Override
public void destroyPage() {
    this.dismiss();
    this.isDestroyed = true;
}

@Override
public void showPopupWindow() {
    callInit(context, width, height);
    super.showPopupWindow();
}

@Override
public void showPopupWindow(int anchorViewResid) {
    callInit(context, width, height);
    super.showPopupWindow(anchorViewResid);
}

@Override
public void showPopupWindow(View anchorView) {
    callInit(context, width, height);
    super.showPopupWindow(anchorView);
    this.anchorView = anchorView;
}

@Override
protected void callInit(Context context, int w, int h) {
    if (this.isDestroyed) {
        super.callInit(context, w, h);
        setBackPressEnable(true);
        setAllowDismissWhenTouchOutside(true);
        setAlignBackground(true);
        this.isDestroyed = false;
    }
}

}

razerdp commented 5 years ago

callInit是给quickpopup用的…

你应该更新到最新版本,并阅读readme和wiki…有update()方法或者delayInit供延迟加载。

2.0.8已经太旧了

zhengdaone commented 5 years ago

我尝试过更新到最新版本2.1.8。但是也无效。请问初始化一次之后,就不能允许再次初始化了吗?因为我看到你做了这样的控制:

razerdp commented 5 years ago

额,请问你为什么要再初始化一遍,一般来说初始化之后就不允许再初始化了,因为那样会生成两个对象,就好比你在A里面new A(),两个都不是同一个对象。

zhengdaone commented 5 years ago

我的需求是这样的

我使用你的库做筛选框的弹窗。筛选框里面有很多组件,其中一些组件绑定的数据会通过发送网络请求获取,有的时候会有网络相关的异常抛出导致数据获取失败。异常产生时app会弹出一个错误消息页面,提供用户刷新和返回2种操作。返回会调用dismiss()使弹窗隐藏,刷新会使弹窗重新加载。

现在的问题是

用户点击返回,再次打开弹窗能重新渲染。但是我使用代码模拟这个操作不能成功。 image image

zhengdaone commented 5 years ago

并且在最新版还不支持重复init了。。。

razerdp commented 5 years ago

你的意思是,dismiss()之后再重新showPopup()ui没有更新对吧。

我看了下你贴的代码,你的代码里都是一些basepopup的属性配置,但唯独这个callInit(),在2.0.8的时候,callInit()确实是保留了的,但是当时这个方法的目的其实是为了延迟加载,后来对延迟加载进行了优化。

但是初始化实质上是调用了basePopup的initView方法,该方法会导致重走一遍整个popup的生命期,包括了重新构造一个popup对象,正因为这样,延迟加载仅允许加载一次。

目前我看了你的代码,如果你仅仅需要在dismiss后重新showPopup,你完全可以在showPopupWindow()里面甚至是setOnBeforeShowCallback()里面进行刷新UI操作,而不应该重新构造一遍。

另外,init()一直都是不允许重复的。

zhengdaone commented 5 years ago

好吧,我再想想法,希望你以后能提供一个重新渲染popwindow的api

razerdp commented 5 years ago

update()就是

zhengdaone commented 5 years ago

update()似乎达不到Activity提供的recreate()的效果

razerdp commented 5 years ago

考虑再三后,还是不加入recreate()方法,抱歉。