使用【RapidLibs】快速创建一个稀土掘金 App(一)

1,052 阅读2分钟
转载地址:www.jianshu.com/p/f75deb929…

github地址:RapidLibs_XiTu

一、开篇

使用【RapidLibs】快速创建一个类似稀土掘金App首页,RapidLibs将大部分通用逻辑封装,集成常用三方库,简化开发流程,现在该库虽然功能还比较少,但是对于一些比较常规的App还是可以节省很多时间的。

二、实现效果
掘金官方 模仿效果

稀土原版.jpg


xitu.gif

三、主要功能点
  1. 主页MainAcitivity布局
  2. 沉浸式状态栏
  3. Fragment中使用RecyclerView加载,显示加载动画
  4. Tab滑动切换
  5. 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。