razerdp/BasePopup

关于delayInit的问题

Closed this issue · 12 comments

如果我创建BasePop时设置了delayInit,我在继承的BasePopWindow里面在哪调用findViewById,没有回调函数供我初始化组件

在你调用delayInit之后.

就像你在activity里任意地方setContentView()之后才可以findviewbyid找到view,basepopup也是在你delayinit()调用后才能findview,在哪里调用,就在它之后初始化,没有任何限制的。

如果我在 popwindow里面需要写业务逻辑,我需在重写 delayInIt()里面做findViewById setListener操作吗?我没看到其他合适的可以处理的方法!我的意思是应该需要提供一个initView的地方或者想Fragment 里面 onViewCreated 之类的,不管我是不是delayInit,这个初始化方法都会被调用!可以统一处理业务

感谢作者编写这么好的库!给我省了时间!送上10元略表感谢

主要我不想再activity里面调用pop一些操作!只在activity里面调用 show 和 dismiss方法!其他的组件初始化全部在 pop里面执行!所以我觉得是否可以提供一个 不管我是不是delayInit 都能处理findViewById 和 setListener的回调方法

首先感谢你的建议,但是首先有一点需要明确的是。。。BasePopup设计初衷就是紧跟系统原生PopupWindow的设计,BasePopup主要做的是去繁就简。

其次为什么没有你所说的方法,是因为现在的框架就已经有了这个方法,同时还是你必须实现的方法。。。

而且,当onXXX()多了,那么你的思路就不得不按照我所设计的onXXX()进行,就如activity里你setContentView()之后为啥没有onViewInflated()回调让我去findView?,delayInit()没有强要求回调的原因正是如此,我不希望开发者受限于我所提供的api,而是把最大的控制权让给开发者去开发出他们天马行空的功能。

最后,针对你所说的问题,在上面的回答和这篇回答里我都提供了解决方案了,顺带附上代码给你吧。。。

public class DemoPopup extends BasePopupWindow {
    public DemoPopup(Context context) {
        super(context,true);

        //方法一
        //在初始化之前做你任何想做的
        delayInit();
        //findView()
    }

    @Override
    public View onCreateContentView() {
        //方法二
        //该方法无论是否delayInit()都会在初始化的时候回调
        View contentView = createPopupById();

        contentView.findViewById()
        return contentView;
    }
}

解决方案我是可以找到的,其实我就是想统一有一个方法!可能每个人的**不太一样吧!如果在onCreateContentView() 里面处理的话,就不能调用 自带的 pop.findViewById。delayInit()方法里面处理又不能处理非delayInit的情况,看来我需要自己做抽象判断了

嗯嗯,确实如你所说不能用到findViewById(),同时我也突然想起似乎对butterknife这种注入也不太友好,我下一个版本加一下onInit()吧。

是的 类似Fragment都有 onViewCreated方法,因为你这个和activity还不太一样!activity是主动设置setContentView(),basePop 是通过回调的方法返回View,提供onInit 不会和外部调用findViewById冲突

onInit已添加,另外经过思考,delayInit放在构造器对用户并不友好,因此下一个版本将会放弃,并添加lazypopupwindow,而且lazypopupwindow的初始化时机将会在调用show()方法,也就是说不需要进行主动调用inity,当然我也会保留主动init的方式,毕竟有可能需要提前init的

请问啥时候更新2.2.2啊

大约年底