FengChenSunshine / UiStatus

一个简单且强大的Ui状态视图控制库!
140 stars 23 forks source link

集成到BaseFragment 中,mUiStatus报空指针 #11

Closed Vancons closed 4 years ago

Vancons commented 4 years ago
protected UiStatusController mUiStatus; 

@Override public View onCreateView(@NotNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

    View view = inflater.inflate(setContentView(), container, false);
    unbinder = ButterKnife.bind(this, view);
    mRefreshLayout = view.findViewById(R.id.refreshLayout);
    initContentView(view, savedInstanceState);
    mUiStatus = UiStatusController.get();
    mUiStatus.changeUiStatusIgnore(UiStatus.CONTENT); // 报空指针异常
    return mUiStatus.bindFragment(view);

}
FengChenSunshine commented 4 years ago

changeUiStatusIgnore方法应该放在bindFragment方法之后再去调用。 你先调用mUiStatus.changeUiStatusIgnore(UiStatus.CONTENT);方法想要显示内容视图,这个时候内容视图还没有绑定肯定会空指针,你是在调用这个方法后面才调用的mUiStatus.bindFragment(view)方法区绑定的内容视图。

Vancons commented 4 years ago

@FengChenSunshine 是的 ,把changeUiStatusIgnore注释掉,然后再子类的initContentView 中使用 mUiStatus.changeUiStatus 或者 mUiStatus.showWidget 时还是报空。是不是初始化时有问题? //初始化 UiStatusManager uiStatusManager = UiStatusManager.getInstance(); uiStatusManager.addUiStatusConfig(UiStatus.EMPTY, R.layout.layout_empty_view, R.id.tv_retry_loading, new OnRetryListener() { @Override public void onUiStatusRetry(@NonNull Object target, @NonNull IUiStatusController controller, @NonNull View trigger) { controller.changeUiStatus(UiStatus.LOADING); } }).setWidgetMargin(UiStatus.EMPTY,50,0) .addUiStatusConfig(UiStatus.NETWORK_ERROR, R.layout.layout_nonetwork_view, R.id.tv_retry_loading, new OnRetryListener() { @Override public void onUiStatusRetry(@NonNull Object target, @NonNull IUiStatusController controller, @NonNull View trigger) { controller.changeUiStatus(UiStatus.LOADING); } }) .addUiStatusConfig(UiStatus.LOAD_ERROR,R.layout.layout_error_view,R.id.tv_retry_loading,new OnRetryListener(){ @Override public void onUiStatusRetry(@NonNull Object target, @NonNull IUiStatusController controller, @NonNull View trigger) { controller.changeUiStatus(UiStatus.LOADING); } }) .addUiStatusConfig(UiStatus.LOADING, R.layout.layout_loading_view) .setWidgetMargin(UiStatus.LOADING, 50,0);

FengChenSunshine commented 4 years ago

不是初始化问题,是你调用顺序问题。 1.先调用bindFragment方法绑定内容视图; 2.绑定之后才能使用changeUiStatus等方法切换视图状态。 你在子类的initContentView当中调用和在BaseFragment调用都是将其放在了bindFragment之前进行的。

Vancons commented 4 years ago

@FengChenSunshine 多谢。