實作一個需求很容易,難的是代碼的架構,我們應該讓它後期的維護變得簡單
titlebar
base初始化
private void initBar(TitleBar titleBar) {
StatusBarManager.translucentStatusBar(this, titleBar);
// set the default click listener
titleBar.setLeftClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
onBackPressed();
}
});
titleBar.setLeftImageResource(R.drawable.img_black_back);
titleBar.setTitleColor(Color.WHITE);
//預設給一個白色的背景
titleBar.setBackgroundColor(Color.WHITE);
titleBar.setSubTitleColor(Color.WHITE);
titleBar.setDividerColor(Color.GRAY);
titleBar.setActionTextColor(Color.WHITE);
titleBar.setDividerHeight(0);
}
沉浸式
- 支援版本碎片化
- dark模式和fragment之前的dark模式切換,這是自動的(在父類排程)
- MIUI FLYME等深度定制系統,版本查詢和定制話代碼需要到官網查詢
dark模式自動切換的原理
- 取色器bitmap-palette
- pix像素點色值
- 複寫titlebar#setbackground()
loadingHelper
https://www.jianshu.com/p/6a55a888fe58Activity/Fragment中使用
private void updateCityInfo(Cities.City city) {
mCity = city;
getTitleBar().setLeftText(city.name);
//發起網絡加載中
getLoadingHelper().showLoadingView();
ViewModelProviders.of(this).get(HomeModuleViewModule.class)
.loadHomeModule();
}
getLoadingHelper().addRetryListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//網絡錯誤添加action
getLoadingHelper().showLoadingView();
ViewModelProviders.of(HomeTabFragment.this).get(HomeModuleViewModule.class).loadHomeModule();
}
});
ViewModelProviders.of(this).get(HomeModuleViewModule.class).getHomeModule()
.observe(this, new Observer<HomeModule>() {
@Override
public void onChanged(@Nullable HomeModule homeModule) {
if (homeModule == null) {
//網絡回調後錯誤
getLoadingHelper().showNetworkError();
} else {
//網絡回調後成功
getLoadingHelper().showContentView();
updateHomeViews(layout_ll_content, homeModule);
if (PUSH_TYPE_REPORT_FROM_HOME) {
PUSH_TYPE_REPORT_FROM_HOME = false;
CreditServiceHelper
.doHomeNextJumpFor(getActivity(), mHeaderView);
}
}
}
});
ViewModel和View-Layout應用
https://www.jianshu.com/p/9dda86b99bcfViewModelProviders.of(this).get(CreditCardViewModel.class).getLiveData()
.observe(this, new Observer<CreditlistV102>() {
@Override
public void onChanged(@Nullable CreditlistV102 creditlistV102) {
if (creditlistV102 != null) {
getLoadingHelper().showContentView();
buildViews(creditlistV102);
} else {
getLoadingHelper().showNetworkError();
}
}
});
ViewModelProviders.of(this).get(CreditCardViewModel.class).load();
getLoadingHelper().showLoadingView();
public void buildViews(CreditlistV102 creditlistV102) {
buildBanksView(creditlistV102.bankList);
buildMidTitleView(creditlistV102.cardTitle);
buildViewPagers(creditlistV102.tag_list);
}
private void buildBanksView(List<CreditlistV102.BankListBean> bankList) {
llHeader.addView(new GridHeadView(getContext(), bankList));
}
//分割的view
@BindLayout(R.layout.credit_card_headerview)
static class GridHeadView extends BaseItemViewWithBean<List<CreditlistV102.BankListBean>> {
@BindView(R.id.grid_view)
NoScrollGridView gridView;
@BindView(R.id.icon_bank_bottom)
View iconBankBottom;
@BindView(R.id.ll_spilt)
LinearLayout llSpilt;
boolean mIsExpend;
public GridHeadView(Context context, List<CreditlistV102.BankListBean> data) {
super(context, data);
}
@Override
protected void onViewCreated(View view, final List<CreditlistV102.BankListBean> bean) {
final GridHeadAdapter adapter = new GridHeadAdapter(getContext());
gridView.setAdapter(adapter);
}
}
//adapter
static class GridHeadAdapter extends BaseListAdapter<CreditlistV102.BankListBean> {
public GridHeadAdapter(Context context) {
super(context);
}
@Override
protected void onBindViewHolder(List<Class<? extends BaseViewHolder<CreditlistV102.BankListBean>>>
viewHolderList) {
viewHolderList.add(ViewHolder.class);
}
//ViewHolder
@BindLayout(R.layout.viewholder_card_view_header_banks)
static class ViewHolder extends BaseViewHolder<CreditlistV102.BankListBean> {
@BindView(R.id.img_top)
ImageView imgTop;
@BindView(R.id.tv_name)
TextView tvName;
@Override
protected void bindView(final CreditlistV102.BankListBean bean, int position, final Context context) {
ImageLoader.host(context).load(bean.image, imgTop);
tvName.setText(bean.name);
imgTop.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
CreditBankDetailActivity.invoke(context, bean.id);
}
});
}
}
}
private void buildViewPagers(List<String> cardList) {
viewPager.setAdapter(new CreditCardViewPagerAdapter(getChildFragmentManager(), cardList));
viewPager.setOffscreenPageLimit(cardList.size() - 1);
tabLayout.setupWithViewPager(viewPager);
UIUtil.reflex(tabLayout, 20);
}
RxBus
tag
tags
Model
等可以自定義多個緯度
Action 事件源tag
public interface RxBusAction {
String MAIN_HOME_REFRESH = "main_home_refresh";
String ON_APP_LOGOUT = "on_app_logout";
String ON_APP_LOGIN = "on_app_login";
String ON_CITY_CHANGED = "on_city_changed";
}
消息體
public class RxBusMsg<T> implements Serializable {
public String tag;
public T value;
/**
* @param value 當value為空時必須傳入泛型的類型
*/
public RxBusMsg(@NonNull T value) {
this.value = value;
}
public RxBusMsg<String> obtainMsg(String msg) {
return new RxBusMsg<>(msg);
}
}
響應體注解
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Subscribe {
Tag[] tags() default {};
String tag() default "";
EventThread thread() default EventThread.MAIN_THREAD;
}
https://www.jianshu.com/p/18e420291d4e 網絡庫
public interface ApiBus {
/**
* 首頁
*
* @return
*/
@Url(BASIC_URL + "index/indexv100")
Single<HomeModule> loadHome();
/**
* App啟動接口
*
* @param newUserOpen
*
* @return
*/
@Url(BASIC_URL + "config/StartV100")
Single<String> appStart(@Field("new_user_open") String newUserOpen);
/**
* 請求同步資料
*
* @return
*/
@Security(PRIVATE_CRYPT)
@Url(BASIC_URL + "account/SyncV100")
Single<SyncData> LOGIN_SYNC();
}
獲得rx被觀察者的對象
JtRetrofit.create(ApiBus.class).loadHome();
見VM模式