Friday, January 25, 2013

[Android] 版本字串比較


第一種

int OldVersion = Integer.parseInt( NabiFunction.getNabiVersion().replaceAll( "\\.", "" ) );
int NewVersion = Integer.parseInt( "1.9.20".replaceAll( "\\.", "" ) );
if(OldVersion < NewVersion){
Toast.makeText(AppZoneV2Activity.this, "Please Update", Toast.LENGTH_LONG).show();
}else{
Toast.makeText(AppZoneV2Activity.this, "It is New Version", Toast.LENGTH_LONG).show();
}

將字串中的 "," 全部改成""  (使用replace方法)
EX:  1.9.20  ---->  1920

第二種

In Activity
private void CheckVersion(){
String NabiVersion = NabiFunction.getNabiVersion();
Out.println("NabiFunction.getNabiVersion()=" + NabiVersion,FuhuApplication.LOG_SWITCH);
String nabiversion[] = NabiVersion.split("\\.");
if(Integer.parseInt(nabiversion[0]) < 2){
if(Integer.parseInt(nabiversion[1]) < 10){
if(Integer.parseInt(nabiversion[2]) < 21){
// Toast.makeText(AppZoneV2Activity.this, "Please Update", Toast.LENGTH_LONG).show();
CheckVersionWarning();
}
}
}
}

以 ","為分割點
逐次丟入陣列之中
然後再一次一次的比較


Monday, January 21, 2013

[Android] Java Android 日期時間應用筆記


日期時間主要運用到的三個類別

01.SimpleDateFormat

定義日期時間格式

將字串轉為Date型 parse(字串)回傳Date

將Date依照設定格式轉為字串 format(Date)回傳字串

02.Date(java.util.Date)

日期時間類別

Date dt=new Date() 取得當下時間

Date dt=new Date(1356689117695) 可傳入unixTime取得

dt.getTime() 取得unixTime毫秒 Long型別

03.Calendar

日曆類別

Calendar calendar = Calendar.getInstance() 取得當下時間

calendar(Date) 傳入date,指定時間

calendar.getTime() 取得Date形別

常見用法



01.取得現在日期時間字串

//先行定義時間格式
SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
//取得現在時間
Date dt=new Date();
//透過SimpleDateFormat的format方法將Date轉為字串
String dts=sdf.format(dt);


02.取得某時間字串的 星期,上中下午

//定義好時間字串的格式
SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
//將字串轉成Date型
Date dt =sdf.parse("2013/01/07 11:49:00");
//定義要取的內容
SimpleDateFormat sdf5 = new SimpleDateFormat("E");//星期
SimpleDateFormat sdf6 = new SimpleDateFormat("a");//時段
//取出
String day=sdf5.format(dt);//星期
String td=sdf6.format(dt);//時段(會依照各手機系統不同,有差異.有些只有上午下午,有些則是有凌晨,中午等更詳細的描述)


03.讀取Unix時間格式,轉以字串顯示

//讀取Unix時間
Date dt=new Date(1356689117695);//UnixTime毫秒
//定義時間格式
SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
//轉換字串
String time=sdf.format(dt);


04.讀取日期字串,透過calendar做日期時間加減的動作,再轉回日期字串

//定義好時間字串的格式
SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
//將字串轉成Date型
Date dt =sdf.parse("2013/01/07 11:49:00");
//新增一個Calendar,並且指定時間
Calendar calendar = Calendar.getInstance();
calendar.setTime(dt);
calendar.add(Calendar.MONTH, 2);//月份+2
calendar.add(Calendar.HOUR, -1);//小時-1
Date tdt=calendar.getTime();//取得加減過後的Date
//依照設定格式取得字串
String time=sdf.format(tdt);


05.計算兩個時間差距
//定義時間格式
SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
//取的兩個時間
Date dt1 =sdf.parse("2012/12/31 11:49:00");
Date dt2 =sdf.parse("2013/01/10 11:49:00");
//取得兩個時間的Unix時間
Long ut1=dt1.getTime();
Long ut2=dt2.getTime();
//相減獲得兩個時間差距的毫秒
Long timeP=ut2-ut1;//毫秒差
Long sec=timeP/1000;//秒差
Long min=timeP/1000*60;//分差
Long hr=timeP/1000*60*60;//時差
Long day=timeP/1000*60*60*24;//日差


06.取得星期
Date date=new Date();
int day=date.getDay();

0~6表示禮拜日到禮拜六

但是根據api描述

This method is deprecated.此方法已經過時

建議使用Calender
SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
Date dt =sdf.parse("2012/12/31 11:49:00");
Calendar calendar = Calendar.getInstance();//取得目前時間
calendar.setTime(dt);//或是設定指定時間


int day=calendar.DAY_OF_WEEK;

1~7代表禮拜日至禮拜六

DotBlogs Tags: Android Java

