學(xué)習(xí)android一段時(shí)間了洋幻,這期間做了兩個(gè)APP碳却,一個(gè)天氣預(yù)報(bào)應(yīng)用队秩,另一個(gè)是求職簡(jiǎn)歷應(yīng)用,遇到了許多困難昼浦,也學(xué)到了許多知識(shí)馍资,在此記錄下學(xué)習(xí)的經(jīng)驗(yàn)以及遇到的問(wèn)題。
JunzWeather:你的天氣
JunzResume:你的簡(jiǎn)歷
問(wèn)題和心得
-
模糊查詢
在你的天氣這個(gè)項(xiàng)目中关噪,有一個(gè)功能是切換城市鸟蟹,用到了模糊查詢。
標(biāo)準(zhǔn)sql語(yǔ)句是這樣的:
SELECT DISTINCT area_zh FROM city WHERE area_zh LIKE ‘%cityname%' OR area_en LIKE '%cityname%' ORDER BY area_en;
可以通過(guò)“cityname”在表中/英城市名數(shù)據(jù)列中查出城市名并排序使兔。
程序代碼中我最初是這么寫(xiě)的:
String sql = "SELECT DISTINCT area_zh FROM city WHERE area_zh LIKE '%?%' OR area_en LIKE '%?%' ORDER BY area_en;";
Cursor cursor = db.rawQuery(sql, new String[]{SearchText,SearchText});
無(wú)法正常使用建钥,后改成下面代碼能達(dá)到查詢目的:
String sql = "SELECT DISTINCT area_zh FROM city WHERE area_zh LIKE ? OR area_en LIKE ? ORDER BY area_en;";
Cursor cursor = db.rawQuery(sql, new String[] { "%" + SearchText + "%","%" + SearchText + "%" });
由此看來(lái)在使用占位符?
進(jìn)行模糊查詢時(shí),要將%
和虐沥?
看做一個(gè)整體熊经,當(dāng)做參數(shù)傳入,如果僅僅把?
當(dāng)做參數(shù)欲险,%
寫(xiě)入sql字符串镐依,會(huì)使此sql語(yǔ)句語(yǔ)義錯(cuò)誤!
-
ListView更新數(shù)據(jù)
這兩個(gè)項(xiàng)目中都使用了ListView天试,傳入自定義的adapter顯示數(shù)據(jù)槐壳。
但是調(diào)試時(shí)發(fā)現(xiàn)即使動(dòng)態(tài)改變內(nèi)部數(shù)據(jù)后,調(diào)用adapter.notifyDataSetChanged();
方法我列表的顯示卻沒(méi)有變化喜每!
當(dāng)時(shí)我的更新數(shù)據(jù)方法是這樣寫(xiě)的:
cityNameList = db.searchAllCityName();
adapter.notifyDataSetChanged();
這么看好像邏輯很正常啊务唐,其實(shí)不然。
我們?cè)趯ist傳入到adapter之后灼卢,adapter保存了指向list對(duì)象的引用绍哎,用以顯示其中數(shù)據(jù)。
但是代碼cityNameList = db.searchAllCityName();
會(huì)讓cityNameList
指向一個(gè)新的List對(duì)象鞋真,而adapter內(nèi)部指向保存數(shù)據(jù)的對(duì)象未改變崇堰,而且由于cityNameList
引用的改變,我們也無(wú)法再訪問(wèn)到保存數(shù)據(jù)的List集合涩咖,所以無(wú)論如何操縱海诲,顯示的數(shù)據(jù)自然不會(huì)改變!
因此檩互,正確的寫(xiě)法是:
cityNameList.clear();
cityNameList.addAll(db.searchAllCityName());
adapter.notifyDataSetChanged();
先將List清除特幔,在把查詢的加過(guò)全部加到List集合中,通知adapter更新數(shù)據(jù)闸昨。
-
APP啟動(dòng)關(guān)閉標(biāo)題欄
在我們調(diào)試或者運(yùn)行APP的時(shí)候蚯斯,會(huì)發(fā)現(xiàn)在軟件啟動(dòng)時(shí)會(huì)屏幕上方會(huì)短暫出現(xiàn)一個(gè)標(biāo)題欄薄风,非常影響視覺(jué)體驗(yàn)。那如何去掉這個(gè)bar呢拍嵌?
最簡(jiǎn)單的方法就是打開(kāi)項(xiàng)目的AndroidManifest.xml
找到android:theme
屬性遭赂,將主題設(shè)置為Theme.NoTitleBar
,這樣就不會(huì)出現(xiàn)啟動(dòng)時(shí)那個(gè)標(biāo)題欄了横辆。
-
背景選擇器selector
當(dāng)我們點(diǎn)擊撇他,按住一個(gè)控件,比如按鈕時(shí)狈蚤,有時(shí)我們會(huì)希望它的背景圖片發(fā)生變化困肩,這樣可以使應(yīng)用更人性化。這是就要用到了選擇器脆侮。
選擇器是以xml
文件放在res/drawable
文件夾下的锌畸,完成后在布局文件中的android:background="@drawable/xxx.xml"
屬性引用該文件即可。比如在你的簡(jiǎn)歷項(xiàng)目中他嚷,其中的按鈕默認(rèn)為白色蹋绽,當(dāng)點(diǎn)擊或按住時(shí)則顯示為黃色芭毙,寫(xiě)法如下:
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/btn_add_click" android:state_pressed="true"/>
<item android:drawable="@drawable/btn_add_click" android:state_focused="true"/>
<!-- 正常顯示的樣式放到最后筋蓖,因?yàn)槿绻诺角懊妫筒患虞d后面的了退敦!所以放到最后 -->
<item android:drawable="@drawable/btn_add_default" android:state_enabled="true"/>
</selector>
其中android:drawable
屬性是你要現(xiàn)實(shí)的圖片ID粘咖,android:state_pressed="true"
屬性你你顯示該圖片的條件,比如這個(gè)就是在點(diǎn)擊時(shí)切換背景圖片為btn_add_click
侈百。
有一點(diǎn)要注意瓮下,正常顯示的itemandroid:state_enabled="true
必須要寫(xiě)在最后,不然無(wú)法正常達(dá)到顯示效果钝域,我最初就是遇到這個(gè)坑讽坏,找了好久才發(fā)現(xiàn)問(wèn)題。
我個(gè)人猜測(cè)原因是在加載次xml文件時(shí)例证,加載到這一行就會(huì)停止加載路呜,不再加載后面條目。
-
記住密碼功能
你的簡(jiǎn)歷項(xiàng)目中织咧,實(shí)現(xiàn)了登錄時(shí)記住密碼功能胀葱。
該功能是借助SharedPreferences,在onStop()
方法里將賬號(hào)密碼存入xml文件里笙蒙,當(dāng)回到該Activity時(shí)抵屿,在onRame()
方法內(nèi)取出存入的賬號(hào)信息,達(dá)到記住密碼功能捅位。
注意:存儲(chǔ)數(shù)據(jù)和清除數(shù)據(jù)都要執(zhí)行commit()
命令轧葛。
-
TextView輸入框不換行
在項(xiàng)目中使用TextView控件時(shí)搂抒,出現(xiàn)了輸入文字超出輸入框后不換行的現(xiàn)象,在網(wǎng)上查詢答案設(shè)置android:singleLine="false"
等等屬性也不起作用尿扯。
經(jīng)過(guò)自己調(diào)試燕耿,終于發(fā)現(xiàn)是因?yàn)榇丝丶?code>TableLayout中,而且我設(shè)置了android:stretchColumns
屬性來(lái)填充列姜胖,這就會(huì)使TextView換行出現(xiàn)問(wèn)題誉帅,解決方法是去掉此屬性或者再加上android:stretchColumns
屬性。
-
Toast重復(fù)顯示
Toast是經(jīng)常使用的信息提示工具右莱,當(dāng)我們使用代碼Toast.makeText(context, text, Toast.LENGTH_SHORT).show;
蚜锨,每次觸發(fā)都會(huì)彈出一條Toast,用戶體驗(yàn)非常差慢蜓,所以我們可以將其封裝成一個(gè)公共方法亚再,每次都是使用同一個(gè)Toasr,顯示不同文本晨抡,解決該問(wèn)題氛悬。
代碼如下:
public static void showToast(Context context, String text) {
if (toast == null) {
toast = Toast.makeText(context, text, Toast.LENGTH_SHORT);
} else {
toast.setText(text);
}
toast.show();
}
這里需要傳入一個(gè)context
,我發(fā)現(xiàn)其實(shí)只有第一次使用才會(huì)用到context
耘柱,以后調(diào)用用的都是第一次傳入的如捅,可以正常顯示。
-
輸入框彈出鍵盤(pán)類型
當(dāng)我們做輸入功能時(shí)调煎,有時(shí)需要規(guī)定準(zhǔn)備輸入時(shí)彈出鍵盤(pán)的類型镜遣,這要用到android:inputType
屬性,比如要輸入電話就只能彈出數(shù)字鍵盤(pán)士袄,則設(shè)置控件屬性為android:inputType="number"
,這個(gè)屬性有很多參數(shù)悲关,可根據(jù)需求選擇。
-
如何獲取fragment中的控件
在你的簡(jiǎn)歷這個(gè)項(xiàng)目中娄柳,使用了側(cè)滑欄drawerlayout
寓辱,彈出側(cè)滑欄點(diǎn)擊具體表項(xiàng),就可將對(duì)應(yīng)的fragment
顯示到主內(nèi)容區(qū)赤拒。
那就需要獲取到fragment
的控件進(jìn)行操作秫筏。在fragment
中可以重載onCreateView
方法,其中有個(gè)LayoutInflater
參數(shù)需了,借助該參數(shù)調(diào)用.inflate(int resource, ViewGroup root, boolean attachToRoot)
方法就可以得到一個(gè)返回的view
跳昼。再借助方法view.findViewById(id)
獲得控件。
關(guān)于那三個(gè)參數(shù)的作用可以看看這篇博客:inflate參數(shù)作用
<br /><br /><br /><br />