這一週,總的來說沒有用到什麼新東西,有一些之前沒有遇到過的,這裏記錄下來,方便自己整理自己的知識體系!
- 修改自定義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);
}