[Android] 漸變背景圖片失真問題


最近一個困擾很久的問題,漸變效果的png圖片,設置為控件圖片或background時,在eclipse上看著沒有什麼問題,但是在設備上運行時,可以看到明顯的一圈圈的輪廓線,圖片嚴重失真。

在網上google了一下似乎這個問題很多人遇到,找到一種解釋是Android設備display默認是採用16-bits color palette來表示所有顏色,因此對於帶alpha值的32位png圖片會出現顯示失真。
這個問題有兩種解決方法:
1.第一種方法最簡單直接(推薦),設置需要顯示Activity的PixelFormat,

getWindow().setFormat(PixelFormat.RGBA_8888);
PS:在onCreate()中直接加
RGBA_8888為android的一種32位顏色格式,R,G,B,A分別用八位表示,Android默認格式是PixelFormat.OPAQUE,其是不帶Alpha值的。設置之後可以看到圖片的顯示效果就和在PC上看到一樣,不會出現帶狀的輪廓線了。

2.第二種方法比較麻煩,就是將你需要要顯示的view設置為一個surfaceview,這樣也可以達到同樣的顯示效果,但這種方法代價較大,不推薦。

[Android] 資料儲存

http://fecbob.pixnet.net/blog/post/35618216-android%E8%B3%87%E6%96%99%E5%84%B2%E5%AD%98-%E3%80%90%E8%BD%89%E3%80%91-

Context.MODE_PRIVATE:為預設操作模式,代表該檔是私有資料,只能被應用本身訪問,在該模式下,寫入的內容會覆蓋原檔的內容,如果想把新寫入的內容追加到原檔中。可以使用Context.MODE_APPEND。


Context.MODE_APPEND:模式會檢查檔是否存在,存在就往檔追加內容,否則就創建新檔。

Context.MODE_WORLD_READABLE和Context.MODE_WORLD_WRITEABLE用來控制其他應用是否有許可權讀寫該檔。

MODE_WORLD_READABLE:表示當前檔可以被其他應用讀取;MODE_WORLD_WRITEABLE:表示當前檔可以被其他應用寫入。

如果希望檔被其他應用讀和寫,可以傳入:

openFileOutput("itcast.txt", Context.MODE_WORLD_READABLE + Context.MODE_WORLD_WRITEABLE);     android有一套自己的安全模型,當應用程式(.apk)在安裝時系統就會分配給他一個userid,當該應用要去訪問其他資源比如檔的時候,就需要userid匹配。 預設情況下,任何應用創建的檔,sharedpreferences,資料庫都應該是私有的(位於/data/data//files),其他程式無法訪問。 除非在創建時指定Context.MODE_WORLD_READABLE或者Context.MODE_WORLD_WRITEABLE ,只有這樣其他程式才能正確訪問。

Friday, January 18, 2013

[Android] 2.33 隱藏Notification Bar and Title Bar

http://shung007.blogspot.tw/2010/11/android-tips-title-barnotification-bar.html

 有時候想呈現繪圖背景或是想播放Video影像時 , 會想在狹小的螢幕多爭取一點空間


這時候乾脆就把Title Bar和Notification Bar隱藏獲取更多螢幕空間吧!!!! 步驟很簡單

接下來為了要隱藏Title Bar這邊有幾個方法 , 首先可以在AndroidMenifest.xml , 在對Activity 作屬性定義的時候可以加上 android:theme 來設置 Activity 的主題





AndroidMenifest.xml

















</< code>CATEGORY></< code>ACTION></< code>INTENT-FILTER>

</< code>ACTIVITY>

</< code>APPLICATION>

</< code>MANIFEST>



仔細看可以發現 AndroidMenifest.xml多了兩行註解

這是我們自定義的style , 使用他們來替換都可以得到一樣的效果 , 而style Resource是要放置在res/values下的 , 可以參考這邊 , 在這邊我把

@style/myThemeOne放在原本的string.xml檔案裡

android:theme="@style/myThemeTwo放在style.xml裡 , 但是都必須放在res/values下



string.xml



Hello World, Test</< code>STRING>

ThereIsTitleBar</< code>STRING>

Thursday, January 17, 2013

[Android] RSS解析

http://lp43.blogspot.tw/2010/08/rss.html

常看到的RSSxml檔案格式
<itme>
    <title>新聞的標題</title>
    <link>新聞的連結網址</link>
    <description>新聞內容簡述</description>
    <pubDate>發佈新聞的時間</pubDate>
</item>
 
所謂的RSS解析器,說白一點,就是在這些標籤裡,把字取出來啦!
通常各大網站都會提供RSS新聞的連結,像yam新聞的RSS網址是這樣子的
 
所以,到時候程式裡一定要有個地方能夠存這個網址。
------------------------------------------------------

RSS解析器裡會有4個工人分工合作著
(1)XMLReader - 閱讀工人
(2)MyAdapter(繼承自BaseAdapter) - 版面配置工人
(3)MyHandler(繼承自DefaultHandler) - 文字分配工人
(4)一個具物件導向特性的類別News - 模版工人

要能夠解析一份RSS,Android交給了4個工人幫忙
(1)XMLReader
第1個工人既然叫閱讀工人,我們就來看看這個工人是怎麼讀書的吧︰
 
URL url = null;
 
try{
    url = new URL(path);//呼叫網址進來
    SAXParserFactory spf = SAXParserFactory.newInstance();//先蓋一個工廠
    SAXParser sp = spf.newSAXParser();//工廠有一個知識不太高的解析工人
    XMLReader xr = sp.getXMLReader();//也有一個閱讀工人
    MyHandler myHandler = new MyHandler();//用到了我們之後建立的分配工人
    xr.setContentHandler(myHandler);//將閱讀工人和分配工人做結合
    xr.parse(new InputSource(url.openStream()));//閱讀工人用parse去開啟一個InputStream放資料
     
    data = myHandler.getParsedData();//getParsedData()方法會在myHandler裡看到
}catch(Exception e){
    log.i("message","wrong!");
    }
 
原來光一個閱讀工人,就已經做了一些的前置動作了。

(2)MyAdapter
其實這個版面配置工人還真的是可有可無,要不是主編要求取出來的"新聞發佈時間"不能和"新聞標題"一樣大,還真的是不用請版面配置工人出來,用原本的android預設配置就好
這個配置工人,android希望我們繼承自BaseAdapter,而且,還規範了我們必須實作以下4個method
 
//建構子
public MyAdapter(Context context,List lt){
mInflater = LayoutInflater.from(context);
}
@Override
public int getCount(){
    return 數量;
    }
@Override
public int getItem(int position){
    return position;
    }
@Override
public int getItemId(){
    return position;
    }
@Override
public View getView(int position,View convertView,ViewGroup par){
    ViewHolder holder;
    if(convertView == null){
    convertView = mInflater.inflate(R.layout.news_row, null);
    holder = new ViewHolder();
    holder.text = (TextView) convertView.findViewById(R.id.text);
    convertView.setTag(holder);
    }else{
    holder = (ViewHolder) convertView.getTag();
    }
    return convertView;
  }
 
class ViewHolder{//為自己訂的版面的xml做一個類別
    TextView text;
    }
}
 
