日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

数据存储和界面展示

發(fā)布時(shí)間:2025/4/16 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数据存储和界面展示 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

常見布局

線性布局

  • 有一個(gè)布局方向,水平或者豎直
  • 在豎直布局下,左對(duì)齊、右對(duì)齊,水平居中生效
  • 在水平布局下,頂部對(duì)齊、底部對(duì)齊、豎直居中生效
  • 權(quán)重:按比例分配屏幕的剩余寬度或者高度

相對(duì)布局

  • 組件默認(rèn)位置都是左上角,組件之間可以重疊
  • 可以相對(duì)于父元素上下左右對(duì)齊,相對(duì)于父元素,水平居中、豎直居中、水平豎直同時(shí)居中
  • 可以相對(duì)于其他組件上下左右對(duì)齊
  • 可以布局于其他組件的上方、下方、左邊、右邊

幀布局

  • 組件默認(rèn)位置都是左上角,組件之間可以重疊
  • 可以設(shè)置上下左右對(duì)齊,水平豎直居中,設(shè)置方式與線性布局一樣

表格布局

  • 每有一個(gè)TableRow子節(jié)點(diǎn)表示一行,該子節(jié)點(diǎn)的每一個(gè)子節(jié)點(diǎn)都表示一列
  • TableLayout的一級(jí)子節(jié)點(diǎn)默認(rèn)寬都是匹配父元素
  • TableRow的子節(jié)點(diǎn)默認(rèn)寬高都是包裹內(nèi)容

Logcat

等級(jí)

  • verbose:冗余,最低等級(jí)
  • debug:調(diào)試
  • info:正常等級(jí)的信息
  • warn:警告
  • error:錯(cuò)誤

Android的存儲(chǔ)

內(nèi)部存儲(chǔ)空間

  • RAM內(nèi)存:運(yùn)行內(nèi)存,相當(dāng)于電腦的內(nèi)存
  • ROM內(nèi)存:存儲(chǔ)內(nèi)存,相當(dāng)于電腦的硬盤

外部存儲(chǔ)空間

  • SD卡:相當(dāng)于電腦的移動(dòng)硬盤

    • 2.2之前,sd卡路徑:sdcard
    • 4.3之前,sd卡路徑:mnt/sdcard
    • 4.3開始,sd卡路徑:storage/sdcard
  • 所有存儲(chǔ)設(shè)備,都會(huì)被劃分成若干個(gè)區(qū)塊,每個(gè)區(qū)塊有固定的大小

  • 存儲(chǔ)設(shè)備的總大小 = 區(qū)塊大小 * 區(qū)塊數(shù)量

文件訪問權(quán)限

  • 指的是誰能訪問這個(gè)文件
  • 在Android中,每一個(gè)應(yīng)用,都是一個(gè)獨(dú)立的用戶
  • 使用10個(gè)字母表示
  • drwxrwxrwx
  • 第一個(gè)字母:
    • d:表示文件夾
    • -:表示文件
  • 第一組rwx:表示的是文件擁有者(owner)對(duì)文件的權(quán)限
    • r:read,讀
    • w:write
    • x:execute
  • 第二組rwx:表示的是跟文件擁有者屬于同一用戶組的用戶(grouper)對(duì)文件的權(quán)限
  • 第三組rwx:表示的其他用戶(other)對(duì)文件的權(quán)限

SharedPreference

  • 非常適合用來保存零散的簡(jiǎn)單的數(shù)據(jù)

常見布局

相對(duì)布局

RelativeLayout
  • 組件默認(rèn)左對(duì)齊、頂部對(duì)齊
  • 設(shè)置組件在指定組件的右邊

    android:layout_toRightOf="@id/tv1"
  • 設(shè)置在指定組件的下邊

    android:layout_below="@id/tv1"
  • 設(shè)置右對(duì)齊父元素

    android:layout_alignParentRight="true"
  • 設(shè)置與指定組件右對(duì)齊

    android:layout_alignRight="@id/tv1"

線性布局

