习惯了用 LinearLayout、RelativeLayout 等布局,但是在某些界面的优化上这些布局很难做到。说下我项目中的实际例子:
一件商品有品名、数量、单价、金额等几条属性,要显示在一行。 注意,图中金额属性没有显示全,但这不是本文要写的内容。当文本过长显示不下,这是个历史难题。 本文要讲述的是如何利用约束布局来优化界面的显示。
看到图中,我们通长使用 LinearLayout 的 weight 属性,给每一列设置一个 weight,相信大多数人都是这么做的,就像这样:
那是一座悲欢离合聚集的楼。
习惯了用 LinearLayout、RelativeLayout 等布局,但是在某些界面的优化上这些布局很难做到。说下我项目中的实际例子:
一件商品有品名、数量、单价、金额等几条属性,要显示在一行。 注意,图中金额属性没有显示全,但这不是本文要写的内容。当文本过长显示不下,这是个历史难题。 本文要讲述的是如何利用约束布局来优化界面的显示。
看到图中,我们通长使用 LinearLayout 的 weight 属性,给每一列设置一个 weight,相信大多数人都是这么做的,就像这样:
之前的一篇文章Retrofit初识尝试用了下 Retrofit。说来惭愧,到现在才写这篇文章。由于项目中没有使用的缘故,一直停留在了解的程度。最近自己学习做了个Gank客户端,一点点学习当前主流的技术,今天研究了下 Retrofit 的源码,颇有感触,便记录下来。
关于正常的使用,参考之前的那篇文章。这里再写一下结合 RxJava 的使用。
定义接口:
1 | public interface GankService { |
初始化 Retrofit,生成代理对象:
1 | Retrofit retrofit = new Retrofit.Builder() |
调用接口:
1 | GankRequestManager.getInstance().getCategory(type, PAGE_SIZE, mPage) |
之前写过一篇Gradle多版本管理,主要是通过productFlavors
来控制产品版本。这篇文章将结合buildTypes
来说一下多版本管理。
在正常开发中,我们一般会有至少 2 个环境:Debug、Release,即测试环境和生产环境。显然这 2 个环境要用 2 套不同的数据,那么在我们的 App 里必然就需要有个地方来控制这个环境。当然,我们可以在 Debug 的时候用 Debug 环境,然后当要发版时手动改成 Release 环境,但是这很麻烦,很难排除忘记修改的情况,那么等待重新编译将是个很漫长的过程。其实Gradle可以很好的解决这个问题:利用 buildTypes 来控制编译类型。
buildTypes 默认会有 debug、release 2 个类型,当然我们还可以添加自己的。比如有个beta环境,用于外网测试。当对接一些三方平台的接口时,有的只能用外网,那么只能整一套外网的测试环境了,比如美团外卖。好,现在假设我们有 debug、beta、release 3 个 buildTypes,然后 pad、phone、custom 3个 productFlavors,接下来就是针对这些环境做配置了:
今天发现了一个在对象序列化时的错误。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36E/Parcel: Class not found when unmarshalling: com.lijia.study.InventoryDetail
java.lang.ClassNotFoundException: com.lijia.study.InventoryDetail
at java.lang.Class.classForName(Native Method)
at java.lang.Class.forName(Class.java:309)
at android.os.Parcel.readParcelableCreator(Parcel.java:2281)
at android.os.Parcel.readParcelable(Parcel.java:2245)
at android.os.Parcel.readValue(Parcel.java:2152)
at android.os.Parcel.readMapInternal(Parcel.java:2468)
at android.os.Parcel.readHashMap(Parcel.java:1678)
at android.os.Parcel.readParcelable(Parcel.java:2252)
at android.os.Parcel.readValue(Parcel.java:2152)
at android.os.Parcel.readArrayMapInternal(Parcel.java:2485)
at android.os.BaseBundle.unparcel(BaseBundle.java:221)
at android.os.Bundle.getParcelable(Bundle.java:755)
at android.content.Intent.getParcelableExtra(Intent.java:5088)
...
Caused by: java.lang.ClassNotFoundException: com.lijia.study.InventoryDetail
at java.lang.Class.classForName(Native Method)
at java.lang.BootClassLoader.findClass(ClassLoader.java:781)
at java.lang.BootClassLoader.loadClass(ClassLoader.java:841)
at java.lang.ClassLoader.loadClass(ClassLoader.java:469)
at java.lang.Class.classForName(Native Method)
at java.lang.Class.forName(Class.java:309)
at android.os.Parcel.readParcelableCreator(Parcel.java:2281)
at android.os.Parcel.readParcelable(Parcel.java:2245)
at android.os.Parcel.readValue(Parcel.java:2152)
at android.os.Parcel.readMapInternal(Parcel.java:2468)
at android.os.Parcel.readHashMap(Parcel.java:1678)
at android.os.Parcel.readParcelable(Parcel.java:2252)
at android.os.Parcel.readValue(Parcel.java:2152)
at android.os.Parcel.readArrayMapInternal(Parcel.java:2485)
at android.os.BaseBundle.unparcel(BaseBundle.java:221)
at android.os.Bundle.getParcelable(Bundle.java:755)
at android.content.Intent.getParcelableExtra(Intent.java:5088)
...
Caused by: java.lang.NoClassDefFoundError: Class not found using the boot class loader; no stack available
最近在做收银机相关的开发,涉及到双屏异显
的一些东西,之前也没有接触过,在查阅一番资料之后,把功能走通了,这里小记一下。
Presentation 是一种特殊的对话框,主要用于在另外一块屏幕上显示内容。默认为克隆模式,即副屏显示和正屏一样的内容。当需要显示不同内容时,需要自定义 Presentation,并为其指定一个 Display。这里随便定义一个 Presentation:1
2
3
4
5
6
7
8
9
10
11
12public class MyPresentation extends Presentation {
public MyPresentation(Context outerContext, Display display) {
super(outerContext, display);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.presentation_second_screen);
}
}
前段时间终于下定决心自己实践 RxJava,Retrofit 等当前十分流行的库,利用 Gank.io 的公共 API,做一个自己的 Gank 客户端。项目地址: Gank。只要有闲暇时间便会写写代码,慢慢完善。期间有一些小的知识点,但是却很实用,这里便列一下。关于 RxJava,Retrofit 目前学习还不是很深入,这里便不展开了。
现在与服务端通信通常都是Json,但是服务器返回的Json串的key是服务端自己的命名规则(可能是中文key,或者大写开头),我们直接通过Gson解析就必须一一对应,但是这样的命名在Java里很不友好。
那么就可以通过@SerializedName注解给Bean类进行“重命名”,这样在解析的时候便可以直接利用我们自己的命名规则命名变量了。
举个栗子:http://gank.io/api/day/2017/08/03
返回的数据包含Android
,福利
等不符合Java规范的key,那么就可以这样:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16public class DataResults {
@SerializedName("Android")
List<ItemData> androidList;
@SerializedName("iOS")
List<ItemData> iOSList;
@SerializedName("休息视频")
List<ItemData> restList;
@SerializedName("前端")
List<ItemData> jsList;
@SerializedName("福利")
List<ItemData> welfareList;
}
如此便可以直接通过Gson解析,并且变量名是以我们自己的命名规则进行命令的了。
more >>Github 逛久了,相信大家都会有很多star
,虽然很多star
后面再也不会看的。但是只要有那么一丁点的可能回头看,我们还是需要将自己的star
整理一下,不然感觉都是无从下手。那么问题便来了:如何管理 Github 上的 star ?
答案便是 Astral。这是我偶然发现的一个网站,它可以用来给 Github 上的 star 分类。
具体界面是这样子的:
界面很简单,打开就能直接上手用,整理了一个下午,终于将自己的 200 多个 star 全部清理个便,分了几个 TAG,后面再回顾的时候便会方便多了。
普遍的 Android 开发可以理解为移动端界面开发,那么界面自然是重中之重。当设计师给到你设计稿时,你便需要将设计稿中的东西用代码做出来。
项目开发中便遇到了这样一个设计稿:
这算是一个很基本的对话框了,没什么难度。写这篇文章主要是为了记一下图中关闭按钮
的实现。
这个关闭按钮
算是再简单不过的一个图标了,那么要如何实现呢?当然可以找到设计师要切图。但是这里我想尝试一下 Android 中的 SVG,顺便也是减轻设计师的工作量,经常劳烦别人也不是什么好事。
tag:
缺失模块。
1、在博客根目录(注意不是yilia根目录)执行以下命令:
npm i hexo-generator-json-content --save
2、在根目录_config.yml里添加配置:
jsonContent: meta: false pages: false posts: title: true date: true path: true text: true raw: false content: false slug: false updated: false comments: false link: false permalink: false excerpt: false categories: false tags: true