編輯:關於Android編程
《Android基於IIS的APK下載(一)自定義更新控件》中實現了更新控件的自定義,那麼我們要如何引用這些控件並呈現到UI中呢?
首先,我們來定義一下主界面,代碼如下。
activity_main.xml
注:
1、界面分成兩部分,第一部分是獲取更新列表的按鈕,第二部分是呈現更新列表。這兩部分我們用LinearLayout垂直布局來實現。
2、在呈現更新列表的部分,我們使用ListView,然後代碼中灌入數據。灌入數據,我們使用Adapter的形式來實現。下面是實現的代碼。
UpdateItemsAdapter.java
package com.example.apkupdate;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import android.content.Context;
import android.content.pm.PackageInfo;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import com.kitsp.contentsp.IntentSp;
import com.kitsp.httpsp.REQUEST_KEYS;
import com.kitsp.httpsp.REQUEST_MESSAGES;
import com.kitsp.httpsp.RequestSp;
import com.kitsp.widgetsp.MessageBoxSp;
public class UpdateItemsAdapter extends BaseAdapter {
private List _updateItems = null;
private Context _context = null;
public UpdateItemsAdapter(List updateItems, Context context) {
_updateItems = updateItems;
_context = context;
}
@Override
protected void finalize() throws Throwable {
// TODO Auto-generated method stub
super.finalize();
}
@Override
public int getCount() {
// TODO Auto-generated method stub
if (_updateItems.isEmpty()) {
return 0;
}
return _updateItems.size();
}
@Override
public Object getItem(int position) {
if (_updateItems.isEmpty()) {
return null;
}
return _updateItems.get(position);
}
@Override
public long getItemId(int position) {
if (_updateItems.isEmpty()) {
return 0;
}
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (_context == null) {
return null;
}
UpdateItem updateItem = (UpdateItem) getItem(position);
if (updateItem == null) {
return null;
}
View updateItemLayout = View.inflate(_context, R.layout.update_item,
null);
if (updateItemLayout == null) {
return null;
}
ImageView app_imageView = (ImageView) updateItemLayout
.findViewById(R.id.update_item_app_image);
TextView appName_textView = (TextView) updateItemLayout
.findViewById(R.id.update_item_app_name);
TextView appOldVersion_textView = (TextView) updateItemLayout
.findViewById(R.id.update_item_app_old_version);
TextView appNewVersion_textView = (TextView) updateItemLayout
.findViewById(R.id.update_item_new_version);
final Button behavior_button = (Button) updateItemLayout
.findViewById(R.id.update_item_behavior);
String oldVersion=FetchPackageVersion(updateItem.GetFeaturePackage());
if(oldVersion!=null&&oldVersion.length()>0)
{
updateItem.SetOldVersion(oldVersion);
}
appName_textView.setText(updateItem.GetName());
appOldVersion_textView.setText(updateItem.GetOldVersion());
appNewVersion_textView.setText(updateItem.GetNewVersion());
boolean isNewVersion = IsNewVersion(updateItem.GetOldVersion(),
updateItem.GetNewVersion());
updateItem.SetBehavior(isNewVersion ? UPDATE_BEHAVIORS.UPDATE
: UPDATE_BEHAVIORS.NO_UPDATE);
behavior_button.setEnabled(isNewVersion);
behavior_button.setText(updateItem.GetBehavior());
behavior_button.setTag(updateItem);
behavior_button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
ExecuteBehavior(behavior_button);
}
});
return updateItemLayout;
}
private String FetchPackageVersion(String packageName) {
if (packageName == null || packageName.length() <= 0) {
return null;
}
List packages = _context.getPackageManager()
.getInstalledPackages(0);
for (int i = 0; i < packages.size(); i++) {
PackageInfo packageInfo = packages.get(i);
if (packageInfo.packageName.equals(packageName)) {
return packageInfo.versionName;
}
}
return null;
}
private boolean IsNewVersion(String oldVersion, String newVersion) {
if (newVersion == null || newVersion.length() <= 0) {
return false;
}
if (oldVersion == null || oldVersion.length() <= 0
|| oldVersion.equals(UPDATE_BEHAVIORS.NOT_INSTALL)) {
return true;
}
String[] olds = oldVersion.split("\\.");
String[] news = newVersion.split("\\.");
int compareLength = (olds.length > news.length) ? news.length
: olds.length;
for (int index = 0; index < compareLength; index++) {
if (Integer.parseInt(olds[index]) > Integer.parseInt(news[index])) {
return false;
} else if (Integer.parseInt(olds[index])< Integer
.parseInt(news[index])) {
return true;
}
}
if (news.length > olds.length) {
return true;
}
return false;
}
}
注:
1、UpdateItemsAdapter繼承自BaseAdapter,然後重載相應的方法。關鍵是getView的重載。
2、在getView中,我們獲取了update_item.xml的布局,然後抓取相關的控件,並填入數據。在獲取update_item.xml的布局時,需要一個context,所以UpdateItemsAdapter的構造函數中需要傳入一個context,以方便使用。
3、UpdateItem是自定義的一個類,具體可以參考後面的代碼。
4、在updateItem中有一個GetFeaturePackage()函數,獲取相應的特征包的名稱,根據該特征包的名稱從機器中獲取相應的版本信息。該特征包的名稱會在服務器中進行配置,以便於更靈活的更新。當然如果要實現各個包的更新,可以增加更詳細的明細表來實現。
5、IsNewVersion通過新舊版本的比較,判斷安裝包是否是最新的,然後在behavior_button中呈現相應的行為。
6、對於ExecuteBehavior(behavior_button)將會在後文中實現,該函數的主要功能就是根據不同的行為執行不同的動作,如更新、下載、安裝等。
UpdateItem.java
package com.example.apkupdate;
public class UpdateItem {
private String _name="";
private String _featurePackage="";
private String _oldVersion=UPDATE_BEHAVIORS.NOT_INSTALL;
private String _newVersion="";
private String _url="";
private String _behavior=UPDATE_BEHAVIORS.NOT_INSTALL;
private String _savePath="";
public void SetName(String name)
{
_name=name;
}
public String GetName()
{
return _name;
}
public void SetFeaturePackage(String featurePackage)
{
_featurePackage=featurePackage;
}
public String GetFeaturePackage()
{
return _featurePackage;
}
public void SetOldVersion(String oldVersion)
{
_oldVersion=oldVersion;
}
public String GetOldVersion()
{
return _oldVersion;
}
public void SetNewVersion(String newVersion)
{
_newVersion=newVersion;
}
public String GetNewVersion()
{
return _newVersion;
}
public void SetUrl(String url)
{
_url=url;
}
public String GetUrl()
{
return _url;
}
public void SetBehavior(String behavior)
{
_behavior=behavior;
}
public String GetBehavior()
{
return _behavior;
}
public void SetSavePath(String savePath)
{
_savePath=savePath;
}
public String GetSavePath()
{
return _savePath;
}
}
package com.example.apkupdate;
public class UPDATE_BEHAVIORS {
public final static String NOT_INSTALL="Not Install";
public final static String UPDATE="Update";
public final static String INSTALL="Install";
public final static String NO_UPDATE="No Update";
}
請參看後文Android基於IIS的APK下載(三)用JSON傳輸更新數據
轉載請注明出處Android基於IIS的APK下載(二)顯示更新列表
完整代碼在此處下載https://github.com/sparkleDai/ApkUpdate
為什麼微信附近的人看不到我 微信附近的人找不到我怎麼辦
微信附近的人是一個可以看到周邊人也在玩這個功能的人。有朋友說他可以看到別人,但是別人看不到他,這是為什麼呀?我的微信能看到附近的人,但附近的人看不見我,怎麼
自定義Android手機的Activity標題欄
先來文字詳述的: 當我們想讓自己的手機全屏,立馬會想到requestWindowFeature(featrueId)函數吧。 一、枚舉常量 1.DEFAULT_FE
自定義卡尺選擇器
前言由於某個項目需要,就寫了這個東西。大家看看有需求的直接拿走。效果1.支持拖動,支持點擊2.可定制的屬性還是比較全面的包裹差值器都可以設置,下面這個使用的是oversh
打造一個Android 3D立體旋轉容器
1.概述回到正題,這次帶來的效果,是一個Android 的3D立體旋轉的效果。當然靈感的來源,來自早些時間微博上看到的效果圖。非常酷有木有!作為程序猿我當然要把它加入我的