这一周,总的来说没有用到什么新东西,有一些之前没有遇到过的,这里记录下来,方便自己整理自己的知识体系!
- 修改自定义ActionSheetDialog
- 设置自定义Actionbar
- 自定义字体大小颜色
Java文件配置Properties的用法
这里,关于自定义ActionSheetDialog只是最近有项目用到,于是自己做了一些扩展。在扩展的过程中,走的弯路是因为之前给每一个选项的背景增加了selected背景的设置,而在扩展的过程中需要对整个背景设置为统一的黑色,因为selected的背景色是子View,而我对Dialog的整个ViewGroup的主题、背景都设置了却依然不管用。后来才一步一步检查才发现原来这里有个背景色。如果今后有用不到的项目,可以在这个基础上回复为动态修改背景色。
最后实现的效果如图:
代码: http://blog.csdn.net/vicent_9920/article/details/53379545
图片:自己找第二点,关于ActionBar的设置。目前就算toolBar也是支持ActionBar的用法的。我这里只是将ActionBar的标题隐藏,然后修改了右上角的图片,没有什么技术含量,但是自己之前没有用过,所以自己做个笔记:
//获取ActionBar
ActionBar actionBar = getSupportActionBar();
//左上角图标显示
actionBar.setDisplayHomeAsUpEnabled(true);
//ActionBar标题隐藏
actionBar.setDisplayShowTitleEnabled(false);
//设置左上角图标
actionBar.setHomeAsUpIndicator(R.drawable.show_image_close);
同样需要菜单监听事件:
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if(item.getItemId()==android.R.id.home){
this.finish();
}
return super.onOptionsItemSelected(item);
}
效果跟上图几乎一致:
第三点,需要讲的就是上图中的页码效果。代码比较简单,这里直接上代码:
vpImageBrowser.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageSelected(int arg0) {
//当前的页码
int index = arg0 % size;
//文本
SpannableStringBuilder ssb = new SpannableStringBuilder();
ssb.append((index + 1) +" /" + size);
//需要修改的终点
int end = (index+1<10) ? 1:2;
//需要修改的起点
int start = (end==1)?0:1;
//修改后的颜色
ColorStateList colorStateList = ColorStateList.valueOf(getResources().getColor(R.color.white));
//可设置文本颜色,大小,样式和字体以匹配TextAppearance资源的样式。
TextAppearanceSpan tas = new TextAppearanceSpan("default", android.graphics.Typeface.NORMAL, sp2px(36), colorStateList, null );
//为文本设置样式
ssb.setSpan(tas,start,end, Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
//设置文本
tvImageIndex.setText(ssb);
}
public int sp2px(float spValue) {
final float fontScale = getResources().getDisplayMetrics().scaledDensity;
return (int) (spValue * fontScale + 0.5f);
}
});
具体的更酷炫效果可以见这里!
最后一点,关于Properties也是我第一次遇到,然后觉得这个比较专业,于是就记下来,今后说不定什么时候用得上!
首先,Properties这个类主要用于读取Java的配置文件,各种语言都有自己所支持的配置文件,配置文件中很多变量是经常改变的,这样做也是为了方便用户,让用户能够脱离程序本身去修改相关的变量设置。像Python支持的配置文件是.ini文件,同样,它也有自己读取配置文件的类ConfigParse,方便程序员或用户通过该类的方法来修改.ini配置文件。在Java中,其配置文件常为.properties文件,格式为文本文件,文件的内容的格式是“键=值”的格式,文本注释信息可以用”#”来注释。
先来看看我项目中asets文件夹下的configuration.properties
#WebType AnHui 0 SiChuan 1
#http://sc.301**.org/pc/WebService/
#http://192.1**.1**.111:114/
WebService=http://sc.****0.org/pc/WebService/
DebugService=http://sc.3****.org/pc/WebService/
UpDateApk=http://sc.****0.org/pc/SurveyWeb/AppFile/update.json
WebType=1
比较简单的是当我们打开Apk的时候需要检查apk是否为最新版本,于是获取版本号,然后通过UpDateApk对应的路径去获取最新的版本号以及描述信息、apk下载路径等等。我们看看访问这个路径能拿到什么信息?
{
"version":201607290,
"url":"http://***.30120.org/pc/SurveyWeb/AppFile/PuCha2.0.apk",
"features":["更新优化"]
}
上面的内容有版本号、apk下载路径、更新的理由。当我们对比APK版本号以后,然后决定是否要更新。
获取版本号代码:
private int getVersionCode(Context context) {
int versionCode = 0;
try {
versionCode = context.getPackageManager().getPackageInfo(
mPackageName, 0).versionCode;
} catch (NameNotFoundException e) {
e.printStackTrace();
}
return versionCode;
}
获取配置信息中apk的路径:
public static String get(String key, Context pContext) {
Properties p = new Properties();
try {
InputStream in = pContext.getResources().getAssets()
.open("configuration.properties");
p.load(in);
} catch (IOException e) {
e.printStackTrace();
}
return p.getProperty(key);
}
//调用该方法:
URLUtility.get("UpDateApk", this)
对比版本号,根据描述更新原因,引导客户升级
/**
* 检查是否需要升级
* @param updateDescribeFileUrl APK信息路径
* @param downLoadPath 更新APK的下载路径
*/
public void checkUpdate(String updateDescribeFileUrl, String downLoadPath) {
mDownLoadPath = downLoadPath;
HttpUtil.connServerForResult(updateDescribeFileUrl,
new DownloadMemaryClient() {
@Override
public void onFinish() {
JSONObject j;
try {
String json = new String(super.mOutputStream
.toByteArray());
j = new JSONObject(json);
//获取现在的版本号
int versionCode = getVersionCode(mContext);
//最新的APK版本号
int vn = j.getInt("version");
if (vn > versionCode) {
String apkUrl = j.getString("url");
JSONArray ja = j.getJSONArray("features");
String[] features = null;
if (ja != null && ja.length() > 0) {
features = new String[ja.length()];
for (int i = 0; i < ja.length(); ++i)
features[i] = ja.getString(i);
}
//提示更新原因,引导客户选择更新
showNoticeDialog(apkUrl, features);
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
super.onException(e.getMessage());
}
}
});
}
安装APK方法:
/**
* 安装apk
* @param mSavePath APK文件下载路径
* @param fileName APK文件名称
*/
private void installApk(String mSavePath, String fileName) {
File apkfile = new File(mSavePath, fileName);
if (!apkfile.exists()) {
return;
}
Intent i = new Intent(Intent.ACTION_VIEW);
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
i.setDataAndType(Uri.parse("file://" + apkfile.toString()),
"application/vnd.android.package-archive");
mContext.startActivity(i);
}