LinearLayout
  • 指定各個(gè)節(jié)點(diǎn)的排列方向

    android:orientation="horizontal"
  • 設(shè)置右對(duì)齊

    android:layout_gravity="right"
  • 當(dāng)豎直布局時(shí),只能左右對(duì)齊和水平居中,頂部底部對(duì)齊豎直居中無效
  • 當(dāng)水平布局時(shí),只能頂部底部對(duì)齊和豎直居中
  • 使用match_parent時(shí)注意不要把其他組件頂出去
  • 線性布局非常重要的一個(gè)屬性:權(quán)重

    android:layout_weight="1"
  • 權(quán)重設(shè)置的是按比例分配剩余的空間

幀布局

FrameLayout
  • 默認(rèn)組件都是左對(duì)齊和頂部對(duì)齊,每個(gè)組件相當(dāng)于一個(gè)div
  • 可以更改對(duì)齊方式

    android:layout_gravity="bottom"
  • 不能相對(duì)于其他組件布局

表格布局

TableLayout
  • 每個(gè)節(jié)點(diǎn)是一行,它的每個(gè)子節(jié)點(diǎn)是一列
  • 表格布局中的節(jié)點(diǎn)可以不設(shè)置寬高,因?yàn)樵O(shè)置了也無效

    • 根節(jié)點(diǎn)的子節(jié)點(diǎn)寬為匹配父元素,高為包裹內(nèi)容
    • 節(jié)點(diǎn)的子節(jié)點(diǎn)寬為包裹內(nèi)容,高為包裹內(nèi)容
    • 以上默認(rèn)屬性無法修改
  • 根節(jié)點(diǎn)中可以設(shè)置以下屬性,表示讓第1列拉伸填滿屏幕寬度的剩余空間

    android:stretchColumns="1"

絕對(duì)布局

AbsoluteLayout
  • 直接指定組件的x、y坐標(biāo)

    android:layout_x="144dp" android:layout_y="154dp"

logcat

  • 日志信息總共分為5個(gè)等級(jí)
    • verbose
    • debug
    • info
    • warn
    • error
  • 定義過濾器方便查看
  • System.out.print輸出的日志級(jí)別是info,tag是System.out
  • Android提供的日志輸出api

    Log.v(TAG, "加油吧,童鞋們"); Log.d(TAG, "加油吧,童鞋們"); Log.i(TAG, "加油吧,童鞋們"); Log.w(TAG, "加油吧,童鞋們"); Log.e(TAG, "加油吧,童鞋們");

文件讀寫操作

  • Ram內(nèi)存:運(yùn)行內(nèi)存,相當(dāng)于電腦的內(nèi)存
  • Rom內(nèi)存:內(nèi)部存儲(chǔ)空間,相當(dāng)于電腦的硬盤
  • sd卡:外部存儲(chǔ)空間,相當(dāng)于電腦的移動(dòng)硬盤

在內(nèi)部存儲(chǔ)空間中讀寫文件

小案例:用戶輸入賬號(hào)密碼,勾選“記住賬號(hào)密碼”,點(diǎn)擊登錄按鈕,登錄的同時(shí)持久化保存賬號(hào)和密碼

1. 定義布局
2. 完成按鈕的點(diǎn)擊事件
  • 彈土司提示用戶登錄成功

    Toast.makeText(this, "登錄成功", Toast.LENGTH_SHORT).show();
3. 拿到用戶輸入的數(shù)據(jù)
  • 判斷用戶是否勾選保存賬號(hào)密碼

    CheckBox cb = (CheckBox) findViewById(R.id.cb); if(cb.isChecked()){}
