最近項(xiàng)目要求加入骨架屏,引用之后發(fā)現(xiàn)在fragment中把代碼放入onCreateView( )方法中發(fā)現(xiàn)不顯示,以此作為記錄。
原因查看:
1.點(diǎn)開.show()方法進(jìn)入ViewSkeletonScreen.class
2.找到
private View generateSkeletonLoadingView() {
ViewParent viewParent = mActualView.getParent();
if (viewParent == null) {
Log.e(TAG, "the source view have not attach to any view");
return null;
}
ViewGroup parentView = (ViewGroup) viewParent;
if (mShimmer) {
return generateShimmerContainerLayout(parentView);
}
return LayoutInflater.from(mActualView.getContext()).inflate(mSkeletonResID, parentView, false);
}
通過log發(fā)現(xiàn)進(jìn)入了
Log.e(TAG, "the source view have not attach to any view");
解決方法
1.xml中不要直接引用最外層布局,而是里面嵌套一層
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".deviceport.home.fragment.PortCourseListNewFragment">
<!-- 篩選-->
<RelativeLayout
android:id="@+id/filterRl"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:visibility="gone"
app:layout_constraintTop_toTopOf="parent" />
<!-- 顯示骨架層的位置-->
<LinearLayout
android:id="@+id/mainView"
android:layout_width="match_parent"
android:layout_height="0dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintTop_toBottomOf="@+id/filterRl">
<com.scwang.smartrefresh.layout.SmartRefreshLayout
android:id="@+id/refreshSl"
android:layout_width="match_parent"
android:layout_height="match_parent">
</com.scwang.smartrefresh.layout.SmartRefreshLayout>
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
2.在onResume()中調(diào)用方法,在數(shù)據(jù)加載完畢的時(shí)候關(guān)閉骨架屏
@Override
public void onResume() {
super.onResume();
//骨架屏
if (!loadDataFinish) {
skeletonScreen = Skeleton.bind(binding.mainView)
.load(R.layout.skeleton_course_list)
.shimmer(true)
.angle(ParamsUtil.SkeletonAngle)
.duration(ParamsUtil.SkeletonTime)
.color(R.color.skeleton_line_color)
.show();
}
}
@Override
public void showPlanList(ArrayList<PlanModelBean> planList) {
if (!loadDataFinish&&skeletonScreen!=null) {
loadDataFinish = true;
skeletonScreen.hide();
}
}