Commit dff0835b by 郑娜伟

widget 添加加载布局控件

parent fb2d87e4
......@@ -8,7 +8,7 @@ android {
defaultConfig {
applicationId "com.sobot.moduletest"
minSdkVersion 14
minSdkVersion 16
targetSdkVersion 28
versionCode 1
versionName "1.0"
......@@ -35,7 +35,7 @@ dependencies {
implementation project(':sobot_common')
// implementation project(':sobot_widget')
implementation 'com.sobot.library:widget:0.1'
implementation 'com.sobot.library:widget:0.2'
// api 'com.sobot.library:sobotcommon:1.0'
// api 'com.sobot.library:sobotcommon_x:1.0'
......
......@@ -14,6 +14,7 @@ import com.sobot.common.utils.SobotImageUtils;
import com.sobot.network.http.db.SobotDownloadManager;
import com.sobot.pictureframe.SobotBitmapUtil;
import com.sobot.utils.SobotLogUtils;
import com.sobot.widget.loading.SobotLoadingLayout;
import com.sobot.widget.refresh.layout.api.RefreshLayout;
import com.sobot.widget.refresh.layout.footer.ClassicsFooter;
import com.sobot.widget.refresh.layout.header.ClassicsHeader;
......@@ -27,6 +28,7 @@ public class MainActivity extends SobotBaseActivity {
private ImageView img;
private ImageView img2;
private SobotLoadingLayout loadinglayout ;
@Override
protected int getContentViewResId() {
......@@ -84,6 +86,8 @@ public class MainActivity extends SobotBaseActivity {
refreshLayout.setRefreshFooter(new ClassicsFooter(this));
refreshLayout.setEnableLoadMore(false);
loadinglayout=findViewById(R.id.loadinglayout);
loadinglayout.showContent();
}
@Override
......
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="vertical"
tools:context=".MainActivity">
......@@ -29,17 +29,21 @@
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.v7.widget.RecyclerView
android:id="@+id/recyclerView"
<com.sobot.widget.loading.SobotLoadingLayout
android:id="@+id/loadinglayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#fff"
android:overScrollMode="never" />
app:llEmptyImage="@drawable/ic_launcher_background">
<android.support.v7.widget.RecyclerView
android:id="@+id/recyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#fff"
android:overScrollMode="never" />
</com.sobot.widget.loading.SobotLoadingLayout>
</com.sobot.widget.refresh.layout.SobotRefreshLayout>
</LinearLayout>
\ No newline at end of file
......@@ -6,7 +6,7 @@ android {
compileSdkVersion 28
defaultConfig {
minSdkVersion 14
minSdkVersion 16
}
}
......
......@@ -13,7 +13,7 @@ ext {
PUBLISH_GROUP_ID = "com.sobot.library" //项目包名
PUBLISH_ARTIFACT_ID = 'widget' //项目名
// PUBLISH_ARTIFACT_ID = 'widget_x' //项目名
PUBLISH_VERSION = '0.1' //版本号
PUBLISH_VERSION = '0.2' //版本号
}
......
/*
* Copyright 2016 czy1121
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.sobot.widget.loading;
import android.app.Activity;
import android.app.Fragment;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.drawable.Drawable;
import android.support.annotation.DrawableRes;
import android.support.annotation.LayoutRes;
import android.util.AttributeSet;
import android.util.TypedValue;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.TextView;
import com.sobot.widget.R;
import java.util.HashMap;
import java.util.Map;
public class SobotLoadingLayout extends FrameLayout {
public interface OnInflateListener {
void onInflate(View inflated);
}
public static SobotLoadingLayout wrap(Activity activity) {
return wrap(((ViewGroup) activity.findViewById(android.R.id.content)).getChildAt(0));
}
public static SobotLoadingLayout wrap(Fragment fragment) {
return wrap(fragment.getView());
}
public static SobotLoadingLayout wrap(View view) {
if (view == null) {
throw new RuntimeException("content view can not be null");
}
ViewGroup parent = (ViewGroup) view.getParent();
if (view == null) {
throw new RuntimeException("parent view can not be null");
}
ViewGroup.LayoutParams lp = view.getLayoutParams();
int index = parent.indexOfChild(view);
parent.removeView(view);
SobotLoadingLayout layout = new SobotLoadingLayout(view.getContext());
parent.addView(layout, index, lp);
layout.addView(view);
layout.setContentView(view);
return layout;
}
int mEmptyImage;
CharSequence mEmptyText;
int mErrorImage;
CharSequence mErrorText, mRetryText;
OnClickListener mRetryButtonClickListener = new OnClickListener() {
@Override
public void onClick(View v) {
if (mRetryListener != null) {
mRetryListener.onClick(v);
}
}
};
OnClickListener mRetryListener;
OnInflateListener mOnEmptyInflateListener;
OnInflateListener mOnErrorInflateListener;
int mTextColor, mTextSize;
int mButtonTextColor, mButtonTextSize;
Drawable mButtonBackground;
int mEmptyResId = NO_ID, mLoadingResId = NO_ID, mErrorResId = NO_ID;
int mContentId = NO_ID;
Map<Integer, View> mLayouts = new HashMap<>();
public SobotLoadingLayout(Context context) {
this(context, null, R.attr.styleLoadingLayout);
}
public SobotLoadingLayout(Context context, AttributeSet attrs) {
this(context, attrs, R.attr.styleLoadingLayout);
}
public SobotLoadingLayout(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
mInflater = LayoutInflater.from(context);
TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.SobotLoadingLayout, defStyleAttr, R.style.SobotLoadingLayout_Style);
mEmptyImage = a.getResourceId(R.styleable.SobotLoadingLayout_llEmptyImage, NO_ID);
mEmptyText = a.getString(R.styleable.SobotLoadingLayout_llEmptyText);
mErrorImage = a.getResourceId(R.styleable.SobotLoadingLayout_llErrorImage, NO_ID);
mErrorText = a.getString(R.styleable.SobotLoadingLayout_llErrorText);
mRetryText = a.getString(R.styleable.SobotLoadingLayout_llRetryText);
mTextColor = a.getColor(R.styleable.SobotLoadingLayout_llTextColor, 0xff999999);
mTextSize = a.getDimensionPixelSize(R.styleable.SobotLoadingLayout_llTextSize, dp2px(16));
mButtonTextColor = a.getColor(R.styleable.SobotLoadingLayout_llButtonTextColor, 0xff999999);
mButtonTextSize = a.getDimensionPixelSize(R.styleable.SobotLoadingLayout_llButtonTextSize, dp2px(16));
mButtonBackground = a.getDrawable(R.styleable.SobotLoadingLayout_llButtonBackground);
mEmptyResId = a.getResourceId(R.styleable.SobotLoadingLayout_llEmptyResId, R.layout.sobot_loading_layout_empty);
mLoadingResId = a.getResourceId(R.styleable.SobotLoadingLayout_llLoadingResId, R.layout.sobot_loading_layout_loading);
mErrorResId = a.getResourceId(R.styleable.SobotLoadingLayout_llErrorResId, R.layout.sobot_loading_layout_error);
a.recycle();
}
int dp2px(float dp) {
return (int) (getResources().getDisplayMetrics().density * dp);
}
LayoutInflater mInflater;
@Override
protected void onFinishInflate() {
super.onFinishInflate();
if (getChildCount() == 0) {
return;
}
if (getChildCount() > 1) {
removeViews(1, getChildCount() - 1);
}
View view = getChildAt(0);
setContentView(view);
showLoading();
}
private void setContentView(View view) {
mContentId = view.getId();
mLayouts.put(mContentId, view);
}
public SobotLoadingLayout setLoading(@LayoutRes int id) {
if (mLoadingResId != id) {
remove(mLoadingResId);
mLoadingResId = id;
}
return this;
}
public SobotLoadingLayout setEmpty(@LayoutRes int id) {
if (mEmptyResId != id) {
remove(mEmptyResId);
mEmptyResId = id;
}
return this;
}
public SobotLoadingLayout setOnEmptyInflateListener(OnInflateListener listener) {
mOnEmptyInflateListener = listener;
if (mOnEmptyInflateListener != null && mLayouts.containsKey(mEmptyResId)) {
listener.onInflate(mLayouts.get(mEmptyResId));
}
return this;
}
public SobotLoadingLayout setOnErrorInflateListener(OnInflateListener listener) {
mOnErrorInflateListener = listener;
if (mOnErrorInflateListener != null && mLayouts.containsKey(mErrorResId)) {
listener.onInflate(mLayouts.get(mErrorResId));
}
return this;
}
public SobotLoadingLayout setEmptyImage(@DrawableRes int resId) {
mEmptyImage = resId;
image(mEmptyResId, R.id.empty_image, mEmptyImage);
return this;
}
public SobotLoadingLayout setEmptyText(String value) {
mEmptyText = value;
text(mEmptyResId, R.id.empty_text, mEmptyText);
return this;
}
public SobotLoadingLayout setErrorImage(@DrawableRes int resId) {
mErrorImage = resId;
image(mErrorResId, R.id.error_image, mErrorImage);
return this;
}
public SobotLoadingLayout setErrorText(String value) {
mErrorText = value;
text(mErrorResId, R.id.error_text, mErrorText);
return this;
}
public SobotLoadingLayout setRetryText(String text) {
mRetryText = text;
text(mErrorResId, R.id.retry_button, mRetryText);
return this;
}
public SobotLoadingLayout setRetryListener(OnClickListener listener) {
mRetryListener = listener;
return this;
}
// public SobotLoadingLayout setTextColor(@ColorInt int color) {
// mTextColor = color;
// return this;
// }
// public SobotLoadingLayout setTextSize(@ColorInt int dp) {
// mTextColor = dp2px(dp);
// return this;
// }
// public SobotLoadingLayout setButtonTextColor(@ColorInt int color) {
// mButtonTextColor = color;
// return this;
// }
// public SobotLoadingLayout setButtonTextSize(@ColorInt int dp) {
// mButtonTextColor = dp2px(dp);
// return this;
// }
// public SobotLoadingLayout setButtonBackground(Drawable drawable) {
// mButtonBackground = drawable;
// return this;
// }
public void showLoading() {
show(mLoadingResId);
}
public void showEmpty() {
show(mEmptyResId);
}
public void showError() {
show(mErrorResId);
}
public void showContent() {
show(mContentId);
}
private void show(int layoutId) {
for (View view : mLayouts.values()) {
view.setVisibility(GONE);
}
layout(layoutId).setVisibility(VISIBLE);
}
private void remove(int layoutId) {
if (mLayouts.containsKey(layoutId)) {
View vg = mLayouts.remove(layoutId);
removeView(vg);
}
}
private View layout(int layoutId) {
if (mLayouts.containsKey(layoutId)) {
return mLayouts.get(layoutId);
}
View layout = mInflater.inflate(layoutId, this, false);
layout.setVisibility(GONE);
addView(layout);
mLayouts.put(layoutId, layout);
if (layoutId == mEmptyResId) {
ImageView img = (ImageView) layout.findViewById(R.id.empty_image);
if (img != null) {
img.setImageResource(mEmptyImage);
}
TextView view = (TextView) layout.findViewById(R.id.empty_text);
if (view != null) {
view.setText(mEmptyText);
view.setTextColor(mTextColor);
view.setTextSize(TypedValue.COMPLEX_UNIT_PX, mTextSize);
}
if (mOnEmptyInflateListener != null) {
mOnEmptyInflateListener.onInflate(layout);
}
} else if (layoutId == mErrorResId) {
ImageView img = (ImageView) layout.findViewById(R.id.error_image);
if (img != null) {
img.setImageResource(mErrorImage);
}
TextView txt = (TextView) layout.findViewById(R.id.error_text);
if (txt != null) {
txt.setText(mErrorText);
txt.setTextColor(mTextColor);
txt.setTextSize(TypedValue.COMPLEX_UNIT_PX, mTextSize);
}
TextView btn = (TextView) layout.findViewById(R.id.retry_button);
if (btn != null) {
btn.setText(mRetryText);
btn.setTextColor(mButtonTextColor);
btn.setTextSize(TypedValue.COMPLEX_UNIT_PX, mButtonTextSize);
btn.setBackground(mButtonBackground);
btn.setOnClickListener(mRetryButtonClickListener);
}
if (mOnErrorInflateListener != null) {
mOnErrorInflateListener.onInflate(layout);
}
}
return layout;
}
private void text(int layoutId, int ctrlId, CharSequence value) {
if (mLayouts.containsKey(layoutId)) {
TextView view = (TextView) mLayouts.get(layoutId).findViewById(ctrlId);
if (view != null) {
view.setText(value);
}
}
}
private void image(int layoutId, int ctrlId, int resId) {
if (mLayouts.containsKey(layoutId)) {
ImageView view = (ImageView) mLayouts.get(layoutId).findViewById(ctrlId);
if (view != null) {
view.setImageResource(resId);
}
}
}
}
......@@ -50,7 +50,7 @@ public class ClassicsFooter extends ClassicsAbstract<ClassicsFooter> implements
public ClassicsFooter(Context context, AttributeSet attrs) {
super(context, attrs, 0);
View.inflate(context, R.layout.srl_classics_footer, this);
View.inflate(context, R.layout.sobot_srl_classics_footer, this);
final View thisView = this;
final View arrowView = mArrowView = thisView.findViewById(R.id.srl_classics_arrow);
......
......@@ -79,7 +79,7 @@ public class ClassicsHeader extends ClassicsAbstract<ClassicsHeader> implements
public ClassicsHeader(Context context, AttributeSet attrs) {
super(context, attrs, 0);
View.inflate(context, R.layout.srl_classics_header, this);
View.inflate(context, R.layout.sobot_srl_classics_header, this);
final View thisView = this;
final View arrowView = mArrowView = thisView.findViewById(R.id.srl_classics_arrow);
......
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<corners android:radius="5dp" />
<stroke android:width="1px" android:color="#CCCCCC" />
</shape>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:gravity="center"
android:orientation="vertical">
<ImageView
android:id="@id/empty_image"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:adjustViewBounds="true" />
<TextView
android:id="@id/empty_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginTop="14dp" />
</LinearLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:gravity="center"
android:orientation="vertical"
android:paddingBottom="30dp">
<ImageView
android:id="@id/error_image"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:adjustViewBounds="true" />
<TextView
android:id="@id/error_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_margin="20dp" />
<TextView
android:id="@id/retry_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:background="@drawable/sobot_loading_layout_button"
android:gravity="center"
android:minWidth="120dp"
android:padding="10dp" />
</LinearLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:gravity="center"
android:orientation="vertical"
android:paddingBottom="30dp">
<ProgressBar
android:layout_width="30dp"
android:layout_height="30dp"
android:layout_gravity="center"
android:progress="80" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginTop="14dp"
android:text="@string/sobot_loading_string"
android:textColor="@color/sobot_loading_layout_text_color"
android:textSize="16sp" />
</LinearLayout>
\ No newline at end of file
......@@ -19,4 +19,8 @@
<string name="sobot_srl_header_update">\'Last Update\' M-d HH:mm</string>
<string name="sobot_srl_header_secondary">Release To Second Floor</string>
<string name="sobot_no_data_string">No data</string>
<string name="sobot_no_net_string">No network connection, please check your network</string>
<string name="sobot_error_click_reload_string">Loading failed, click Retry</string>
<string name="sobot_loading_string">Loading...</string>
</resources>
......@@ -24,4 +24,7 @@
<!--下拉刷新 尾部 加载中 旋转控件颜色-->
<color name="sobot_refresh_footer_progress_color">@color/sobot_refresh_progress_color</color>
<!--加载布局控件文字颜色-->
<color name="sobot_loading_layout_text_color">#8B98AD</color>
</resources>
......@@ -18,4 +18,11 @@
<string name="sobot_srl_footer_finish">加载完成</string>
<string name="sobot_srl_footer_failed">加载失败</string>
<string name="sobot_srl_footer_nothing">没有更多数据了</string>
<string name="sobot_no_data_string">暂无数据</string>
<string name="sobot_no_net_string">无网络连接,请检查您的网络...</string>
<string name="sobot_error_click_reload_string">加载失败,点击重试~~</string>
<string name="sobot_loading_string">加载中...</string>
</resources>
<?xml version="1.0" encoding="utf-8"?><!--
~ Copyright 2016 czy1121
~
~ Licensed under the Apache License, Version 2.0 (the "License");
~ you may not use this file except in compliance with the License.
~ You may obtain a copy of the License at
~
~ http://www.apache.org/licenses/LICENSE-2.0
~
~ Unless required by applicable law or agreed to in writing, software
~ distributed under the License is distributed on an "AS IS" BASIS,
~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
~ See the License for the specific language governing permissions and
~ limitations under the License.
-->
<resources>
<item name="empty_image" type="id" />
<item name="empty_text" type="id" />
<item name="error_image" type="id" />
<item name="error_text" type="id" />
<item name="retry_button" type="id" />
<attr name="styleLoadingLayout" format="reference" />
<style name="SobotLoadingLayout"></style>
<style name="SobotLoadingLayout.Style">
<item name="llEmptyResId">@layout/sobot_loading_layout_empty</item>
<item name="llLoadingResId">@layout/sobot_loading_layout_loading</item>
<item name="llErrorResId">@layout/sobot_loading_layout_error</item>
<item name="llTextColor">@color/sobot_loading_layout_text_color</item>
<item name="llTextSize">16sp</item>
<item name="llButtonTextColor">@color/sobot_loading_layout_text_color</item>
<item name="llButtonTextSize">16sp</item>
<item name="llButtonBackground">@drawable/sobot_loading_layout_button</item>
<item name="llEmptyImage">@null</item>
<item name="llEmptyText">@string/sobot_no_data_string</item>
<item name="llErrorImage">@null</item>
<item name="llErrorText">@string/sobot_no_net_string</item>
<item name="llRetryText">@string/sobot_error_click_reload_string</item>
</style>
<declare-styleable name="SobotLoadingLayout">
<!-- 空布局资源id -->
<attr name="llEmptyResId" format="reference" />
<!-- 加载中布局资源id -->
<attr name="llLoadingResId" format="reference" />
<!-- 错误布局资源id -->
<attr name="llErrorResId" format="reference" />
<!-- 空布局图片 -->
<attr name="llEmptyImage" format="reference" />
<!-- 空布局文本 -->
<attr name="llEmptyText" format="string" />
<!-- 错误布局图片 -->
<attr name="llErrorImage" format="reference" />
<!-- 错误布局文本 -->
<attr name="llErrorText" format="string" />
<!-- 错误布局重试按钮文本 -->
<attr name="llRetryText" format="string" />
<!-- 文本颜色 -->
<attr name="llTextColor" format="color" />
<!-- 文本尺寸 -->
<attr name="llTextSize" format="dimension" />
<!-- 按钮文本颜色 -->
<attr name="llButtonTextColor" format="color" />
<!-- 按钮文本尺寸 -->
<attr name="llButtonTextSize" format="dimension" />
<!-- 按钮背景 -->
<attr name="llButtonBackground" format="reference" />
</declare-styleable>
</resources>
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment