Android應用開發-資料存放區和介面展現(一)(重製版)

來源:互聯網
上載者:User

標籤:

 

常見布局

 

相對布局(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應用開發-資料存放區和介面展現(一)(重製版)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.