升级CompileSdk和重构主页

计步器的编译SDK版本比较低, 今天升级了最新版本-23, 出来了很多问题, 并且都解决了, 又简单地重构了主页. 让我们来看看吧, 给想用新特性的工程做一些参考.

1. 升级CompileSdk

升级SDK之后, Apache的Http库被遗弃了, 需要使用Library重新引入.

    compileSdkVersion 23
    buildToolsVersion ‘23.0.1‘
    ...
    dependencies {
        compile ‘com.android.support:appcompat-v7:23.1.0‘
        compile ‘com.android.support:design:23.1.0‘
   }

引入

useLibrary ‘org.apache.http.legacy‘

需要同时升级gradle版本1.3.1

classpath ‘com.android.tools.build:gradle:1.3.1‘

顺便解决了Lambda表达proguard警告的问题, 参考.

以后在添加第三方库时, 一定要注意配合Proguard, 添加相应的设置.

升级以后, 项目使用ActionBar全部都无法全部显示了, 前后各有一处留白. 原因是新版本对ActionBar添加了额外属性, 控制边界, 需要设置AppBar的Styles.

    <style name="CYActionBar"
           parent="@style/Widget.AppCompat.ActionBar">
        ...
        <item name="contentInsetStart">0dp</item>
        <item name="contentInsetEnd">0dp</item>
    </style>

contentInset分别表示前后的留白, 设置0dp则可以避免.

推荐Picasso, 非常好用的下载库, 还有Git管理软件SourceTree.

2. 重构主页

主页以前写法是在ActionBar中, 添加多个按钮, 监听按钮点击, 替换Fragment.

这次使用TabLayout+ViewPager的架构, 更好地交互效果.

界面

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    android:id="@+id/pedometer_fragment_content"
    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:background="@android:color/transparent"
    android:orientation="vertical">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        android:background="@color/actionbar_background"
        android:baselineAligned="false"
        android:gravity="center"
        android:orientation="horizontal">

        <android.support.design.widget.TabLayout
            android:id="@+id/main_tl_tab_bar"
            android:layout_width="0dp"
            android:layout_height="?attr/actionBarSize"
            android:layout_weight="1"
            android:background="@android:color/transparent"
            app:tabIndicatorColor="@android:color/transparent"
            app:tabMode="scrollable"/>

        <LinearLayout
            android:layout_width="?attr/actionBarSize"
            android:layout_height="?attr/actionBarSize"
            android:gravity="center">

            <de.hdodenhof.circleimageview.CircleImageView
                android:id="@+id/main_piv_portrait"
                android:layout_width="@dimen/d28dp"
                android:layout_height="@dimen/d28dp"
                android:background="@android:color/transparent"
                android:scaleType="centerCrop"
                android:src="@drawable/tab_portrait"
                app:border_color="@color/gray"
                app:border_width="@dimen/d1dp"/>

        </LinearLayout>

    </LinearLayout>

    <View
        android:layout_width="match_parent"
        android:layout_height="@dimen/d0.5dp"
        android:background="@color/gray_line"/>

    <android.support.v4.view.ViewPager
        android:id="@+id/main_vp_container"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_behavior="@string/appbar_scrolling_view_behavior"/>

</LinearLayout>

TabLayout的tabMode="scrollable"属性, 使Tab全部靠近左侧;

tabIndicatorColor="@android:color/transparent"游标颜色透明, 即隐藏.

ViewPager的Adapter逻辑.

/**
 * 首页ViewPager的Adapter
 * <p>
 * Created by wangchenlong on 15/11/10.
 */
public class MainPageAdapter extends FragmentPagerAdapter {

    private static final int PAGE_NUM = 3;

    private PedometerFunctionFragment mFunctionFragment; // 核心功能页面
    private CompetitionFragment mCompetitionFragment; // 好友竞赛页面
    private CenterFragment mCenterFragment; // 数据中心页面

    public MainPageAdapter(FragmentManager fm) {
        super(fm);

        mFunctionFragment = new PedometerFunctionFragment();
        mCompetitionFragment = new CompetitionFragment();
        mCenterFragment = new CenterFragment();
    }

    @Override public Fragment getItem(int position) {
        switch (position) {
            case 0:
                return mFunctionFragment;
            case 1:
                return mCompetitionFragment;
            case 2:
                return mCenterFragment;
        }
        return null;
    }

    @Override public int getCount() {
        return PAGE_NUM;
    }
}

首页逻辑, 根据Tab依次添加图片.

    @DrawableRes
    private static final int TAB_IMAGES[] = {
            R.drawable.tab_counter,
            R.drawable.tab_contest,
            R.drawable.tab_center
    };
...
        MainPageAdapter adapter = new MainPageAdapter(getSupportFragmentManager());
        mVpContainer.setAdapter(adapter);
        mTlTabBar.setupWithViewPager(mVpContainer);
        for (int i = 0; i < mTlTabBar.getTabCount(); i++) {
            TabLayout.Tab tab = mTlTabBar.getTabAt(i);
            if (tab != null) {
                tab.setIcon(TAB_IMAGES[i]);
            }
        }

注意图片资源, 根据选择状态切换颜色, 红(选中)->灰(未选中).

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/tab_counter_light" android:state_selected="true"/>
    <item android:drawable="@drawable/tab_counter_gray" android:state_selected="false"/>
</selector>

效果

OK, 终于把想做的事情做了.

时间: 2024-10-25 13:46:49

升级CompileSdk和重构主页的相关文章

手动升级到 11gR2 的完整核对清单