最後面這段「為自己訂的版面的xml做一個類別」是什麼意思呢?
其實配置工人通常會帶一個小老婆出現︰
news_row.xml
他們其實是很親密的,正所謂孟不離焦啊!
一個負責外表(xml),另一個是對應的骨架(class ViewHolder)

(3)MyHandler
既然叫Handler,當然什麼事都要幫你搞定囉!
它也有幾個一定要我們覆寫的method
 
public class MyHandler extends DefaultHandler{
    private List<News> li;
 
    public List getParsedData(){//這個是我們自己寫的,沒有一定要覆寫
    return li;
    }
     
    @Override
    pubilc void starDocument() throws SAXExcption{
    li = new ArrayList<News>();//在程式解析之初,先建立一個ArrayList容器
    }
 
    @Override
    pubilc void endDocument() throws SAXExcption{
    }
 
    @Override
    pubilc void starElement(String namespaceURI, String localName, String qName, Attributes atts) thtows SAXException{
    news = new News();//在程式解析之初,先產生實體
    }
 
    @Override
    pubilc void endElement(String namespaceURI, String localName, String qName, Attributes atts) thtows SAXException{
    //更多程式碼
    }
 
    @Override  //取標籤內的字的方式
    pubilc void characters(char ch[], int start, int length){
    //更多程式碼   
    }
}
 
這段的程式跑法是︰
starElement()→characters()→endElement()→starElement()→characters()→endElement().....
將一個一個的標籤辨識出來並跑完



(4)News類別
既然叫模版工人,就是說從解析器解出來的字串,要有一個一個的對應去接收資料,好讓容器能歸納整理咩

所以,模版的程式碼超基本
 
public class News{
    private String title="";  //新聞的標題存在這裡
    private String link="";  //新聞的連結網址存在這裡
    private String desc="";  //新聞的大綱描述存在這裡
    private String date="";  //新聞的發佈時間存在這裡
//以下是一堆的getter和setter
//像︰
    public String getTitle(){
    return title;
    }
    public String setTitle(String title){
    this.title = title;
    }
    //更多程式碼   
}
 
最後最後,有一個超關鍵,如果你忽略了,可能都不知道為什麼會無法解析或上網咧!

請你在AndroidManifest.xml這個apk基本配面版中的區塊外,做以下的新增
?
1
<uses-permission android:name="android.permission.INTERNET" />
因為android預設的apk連網功能是關閉的,必須透過上述的設定將上網權限打開。