转载地址:www.jianshu.com/p/f75deb929…
github地址:RapidLibs_XiTu
一、开篇
使用【RapidLibs】快速创建一个类似稀土掘金App首页,RapidLibs将大部分通用逻辑封装,集成常用三方库,简化开发流程,现在该库虽然功能还比较少,但是对于一些比较常规的App还是可以节省很多时间的。
二、实现效果
掘金官方 | 模仿效果 |
---|---|
稀土原版.jpg |
xitu.gif |
三、主要功能点
- 主页MainAcitivity布局
- 沉浸式状态栏
- Fragment中使用RecyclerView加载,显示加载动画
- Tab滑动切换
- Tab右侧的点击展开更多
四、代码实现
1) 添加依赖
按照下面代码修改你的对应文件,版本没关系
1.1) Project的 build.gradle
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.1.3'
classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
}
}
allprojects {
repositories {
jcenter()
maven { url "https://jitpack.io" }
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
1.2) Module:app的build.gradle
apply plugin: 'com.android.application'
apply plugin: 'com.neenbedankt.android-apt'//注意
android {...}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:24.1.1'
compile 'com.github.MarnonDev:RapidLibs:v1.0.2'
//注意这里一定要记得添加apt插件,否则没有办法绑定视图,这是8.0版本以后的新规则
apt 'com.jakewharton:butterknife-compiler:8.0.1'
}
2) 编写代码
看下项目大致结构,和两个主要的类(MainActivity,HomeFragment)
2.1)首先是MainActivity:直接继承库中RapidMainActivity,然后实现抽象方法即可,不需要创建布局,但是需要在清单中注册
public class MainActivity extends RapidMainActivity {
private ArrayList mFragments = new ArrayList<>();
@Override
protected int getStatusBarColor() {
return Color.parseColor("#0172E3");
}
@Override
protected void initData() {
}
@Override
public String[] getTabNameArray() {
return null;
}
@NonNull
@Override
public int[] getTabUnselectedIcon() {
return new int[]{R.drawable.tab_home_normal, R.drawable.tab_explore_normal,
R.drawable.tab_notifications_normal, R.drawable.tab_profile_normal};
}
@NonNull
@Override
public int[] getTabSelectedIcon() {
return new int[]{R.drawable.tab_home, R.drawable.tab_explore,
R.drawable.tab_notifications, R.drawable.tab_profile};
}
@NonNull
@Override
public ArrayList initFragments() {
mFragments.add(HomeFragment.newIns());
mFragments.add(ExploreFragment.newIns());
mFragments.add(NotificationFragment.newIns());
mFragments.add(ProfileFragment.newIns());
return mFragments;
}
@Override
public void setTab() {
mTabLayout.setBackgroundColor(Color.WHITE);
mTabLayout.setIconWidth(34);
mTabLayout.setIconHeight(34);
}
}
2.2)其次是HomeFragment:
布局:这里注意一下,就是大家看到有 @dimen/dp48 这样的尺寸,这是在【RapidLibs】中封装起来的常用尺寸表,包括sp也是一样,节省时间。
public class HomeFragment extends MBasicFragment {
SlidingTabLayout mTabLayout;
ViewPager mViewPager;
//
private ArrayList mTabEntities = new ArrayList<>();
private ArrayList mFragments = new ArrayList<>();
//
private String[] titles = {"首页", "Android", "前端", "IOS", "工具资源", "后端", "设计"};
//
public static HomeFragment newIns() {
HomeFragment fragment = new HomeFragment();
return fragment;
}
//
@Override
protected int getLayout() {
return R.layout.fragment_home;
}
public String[] getTabNameArray() {
return titles;
}
@Override
protected void initView(View view, Bundle bundle) {
//
mTabLayout = (SlidingTabLayout) view.findViewById(R.id.tablayout);
mViewPager = (ViewPager) view.findViewById(R.id.pager_homeFragment);
//
String[] tabNameArray = getTabNameArray();
final List fragments = initFragments();
for (int i = 0, size = fragments.size(); i < size; i++) {
String title = tabNameArray == null ? "" : tabNameArray[i];
mTabEntities.add(new TabEntity(title, 0, 0));
}
//
mViewPager.setAdapter(new FragmentStatePagerAdapter2(getChildFragmentManager()) {
@Override
public int getCount() {
return fragments.size();
}
@Override
public Fragment getItem(int position) {
return fragments.get(position);
}
});
mTabLayout.setViewPager(mViewPager, getTabNameArray());
mViewPager.setCurrentItem(0);
}
//
public ArrayList initFragments() {
mFragments.add(ContentFragment.newIns(titles[0]));
mFragments.add(ContentFragment.newIns(titles[1]));
mFragments.add(ContentFragment.newIns(titles[2]));
mFragments.add(ContentFragment.newIns(titles[3]));
mFragments.add(ContentFragment.newIns(titles[4]));
mFragments.add(ContentFragment.newIns(titles[5]));
mFragments.add(ContentFragment.newIns(titles[6]));
return mFragments;
}
@Override
protected void initData() {
}
}
五、最后附上
github地址:RapidLibs_XiTu
当然在某些细节上没有去处理。代码只贴出来部分,还有更多的代码我会更新到github上。当然这只是这个系列的一部分,后续我还会使用RapidLibs实现一些其他功能,或者一些其他App。