适用于: Oracle Database - Standard Edition - 版本 9.2.0.8 到 11.2.0.4 [发行版 9.2 到 11.2]Oracle Database - Enterprise Edition - 版本 9.2.0.8 到 11.2.0.4 [发行版 9.2 到 11.2]本文档所含信息适用于所有平台 用途 本文档可用作手工将 Oracle 9iR2 (9.2), Oracle 10gR1 (10.1), Oracle 10gR2 (10.2) 或者 Or

.NET快速信息化系统开发框架 V3.2 -&gt;WinForm部分全部重构为Dev风格界面

RDIFrameowrk.NET V3.2以前的版本WinForm部分使用的界面控件是DotNetBar,界面也是非常的美女,但相比现在市面上用得非常多功能强大的Dev控件还是略显逊色,V3.2版本花了大量功夫对框架全系界面做了升级重构,全面采用Dev风格的控件.界面更加高大上好看.同时主界面支持4种风格: DevRibbon.Nav, Tree, Ribbon 1.主界面部分: 以下为V3.2版本以前的主界面风格,使用的是DotNetBar控件,3.2版本也对其进行了保留,如下为3.0版本的主

产品技术和管理

为啥纯粹为消费者传递体验的活动可以价格不菲,几为暴利?——谈客户体验作为客户价值提升之源 不论产品还是服务,如果能够为消费者传递有益的体验,其价值就可以在一般的产品服务之上得以体现:附加了体验的产品(服务)的价格可以比普通的价格高出很多倍,而纯粹为消费者传递体验的活动(如音乐会.球赛等)同样是价格不菲.那么,这一貌似暴利的赢利方式为什么会一直存在下来而没有遭到消费者的抵制呢?这一行为背后是否隐藏着一些符合市场演化规律的东西呢?本文将对这些问题进行探讨. 一.客户根据自身需求来决定价值 消费者购买

Atitit Atitit.软件兼容性原理----------API兼容 Qa7

1. 兼容性的重要性与反面教材1 2. 提升兼容性的原则2 2.1. What 与how 分离2 2.2. 老人老办法,新人新办法,只新增,少修改,莫删除3 2.3. 计划赶不上变化,永远api修改也不可能整齐划一,反而带来不兼容的风险3 3. 把握API的生命周期andAPI分级3 4. 对兼容性保持友好的api设计方法3 4.1. 细粒度的方法3 4.2. Ioc容器动态配置3 4.3. 把你的method()视为全局global的,确保每一个方法都不重名尽可能..不要幻想有模块命名空间等,

读书笔记-2015年第1本:《暗时间》

作者所说的暗时间,其实在生活中,我自己也有领悟到,领悟的时候很感慨,然而过不了几天就把这个领悟给忘得一干二净,于是又是过着重蹈覆辙的生活.现在给我的提醒就是把领悟到的东西记录下来,每天空出一些时间静下心专门来思考这些领悟到的东西.现在有幸看到自己曾经遗忘的宝贵的生活哲理,好好思考,好好领悟. 在这本书中,作者推荐了大量有价值的学习资料以及学习方法,有时间时都可以去研究学习. 我们可以看出,作者很有学问,但也可以想一下为何如此有学问?“看上去好像很高端的样子”,实际上,也就是作者曾经在一年内看过很

NHibernate应用开发

第一章:NHibernate入门       第一讲:NHibernate架构剖析       第二讲:搭建第一个NHibernate应用程序       第三讲:nhibernate.cfg.xml的配置及注意事项 第二章:NHibernate中的关系映射       第一讲:NHibernate中单向一对多映射       第二讲:NHibernate中双向一对多映射及其他       第三讲:NHibernate中原生SQL的关联查询 第三章:探索NHibernate的反转和级联及CRUD

2. Go 语言基本语法

Go语言基本语法 变量.数据类型和常量是编程中最常见,也是很好理解的概念.本章将从 Go 语言的变量开始,逐步介绍各种数据类型及常量. Go 语言在很多特性上和C语言非常相近.如果读者有C语言基础,那么本章的内容阅读起来将会非常轻松:如果读者没有C语言基础也没关系,因为本章内容非常简单易懂. Go语言变量的声明(使用var关键字) Go语言是静态类型语言,因此变量(variable)是有明确类型的,编译器也会检查变量类型的正确性.在数学概念中,变量表示没有固定值且可改变的数.但从计算机系统实现角

Spirent TestCenter Application 升级之后,索性重构了ATC的对外接口。

Spirent TestCenter Application 升级到4.24之后,原来的ROBOT ATC 跑不过了.现象是两个, 1)提示TCL 版本不兼容: 2)第2个端口上收不到包. 索性趁这个机会重构了对外接口. 1)RunSequencerDoCheckList :使用两个预定的端口,分别作为user-side/uplink-side.完成测试步骤并检查结果. ------ 单路功能性测试 2)MultiPortRunsequencercheckList:使用更多预定端口,完成测试步骤

0040 重构工程(python django升级)

在Python或Django升级后,如果软件要做相应的升级,则需要重构工程. 1 先在CMD下创建工程 2 复制一份虚拟环境目录 Django的虚拟环境,原则上一个工程一个虚拟环境,如果多个工程共享一个虚拟环境,容易报错. 3 PyCharm打开工程,配置虚拟环境 找到File/Settings/Project/Project Interpreter 点击All,查看当前所有的虚拟环境,如果要为工程增加的虚拟环境已经存在,先删除原来的虚拟环境.因为如果有多个相同的虚拟环境,再增加这个虚拟环境,容