QMUIEmptyView
@Widget(widgetClass = QMUIEmptyView.class, iconRes = R.mipmap.icon_grid_empty_view)
public class QDEmptyViewFragment extends BaseFragment {
@BindView(R.id.topbar)
QMUITopBarLayout mTopBar;
@BindView(R.id.emptyView)
QMUIEmptyView mEmptyView;
private QDItemDescription mQDItemDescription;
@Override
protected View onCreateView() {
View root = LayoutInflater.from(getActivity()).inflate(R.layout.fragment_emptyview, null);
ButterKnife.bind(this, root);
mQDItemDescription = QDDataManager.getInstance().getDescription(this.getClass());
initTopBar();
return root;
}
private void initTopBar() {
mTopBar.addLeftBackImageButton().setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
popBackStack();
}
});
// 切换其他情况的按钮
mTopBar.addRightImageButton(R.mipmap.icon_topbar_overflow, R.id.topbar_right_change_button).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
showBottomSheetList();
}
});
mTopBar.setTitle(mQDItemDescription.getName());
}
private void showBottomSheetList() {
new QMUIBottomSheet.BottomListSheetBuilder(getActivity())
.addItem(getResources().getString(R.string.emptyView_mode_title_double_text))
.addItem(getResources().getString(R.string.emptyView_mode_title_single_text))
.addItem(getResources().getString(R.string.emptyView_mode_title_loading))
.addItem(getResources().getString(R.string.emptyView_mode_title_single_text_and_button))
.addItem(getResources().getString(R.string.emptyView_mode_title_double_text_and_button))
.setOnSheetItemClickListener(new QMUIBottomSheet.BottomListSheetBuilder.OnSheetItemClickListener() {
@Override
public void onClick(QMUIBottomSheet dialog, View itemView, int position, String tag) {
dialog.dismiss();
switch (position) {
case 0:
mEmptyView.show(getResources().getString(R.string.emptyView_mode_desc_double), getResources().getString(R.string.emptyView_mode_desc_detail_double));
break;
case 1:
mEmptyView.show(getResources().getString(R.string.emptyView_mode_desc_single), null);
break;
case 2:
mEmptyView.show(true);
break;
case 3:
mEmptyView.show(false, getResources().getString(R.string.emptyView_mode_desc_fail_title), null, getResources().getString(R.string.emptyView_mode_desc_retry), null);
break;
case 4:
mEmptyView.show(false, getResources().getString(R.string.emptyView_mode_desc_fail_title), getResources().getString(R.string.emptyView_mode_desc_fail_desc), getResources().getString(R.string.emptyView_mode_desc_retry), null);
break;
default:
break;
}
}
})
.build()
布局文件定义了两个:
<com.qmuiteam.qmui.widget.QMUIEmptyView
android:id="@+id/emptyView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginTop="?attr/qmui_topbar_height"
android:background="@color/qmui_config_color_white"
app:qmui_title_text="@string/emptyView_mode_desc_double"
app:qmui_detail_text="@string/emptyView_mode_desc_detail_double"
android:fitsSystemWindows="true"/>
<com.qmuiteam.qmui.widget.QMUITopBarLayout
android:id="@+id/topbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:fitsSystemWindows="true"/>
在TopBar中有切换其他情况的按钮,设置点击事件,调用showBottomSheetList() 方法,在底部出现一个SheetList。增加Item,并且添加点击事件。
QMUIEmptyView.java
- 用于显示界面的 loading、错误信息提示等状态。
- 提供了一个 LoadingView、一行标题、一行说明文字、一个按钮, 可以使用 {@link #show(boolean, String, String, String, OnClickListener)} 系列方法控制这些控件的显示内容
调用方法如下:
public class QMUIEmptyView extends FrameLayout {
private QMUILoadingView mLoadingView;
private TextView mTitleTextView;
private TextView mDetailTextView;
protected Button mButton;
public QMUIEmptyView(Context context) {
this(context,null);
}
public QMUIEmptyView(Context context, AttributeSet attrs) {
this(context,attrs,0);
}
public QMUIEmptyView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init();
TypedArray arr = context.obtainStyledAttributes(attrs, R.styleable.QMUIEmptyView);
Boolean attrShowLoading = arr.getBoolean(R.styleable.QMUIEmptyView_qmui_show_loading, false);
String attrTitleText = arr.getString(R.styleable.QMUIEmptyView_qmui_title_text);
String attrDetailText = arr.getString(R.styleable.QMUIEmptyView_qmui_detail_text);
String attrBtnText = arr.getString(R.styleable.QMUIEmptyView_qmui_btn_text);
arr.recycle();
show(attrShowLoading,attrTitleText,attrDetailText,attrBtnText,null);
}
private void init() {
LayoutInflater.from(getContext()).inflate(R.layout.qmui_empty_view, this, true);
mLoadingView = (QMUILoadingView)findViewById(R.id.empty_view_loading);
mTitleTextView = (TextView)findViewById(R.id.empty_view_title);
mDetailTextView = (TextView)findViewById(R.id.empty_view_detail);
mButton = (Button)findViewById(R.id.empty_view_button);
}
/**
* 显示emptyView
* @param loading 是否要显示loading
* @param titleText 标题的文字,不需要则传null
* @param detailText 详情文字,不需要则传null
* @param buttonText 按钮的文字,不需要按钮则传null
* @param onButtonClickListener 按钮的onClick监听,不需要则传null
*/
public void show(boolean loading, String titleText, String detailText, String buttonText, OnClickListener onButtonClickListener) {
setLoadingShowing(loading);
setTitleText(titleText);
setDetailText(detailText);
setButton(buttonText, onButtonClickListener);
show();
}
/**
* 用于显示emptyView并且只显示loading的情况,此时title、detail、button都被隐藏
* @param loading 是否显示loading
*/
public void show(boolean loading) {
setLoadingShowing(loading);
setTitleText(null);
setDetailText(null);
setButton(null, null);
show();
}
/**
* 用于显示纯文本的简单调用方法,此时loading、button均被隐藏
* @param titleText 标题的文字,不需要则传null
* @param detailText 详情文字,不需要则传null
*/
public void show(String titleText, String detailText) {
setLoadingShowing(false);
setTitleText(titleText);
setDetailText(detailText);
setButton(null, null);
show();
}
/**
* 显示emptyView,不建议直接使用,建议调用带参数的show()方法,方便控制所有子View的显示/隐藏
*/
public void show() {
setVisibility(VISIBLE);
}
/**
* 隐藏emptyView
*/
public void hide() {
setVisibility(GONE);
setLoadingShowing(false);
setTitleText(null);
setDetailText(null);
setButton(null, null);
}
public boolean isShowing() {
return getVisibility() == VISIBLE;
}
public boolean isLoading() {
return mLoadingView.getVisibility() == VISIBLE;
}
public void setLoadingShowing(boolean show) {
mLoadingView.setVisibility(show ? VISIBLE : GONE);
}
public void setTitleText(String text) {
mTitleTextView.setText(text);
mTitleTextView.setVisibility(text != null ? VISIBLE : GONE);
}
public void setDetailText(String text) {
mDetailTextView.setText(text);
mDetailTextView.setVisibility(text != null ? VISIBLE : GONE);
}
public void setTitleColor(int color) {
mTitleTextView.setTextColor(color);
}
public void setDetailColor(int color) {
mDetailTextView.setTextColor(color);
}
public void setButton(String text, OnClickListener onClickListener) {
mButton.setText(text);
mButton.setVisibility(text != null ? VISIBLE : GONE);
mButton.setOnClickListener(onClickListener);
}
}
显示emptyView
* @param loading 是否要显示loading
* @param titleText 标题的文字,不需要则传null
* @param detailText 详情文字,不需要则传null
* @param buttonText 按钮的文字,不需要按钮则传null
* @param onButtonClickListener 按钮的onClick监听,不需要则传null
QMUITabSegment
@Widget(group = Group.Other, name = "固定宽度,内容均分")
public class QDTabSegmentFixModeFragment extends BaseFragment {
@BindView(R.id.topbar)
QMUITopBarLayout mTopBar;
@BindView(R.id.tabSegment)
QMUITabSegment mTabSegment;
@BindView(R.id.contentViewPager)
ViewPager mContentViewPager;
private Map<ContentPage, View> mPageMap = new HashMap<>();
private ContentPage mDestPage = ContentPage.Item1;
private QDItemDescription mQDItemDescription;
private PagerAdapter mPagerAdapter = new PagerAdapter() {
@Override
public boolean isViewFromObject(View view, Object object) {
return view == object;
}
@Override
public int getCount() {
return ContentPage.SIZE;
}
@Override
public Object instantiateItem(final ViewGroup container, int position) {
ContentPage page = ContentPage.getPage(position);
View view = getPageView(page);
ViewGroup.LayoutParams params = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
container.addView(view, params);
return view;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
container.removeView((View) object);
}
};
@Override
protected View onCreateView() {
View rootView = LayoutInflater.from(getActivity()).inflate(R.layout.fragment_tab_viewpager_layout, null);
ButterKnife.bind(this, rootView);
mQDItemDescription = QDDataManager.getInstance().getDescription(this.getClass());
initTopBar();
initTabAndPager();
return rootView;
}
private void initTopBar() {
mTopBar.addLeftBackImageButton().setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
popBackStack();
}
});
mTopBar.setTitle(mQDItemDescription.getName());
mTopBar.addRightImageButton(R.mipmap.icon_topbar_overflow, R.id.topbar_right_change_button)
.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
showBottomSheetList();
}
});
}
private void showBottomSheetList() {
new QMUIBottomSheet.BottomListSheetBuilder(getActivity())
.addItem(getResources().getString(R.string.tabSegment_mode_general))
.addItem(getResources().getString(R.string.tabSegment_mode_bottom_indicator))
.addItem(getResources().getString(R.string.tabSegment_mode_top_indicator))
.addItem(getResources().getString(R.string.tabSegment_mode_indicator_with_content))
.addItem(getResources().getString(R.string.tabSegment_mode_left_icon_and_auto_tint))
.addItem(getResources().getString(R.string.tabSegment_mode_sign_count))
.addItem(getResources().getString(R.string.tabSegment_mode_icon_change))
.addItem(getResources().getString(R.string.tabSegment_mode_muti_color))
.addItem(getResources().getString(R.string.tabSegment_mode_change_content_by_index))
.addItem(getResources().getString(R.string.tabSegment_mode_replace_tab_by_index))
.setOnSheetItemClickListener(new QMUIBottomSheet.BottomListSheetBuilder.OnSheetItemClickListener() {
@Override
public void onClick(QMUIBottomSheet dialog, View itemView, int position, String tag) {
dialog.dismiss();
switch (position) {
case 0:
mTabSegment.reset();
mTabSegment.setHasIndicator(false);
mTabSegment.addTab(new QMUITabSegment.Tab(getString(R.string.tabSegment_item_1_title)));
mTabSegment.addTab(new QMUITabSegment.Tab(getString(R.string.tabSegment_item_2_title)));
break;
case 1:
mTabSegment.reset();
mTabSegment.setHasIndicator(true);
mTabSegment.setIndicatorPosition(false);
mTabSegment.setIndicatorWidthAdjustContent(true);
mTabSegment.addTab(new QMUITabSegment.Tab(getString(R.string.tabSegment_item_1_title)));
mTabSegment.addTab(new QMUITabSegment.Tab(getString(R.string.tabSegment_item_2_title)));
break;
case 2:
mTabSegment.reset();
mTabSegment.setHasIndicator(true);
mTabSegment.setIndicatorPosition(true);
mTabSegment.setIndicatorWidthAdjustContent(true);
mTabSegment.addTab(new QMUITabSegment.Tab(getString(R.string.tabSegment_item_1_title)));
mTabSegment.addTab(new QMUITabSegment.Tab(getString(R.string.tabSegment_item_2_title)));
break;
case 3:
mTabSegment.reset();
mTabSegment.setHasIndicator(true);
mTabSegment.setIndicatorPosition(false);
mTabSegment.setIndicatorWidthAdjustContent(false);
mTabSegment.addTab(new QMUITabSegment.Tab(getString(R.string.tabSegment_item_1_title)));
mTabSegment.addTab(new QMUITabSegment.Tab(getString(R.string.tabSegment_item_2_title)));
break;
case 4:
mTabSegment.reset();
mTabSegment.setHasIndicator(false);
QMUITabSegment.Tab component = new QMUITabSegment.Tab(
ContextCompat.getDrawable(getContext(), R.mipmap.icon_tabbar_component),
null,
"Components", true
);
QMUITabSegment.Tab util = new QMUITabSegment.Tab(
ContextCompat.getDrawable(getContext(), R.mipmap.icon_tabbar_util),
null,
"Helper", true
);
mTabSegment.addTab(component);
mTabSegment.addTab(util);
break;
case 5:
QMUITabSegment.Tab tab = mTabSegment.getTab(0);
tab.setSignCountMargin(0, -QMUIDisplayHelper.dp2px(getContext(), 4));
tab.showSignCountView(getContext(), 1);
break;
case 6:
mTabSegment.reset();
mTabSegment.setHasIndicator(false);
QMUITabSegment.Tab component2 = new QMUITabSegment.Tab(
ContextCompat.getDrawable(getContext(), R.mipmap.icon_tabbar_component),
ContextCompat.getDrawable(getContext(), R.mipmap.icon_tabbar_component_selected),
"Components", false
);
QMUITabSegment.Tab util2 = new QMUITabSegment.Tab(
ContextCompat.getDrawable(getContext(), R.mipmap.icon_tabbar_util),
ContextCompat.getDrawable(getContext(), R.mipmap.icon_tabbar_util_selected),
"Helper", false
);
mTabSegment.addTab(component2);
mTabSegment.addTab(util2);
break;
case 7:
mTabSegment.reset();
mTabSegment.setHasIndicator(true);
mTabSegment.setIndicatorWidthAdjustContent(true);
mTabSegment.setIndicatorPosition(false);
QMUITabSegment.Tab component3 = new QMUITabSegment.Tab(
ContextCompat.getDrawable(getContext(), R.mipmap.icon_tabbar_component),
null,
"Components", true
);
component3.setTextColor(QMUIResHelper.getAttrColor(getContext(), R.attr.qmui_config_color_blue),
QMUIResHelper.getAttrColor(getContext(), R.attr.qmui_config_color_red));
QMUITabSegment.Tab util3 = new QMUITabSegment.Tab(
ContextCompat.getDrawable(getContext(), R.mipmap.icon_tabbar_util),
null,
"Helper", true
);
util3.setTextColor(QMUIResHelper.getAttrColor(getContext(), R.attr.qmui_config_color_gray_1),
QMUIResHelper.getAttrColor(getContext(), R.attr.qmui_config_color_red));
mTabSegment.addTab(component3);
mTabSegment.addTab(util3);
break;
case 8:
mTabSegment.updateTabText(0, "动态更新文案");
break;
case 9:
QMUITabSegment.Tab component4 = new QMUITabSegment.Tab(
ContextCompat.getDrawable(getContext(), R.mipmap.icon_tabbar_component),
null,
"动态更新", true
);
mTabSegment.replaceTab(0, component4);
break;
default:
break;
}
mTabSegment.notifyDataChanged();
}
})
.build()
.show();
}
private void initTabAndPager() {
mContentViewPager.setAdapter(