Thursday, January 31, 2013
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();
}
}
}
}
以 ","為分割點
逐次丟入陣列之中
然後再一次一次的比較
Wednesday, January 23, 2013
[Android] 網路連線
http://jacobtsai.wordpress.com/2010/07/15/android-%E5%88%A4%E6%96%B7%E6%89%8B%E6%A9%9F%E6%98%AF%E5%90%A6%E9%80%A3%E4%B8%8A%E7%B6%B2%E8%B7%AF-connectivitymanager/
http://bluegray-javalearning.blogspot.tw/2010/09/nullpointerexception.html
http://fecbob.pixnet.net/blog/post/34682697-%5Bandroid%5D-%E6%AA%A2%E6%9F%A5%E7%B6%B2%E8%B7%AF(wifi)%E5%92%8C3g%E7%8B%80%E6%85%8B
http://milkmidi.blogspot.tw/2012/02/android.html
http://iskens.blogspot.tw/2010/12/android-check-internet-connection.html
http://www.devdiv.com/_Android_%E7%BD%91%E7%BB%9C%E8%B5%84%E6%BA%90%E4%B8%8B%E8%BD%BD%E6%97%B6%E6%96%AD%E7%82%B9%E7%BB%AD%E4%BC%A0%E7%9A%84%E5%AE%9E%E7%8E%B0-weblog-30993-9566.html
http://j796160836.pixnet.net/blog/post/28994669-%5Bandroid%5D-%E4%BD%BF%E7%94%A8http%E7%9A%84post%E6%96%B9%E5%BC%8F%E5%92%8C%E7%B6%B2%E9%A0%81%E8%A1%A8%E5%96%AE%E6%BA%9D%E9%80%9A
http://bluegray-javalearning.blogspot.tw/2010/09/nullpointerexception.html
http://fecbob.pixnet.net/blog/post/34682697-%5Bandroid%5D-%E6%AA%A2%E6%9F%A5%E7%B6%B2%E8%B7%AF(wifi)%E5%92%8C3g%E7%8B%80%E6%85%8B
http://milkmidi.blogspot.tw/2012/02/android.html
http://iskens.blogspot.tw/2010/12/android-check-internet-connection.html
http://www.devdiv.com/_Android_%E7%BD%91%E7%BB%9C%E8%B5%84%E6%BA%90%E4%B8%8B%E8%BD%BD%E6%97%B6%E6%96%AD%E7%82%B9%E7%BB%AD%E4%BC%A0%E7%9A%84%E5%AE%9E%E7%8E%B0-weblog-30993-9566.html
http://j796160836.pixnet.net/blog/post/28994669-%5Bandroid%5D-%E4%BD%BF%E7%94%A8http%E7%9A%84post%E6%96%B9%E5%BC%8F%E5%92%8C%E7%B6%B2%E9%A0%81%E8%A1%A8%E5%96%AE%E6%BA%9D%E9%80%9A
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 ,只有這樣其他程式才能正確訪問。
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/
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>
有時候想呈現繪圖背景或是想播放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
Thursday, January 17, 2013
[Android] RSS解析
http://lp43.blogspot.tw/2010/08/rss.html
常看到的RSSxml檔案格式
常看到的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連網功能是關閉的,必須透過上述的設定將上網權限打開。
Subscribe to:
Comments (Atom)