4. 開啟io流把文件寫入內(nèi)部存儲(chǔ)
  • 直接開啟文件輸出流寫數(shù)據(jù)

    //持久化保存數(shù)據(jù)File file = new File("data/data/com.itheima.rwinrom/info.txt");FileOutputStream fos = new FileOutputStream(file);fos.write((name + "##" + pass).getBytes());fos.close();
  • 讀取數(shù)據(jù)前先檢測(cè)文件是否存在

    if(file.exists())
  • 讀取保存的數(shù)據(jù),也是直接開文件輸入流讀取

    File file = new File("data/data/com.itheima.rwinrom/info.txt"); FileInputStream fis = new FileInputStream(file); //把字節(jié)流轉(zhuǎn)換成字符流 BufferedReader br = new BufferedReader(new InputStreamReader(fis)); String text = br.readLine(); String[] s = text.split("##");
  • 讀取到數(shù)據(jù)之后,回顯至輸入框

    et_name.setText(s[0]); et_pass.setText(s[1]);
  • 應(yīng)用只能在自己的包名目錄下創(chuàng)建文件,不能到別人家去創(chuàng)建

直接復(fù)制項(xiàng)目

  • 需要改動(dòng)的地方:
    • 項(xiàng)目名字
    • 應(yīng)用包名
    • R文件重新導(dǎo)包

使用路徑api讀寫文件

  • getFilesDir()得到的file對(duì)象的路徑是data/data/com.itheima.rwinrom2/files
    • 存放在這個(gè)路徑下的文件,只要你不刪,它就一直在
  • getCacheDir()得到的file對(duì)象的路徑是data/data/com.itheima.rwinrom2/cache

    • 存放在這個(gè)路徑下的文件,當(dāng)內(nèi)存不足時(shí),有可能被刪除
  • 系統(tǒng)管理應(yīng)用界面的清除緩存,會(huì)清除cache文件夾下的東西,清除數(shù)據(jù),會(huì)清除整個(gè)包名目錄下的東西


在外部存儲(chǔ)讀寫數(shù)據(jù)

sd卡的路徑

  • sdcard:2.3之前的sd卡路徑
  • mnt/sdcard:4.3之前的sd卡路徑
  • storage/sdcard:4.3之后的sd卡路徑

  • 最簡(jiǎn)單的打開sd卡的方式

    File file = new File("sdcard/info.txt");
  • 寫sd卡需要權(quán)限

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
  • 讀sd卡,在4.0之前不需要權(quán)限,4.0之后可以設(shè)置為需要

    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
  • 使用api獲得sd卡的真實(shí)路徑,部分手機(jī)品牌會(huì)更改sd卡的路徑

    Environment.getExternalStorageDirectory()
  • 判斷sd卡是否準(zhǔn)備就緒

    if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED))

查看源代碼查找獲取sd卡剩余容量的代碼

  • 導(dǎo)入Settings項(xiàng)目
  • 查找“可用空間”得到

    <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”,得到

    //這個(gè)字符串就是sd卡剩余容量 formatSize(availableBlocks * blockSize) + readOnly //這兩個(gè)參數(shù)相乘,得到sd卡以字節(jié)為單位的剩余容量 availableBlocks * blockSize
  • 存儲(chǔ)設(shè)備會(huì)被分為若干個(gè)區(qū)塊,每個(gè)區(qū)塊有固定的大小

  • 區(qū)塊大小 * 區(qū)塊數(shù)量 等于 存儲(chǔ)設(shè)備的總大小

Linux文件的訪問權(quán)限

  • 在Android中,每一個(gè)應(yīng)用是一個(gè)獨(dú)立的用戶
  • drwxrwxrwx
  • 第1位:d表示文件夾,-表示文件
  • 第2-4位:rwx,表示這個(gè)文件的擁有者用戶(owner)對(duì)該文件的權(quán)限
    • r:讀
    • w:寫
    • x:執(zhí)行
  • 第5-7位:rwx,表示跟文件擁有者用戶同組的用戶(grouper)對(duì)該文件的權(quán)限
  • 第8-10位:rwx,表示其他用戶組的用戶(other)對(duì)該文件的權(quán)限

openFileOutput的四種模式

  • MODE_PRIVATE:-rw-rw—-
  • MODE_APPEND:-rw-rw—-
  • MODE_WORLD_WRITEABLE:-rw-rw–w-
  • MODE_WORLD_READABLE:-rw-rw-r–

