MagicaSakura 是 Android 多主题框架。
具有以下优点:
- 列表内容
- 列表内容
- 支持白天彩色主题和夜间主题。
- 切换主题不需要重建activity
- 提供TintXXX控件适配不同的主题,更方便更快捷。
- 只需写一个drawable.xml 或者 layout.xml 就能自动适配到不同主题样式。
- 兼容4.0.3以上
- 易于集成到你的app。
Github官网
首先进入Main的布局
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true">
<com.bilibili.magicasakura.widgets.TintToolbar
android:id="@+id/toolbar"
style="@style/Widget.App.Toolbar"
android:layout_width="match_parent"
android:layout_height="56dp"
android:background="@color/theme_color_primary"
app:elevation="4dp">
<TextView
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:gravity="center_vertical"
android:paddingLeft="@dimen/padding"
android:text="@string/app_name"
android:textColor="@color/white"
android:textSize="22sp" />
</com.bilibili.magicasakura.widgets.TintToolbar>
<android.support.v7.widget.RecyclerView
android:id="@+id/recycler"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="56dp" />
<!--底部进行提示-->
<include layout="@layout/fragment_layout_snack" />
</FrameLayout>
对应Main怎么进入入口
//设置title
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
getSupportActionBar().setTitle(null);
//设置中间竖直可滑动部分
RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recycler);
LinearLayoutManager layoutManager = new LinearLayoutManager(this);
layoutManager.setSmoothScrollbarEnabled(true);
//进行分割线的操作
recyclerView.addItemDecoration(new RecyclerView.ItemDecoration() {
@Override
public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
//8dp
final int padding = getResources().getDimensionPixelOffset(R.dimen.padding_half);
//返回适配器条目的位置
RecyclerView.LayoutParams layoutParams = (RecyclerView.LayoutParams) view.getLayoutParams();
final int position = layoutParams.getViewLayoutPosition();
if (position == 0) {
outRect.left = outRect.top = outRect.right = padding;
outRect.bottom = padding >> 1;
} else if (position == state.getItemCount() - 1) {
outRect.left = outRect.bottom = outRect.right = padding;
outRect.top = padding >> 1;
} else {
outRect.left = outRect.right = padding;
outRect.top = outRect.bottom = padding >> 1;
}
}
});
//设置进行水平还是垂直
recyclerView.setLayoutManager(layoutManager);
//设置适配器
Adapter adapter = new Adapter();
recyclerView.setAdapter(adapter);
//适配器添加HolderType
adapter.addViewHolderType(
ViewHolder.VIEW_HOLDER_HEADER,
ViewHolder.VIEW_HOLDER_LABEL,
ViewHolder.VIEW_HOLDER_HEADER,
ViewHolder.VIEW_HOLDER_LOGIN,
ViewHolder.VIEW_HOLDER_HEADER,
ViewHolder.VIEW_HOLDER_DOWNLOAD
);
这里明白一个知识点
- 关于
Rect outRect
这个参数
recyclerView.addItemDecoration(new RecyclerView.ItemDecoration() {
@Override
public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
}
}
在这个参数中Rect outRect这个矩形控制条目的显示
- outRect.left : 控制条目距离左边的距离
- outRect.right:条目距离右边的距离
- outRect.top : 条目距离上边的距离
- outRect.bottom : 条目距离下边的距离
- 关于padding >> 1
相当于 padding/2的值
接下来我们就看看适配器
public static class Adapter extends RecyclerView.Adapter<ViewHolder> {
List<Integer> viewHolderTypes = new ArrayList<>();//视图类型
SparseArrayCompat<Integer> titleIndexs = new SparseArrayCompat<>();//标题集合
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
return ViewHolder.create(parent, viewType);根据类型创建每一个条目
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
//将数据绑定到item视图上
if (holder instanceof ViewHolderHeader) {
((ViewHolderHeader) holder).setTitle(titleIndexs.get(position));
}
}
//条目集合数
@Override
public int getItemCount() {
return viewHolderTypes.size();
}
//根据位置得到type信息
@Override
public int getItemViewType(int position) {
return viewHolderTypes.get(position);
}
//
public void addViewHolderType(int... type) {
for (int i = 0; i < type.length; i++) {
if (type[i] == ViewHolder.VIEW_HOLDER_HEADER) {
titleIndexs.put(i, titleIndexs.size() + 1);
}
viewHolderTypes.add(type[i]);
}
notifyDataSetChanged();
}
}
对于适配器,最次也要实现以下几个方法
//onCreateViewHolder()负责为Item创建视图
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
return null;
}
//onBindViewHolder()负责将数据绑定到Item的视图上
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {}
//条目个数
@Override
public int getItemCount() {
return 0;
}
根据type创建对应的ViewHolder
public static abstract class ViewHolder extends RecyclerView.ViewHolder {
public static final int VIEW_HOLDER_HEADER = 0;
public static final int VIEW_HOLDER_LABEL = VIEW_HOLDER_HEADER + 1;
public static final int VIEW_HOLDER_LOGIN = VIEW_HOLDER_LABEL + 1;
public static final int VIEW_HOLDER_DOWNLOAD = VIEW_HOLDER_LOGIN + 1;
public ViewHolder(View itemView) {
super(itemView);
}
public static ViewHolder create(ViewGroup viewHolder, int type) {
switch (type) {
case VIEW_HOLDER_HEADER:
return ViewHolderHeader.create(viewHolder);//[1.1]
case VIEW_HOLDER_LABEL:
return ViewHolderLabel.create(viewHolder);
case VIEW_HOLDER_LOGIN:
return ViewHolderLogin.create(viewHolder);