標籤:
常見布局
相對布局(RelativeLayout)
相對布局下控制項預設位置都是左上方(靠左對齊、頂部對齊父元素),控制項之間可以重疊
可以相對於父元素上下左靠右對齊,相對於父元素水平置中、豎直置中、水平豎直同時置中
android:layout_alignParentRight="true" <!-- 設定靠右對齊父元素 -->android:layout_centerHorizontal="true" <!-- 設定相對父元素水平置中 -->
可以相對於其他控制項上下左靠右對齊
android:layout_alignRight="@id/tv1" <!--設定與指定控制項靠右對齊-->
可以布局於其他控制項的上方、下方、左邊、右邊
android:layout_toRightOf="@id/tv1" <!-- 設定控制項在指定控制項的右邊 -->android:layout_below="@id/tv1" <!-- 設定控制項在指定控制項的下邊 -->
線性布局(LinearLayout)
線性布局有一個布局方向,水平(horizontal)或者豎直(vertical)
android:orientation="horizontal" <!-- 指定子控制項按水平布局 -->
在豎直布局下,設定靠左對齊、靠右對齊,水平置中會生效,其它無效;在水平布局下,設定頂部對齊、底部對齊、豎直置中會生效,其他無效
當控制項的寬度或高度使用match_parent時有可能把其他控制項頂出螢幕
權重:按比例分配螢幕的剩餘寬度或者高度
android:layout_weight="1" <!-- 佔滿剩餘寬度或高度 -->
幀布局(FrameLayout)
幀布局下控制項的預設位置也是左上方(靠左對齊、頂部對齊父元素),控制項之間可以重疊——同相對布局
可以設定上下左靠右對齊,水平豎直置中,但不能相對於其他控制項布局——同線性布局
表格版面配置(TableLayout)
表格版面配置中的節點可以不設定寬高,因為設定了也無效。根節點TableLayout的子節點寬為匹配父元素,高為包裹內容,TableRow節點的子節點寬為包裹內容,高為包裹內容。每個TableRow節點是一行,它的每個子節點是一列
根節點中可以設定以下屬性,表示讓第1列展開填滿螢幕寬度的剩餘空間
android:stretchColumns="1"
絕對布局(AbsoluteLayout)
直接指定控制項的x、y座標,基本用不到
android:layout_x="144dp"android:layout_y="154dp"
Logcat
日誌(Log)資訊總共分為5個等級
verbose:冗餘,最低等級
debug:調試
info:正常等級的資訊,System.out.print輸出的記錄層級就是是info
warn:警告
error:錯誤,最高等級
Android中的日誌工具類是Log(android.util.Log),Android提供如下的日誌輸出API來供我們列印日誌。其中第一個參數是Tag,通常傳入當前的類名,主要用於對列印資訊進行過濾,我們可以定義過濾器方便查看日誌資訊;第二個參數是我們想要列印的具體內容
Log.v(Tag, "加油吧,童鞋們");Log.d(Tag, "加油吧,童鞋們");Log.i(Tag, "加油吧,童鞋們");Log.w(Tag, "加油吧,童鞋們");Log.e(Tag, "加油吧,童鞋們");
Android的儲存
內部儲存空間
RAM記憶體:運行記憶體,相當於電腦的記憶體
ROM記憶體:儲存記憶體,相當於電腦的硬碟(這個才是內部儲存空間,是必須有的)
外部儲存空間
SD卡:相當於電腦的移動硬碟(可有可無)
Android 2.2之前,SD卡路徑:sdcard
Android 4.3之前,SD卡路徑:mnt/sdcard
Android 4.3開始,SD卡路徑:storage/sdcard
為了相容低版本的程式,Android系統在原SD卡的位置都保留有一個"捷徑"
現在買的手機,如魅族MX5 16G版,這個16G實際上指的是外部儲存空間,而廠家並沒有告訴我們手機的內部儲存空間是多少
在內部儲存讀寫資料
用API獲得內部儲存的真實路徑
getFilesDir()得到的file對象的路徑是data/data/[package name]/files,存放在這個路徑下的檔案,只要你不刪,它就一直在
getCacheDir()得到的file對象的路徑是data/data/[package name]/cache,存放在這個路徑下的檔案,當記憶體不足時,有可能被刪除
在系統管理應用的介面點擊清除緩衝,會清除cache檔案夾下的資料,點擊清除資料,會清除整個包名目錄下的資料
在外部儲存讀寫資料
最簡單的開啟SD卡的方式
File file = new File("sdcard/xxx.txt");
使用API獲得SD卡的真實路徑,因為部分手機廠商會更改SD卡的路徑
File file = new File(Environment.getExternalStorageDirectory(),"xxx.txt")
判斷SD卡是否準備就緒
if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED))
SD卡主要的幾種狀態
MEDIA_UNKNOWN:不能識別sd卡
MEDIA_REMOVED:沒有sd卡
MEDIA_UNMOUNTED:sd卡存在但是沒有掛載
MEDIA_CHECKING:sd卡正在準備
MEDIA_MOUNTED:sd卡已經掛載,可用
寫SD卡需要許可權
<!-- 配置在SD卡中建立與刪除檔案的許可權 --><uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/><!-- 配置向SD卡寫入資料的許可權 --><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
讀SD卡,在4.0之前不需要許可權,4.0之後可以設定為需要,如果設定了需要許可權
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
從Android源碼中尋找擷取SD卡剩餘容量的代碼
匯入Settings項目
尋找“可用空間”得到
<string name="memory_available" msgid="418542433817289474">"可用空間"</string>
尋找"memory_available",得到
<Preference android:key="memory_sd_avail" style="?android:attr/preferenceInformationStyle" android:title="@string/memory_available" android:summary="00"/>
尋找"memory_sd_avail",得到
// 這個字串就是SD卡剩餘容量formatSize(availableBlocks * blockSize) + readOnly// 這兩個參數相乘,得到SD卡以位元組為單位的剩餘容量availableBlocks * blockSize
存放裝置會被分為若干個區塊,每個區塊有固定的大小
區塊大小 * 區塊數量 等於 存放裝置的總大小
檔案存取權限
在Android系統中,每一個應用,都是一個獨立的使用者
檔案的存取權限指的是誰能訪問這個檔案(夾),使用這10個字母來表示:drwxrwxrwx
第一個字母:
d:表示檔案夾
-:表示檔案
第一組rwx:表示的是檔案擁有者(owner)對該檔案的許可權
r:read,讀
w:write,寫
x:execute,執行
第二組rwx:表示的是跟檔案擁有者屬於同一使用者組(group)的使用者對該檔案的許可權
第三組rwx:表示的是其他使用者(other)對該檔案的許可權
SharedPreference
SharedPreference非常適合用來儲存零散的簡單資料,主要用來儲存應用程式的各種配置資訊
往SharedPreference裡寫資料
SharedPreferences sp = getSharedPreferences("config", MODE_PRIVATE);// 拿到一個SharedPreference對象Editor ed = sp.edit(); // 拿到編輯器ed.putString("name", "eniac"); // 寫資料ed.commit();
從SharedPreference裡取資料
SharedPreferences sp = getSharedPreferences("config", MODE_PRIVATE); // 拿到一個SharedPreference對象String name = sp.getString("name", ""); // 從SharedPreference裡取資料
產生xml檔案備份簡訊
建立幾個虛擬簡訊對象,存在list中
備份資料通常都是備份至SD卡
使用StringBuffer拼接字串
把整個xml檔案所有節點append到sb對象裡
sb.append("<?xml version=‘1.0‘ encoding=‘utf-8‘ standalone=‘yes‘ ?>");sb.append("<smss>"); // 添加smss的開始節點.......
把sb寫到輸出資料流中
fos.write(sb.toString().getBytes());
使用xml序列化器產生xml檔案
得到xml序列化器對象
XmlSerializer xs = Xml.newSerializer();
給序列化器設定輸出資料流
File file = new File(Environment.getExternalStorageDirectory(), "backupsms.xml");FileOutputStream fos = new FileOutputStream(file);xs.setOutput(fos, "utf-8"); // 給序列化器指定好輸出資料流
開始產生xml檔案
xs.startDocument("utf-8", true);xs.startTag(null, "smss");......
pull解析xml檔案
原始xml資源一般儲存在/res/xml/路徑下
先自己寫一個weather.xml檔案,存一些天氣資訊
根據xml資源的id擷取解析該資源的解析器
XmlPullParser xp = getResources().getXml(R.xml.weather);
開始解析
拿到指標所在當前節點的事件類型
int type = xp.getEventType();
事件類型主要有五種
START_DOCUMENT:xml頭的事件類型
END_DOCUMENT:xml尾的事件類型
START_TAG:開始節點的事件類型
END_TAG:結束節點的事件類型
TEXT:文本節點的事件類型
如果擷取到的事件類型不是END_DOCUMENT,就說明解析還沒有完成,如果是,解析完成,while迴圈結束
while(type != XmlPullParser.END_DOCUMENT)
當我們解析到不同節點時,需要進行不同的操作,所以判斷一下當前節點的name
當解析到weather的開始節點時,new出list
當解析到city的開始節點時,建立city對象,建立對象是為了更方便的儲存即將解析到的文本
當解析到name開始節點時,擷取下一個節點的常值內容,temp、pm也是一樣
case XmlPullParser.START_TAG://擷取當前節點的名字 if("weather".equals(xp.getName())){ citys = new ArrayList<City>(); } else if("city".equals(xp.getName())){ city = new City(); } else if("name".equals(xp.getName())){ //擷取當前節點的下一個節點的文本 String name = xp.nextText(); city.setName(name); } else if("temp".equals(xp.getName())){ String temp = xp.nextText(); city.setTemp(temp); } else if("pm".equals(xp.getName())){ String pm = xp.nextText(); city.setPm(pm); } break;
當解析到city的結束節點時,說明city的三個子節點已經全部解析完了,把city對象添加至list
case XmlPullParser.END_TAG: if("city".equals(xp.getName())){ citys.add(city);}
Android應用開發-資料存放區和介面展現(一)(重製版)