SharedPreference

用SharedPreference存儲(chǔ)賬號(hào)密碼

  • 往SharedPreference里寫數(shù)據(jù)

    //拿到一個(gè)SharedPreference對(duì)象 SharedPreferences sp = getSharedPreferences("config", MODE_PRIVATE); //拿到編輯器 Editor ed = sp.edit(); //寫數(shù)據(jù) ed.putBoolean("name", name); ed.commit();
  • 從SharedPreference里取數(shù)據(jù)

    SharedPreferences sp = getSharedPreferences("config", MODE_PRIVATE); //從SharedPreference里取數(shù)據(jù) String name = sp.getBoolean("name", "");

生成XML文件備份短信

  • 創(chuàng)建幾個(gè)虛擬的短信對(duì)象,存在list中
  • 備份數(shù)據(jù)通常都是備份至sd卡

使用StringBuffer拼接字符串

  • 把整個(gè)xml文件所有節(jié)點(diǎn)append到sb對(duì)象里

    sb.append("<?xml version='1.0' encoding='utf-8' standalone='yes' ?>"); //添加smss的開始節(jié)點(diǎn) sb.append("<smss>"); .......
  • 把sb寫到輸出流中

    fos.write(sb.toString().getBytes());

使用XMl序列化器生成xml文件

  • 得到xml序列化器對(duì)象

    XmlSerializer xs = Xml.newSerializer();
  • 給序列化器設(shè)置輸出流

    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文件

  • 先自己寫一個(gè)xml文件,存一些天氣信息

拿到xml文件

InputStream is = getClassLoader().getResourceAsStream("weather.xml");

拿到pull解析器

XmlPullParser xp = Xml.newPullParser();

開始解析

  • 拿到指針?biāo)诋?dāng)前節(jié)點(diǎn)的事件類型

    int type = xp.getEventType();
  • 事件類型主要有五種

    • START_DOCUMENT:xml頭的事件類型
    • END_DOCUMENT:xml尾的事件類型
    • START_TAG:開始節(jié)點(diǎn)的事件類型
    • END_TAG:結(jié)束節(jié)點(diǎn)的事件類型
    • TEXT:文本節(jié)點(diǎn)的事件類型
  • 如果獲取到的事件類型不是END_DOCUMENT,就說明解析還沒有完成,如果是,解析完成,while循環(huán)結(jié)束

    while(type != XmlPullParser.END_DOCUMENT)
  • 當(dāng)我們解析到不同節(jié)點(diǎn)時(shí),需要進(jìn)行不同的操作,所以判斷一下當(dāng)前節(jié)點(diǎn)的name

    • 當(dāng)解析到weather的開始節(jié)點(diǎn)時(shí),new出list
    • 當(dāng)解析到city的開始節(jié)點(diǎn)時(shí),創(chuàng)建city對(duì)象,創(chuàng)建對(duì)象是為了更方便的保存即將解析到的文本
    • 當(dāng)解析到name開始節(jié)點(diǎn)時(shí),獲取下一個(gè)節(jié)點(diǎn)的文本內(nèi)容,temp、pm也是一樣

      case XmlPullParser.START_TAG: //獲取當(dāng)前節(jié)點(diǎn)的名字if("weather".equals(xp.getName())){citys = new ArrayList<City>();}else if("city".equals(xp.getName())){city = new City();}else if("name".equals(xp.getName())){//獲取當(dāng)前節(jié)點(diǎn)的下一個(gè)節(jié)點(diǎn)的文本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;
  • 當(dāng)解析到city的結(jié)束節(jié)點(diǎn)時(shí),說明city的三個(gè)子節(jié)點(diǎn)已經(jīng)全部解析完了,把city對(duì)象添加至list

    case XmlPullParser.END_TAG:if("city".equals(xp.getName())){citys.add(city);}

總結(jié)

以上是生活随笔為你收集整理的数据存储和界面展示的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。