Android應(yīng)用開發(fā)的一般文件組織結(jié)構(gòu)講解
認(rèn)識(shí)Android編程各個(gè)文件之間的聯(lián)系和使用方法,以及認(rèn)識(shí)Activity文件結(jié)構(gòu)的大體可以看下圖:
代碼在src中的.java文件中編輯,gen目錄下有一個(gè)R.java的文件,這個(gè)文件存儲(chǔ)res目錄下各種資源文件的id號(hào),在主文件java中調(diào)用該資源的時(shí)候直接調(diào)用id號(hào)即可,如 R.layout.main ,這個(gè)條目得打開R.java文件中查看,"R"對(duì)應(yīng)R.java文件,"layout"對(duì)應(yīng)R.java文件中的layout類,"main"對(duì)應(yīng)layout類中的一個(gè)靜態(tài)常量聲明。
實(shí)際上res中的每一個(gè)文件都會(huì)在R.java中自動(dòng)產(chǎn)生靜態(tài)常量,這是res目錄和assets目錄最大的不同之處,這樣做的好處不言而喻,對(duì)資源的修改不會(huì)對(duì)代碼產(chǎn)生任何的影響,因?yàn)榇a中使用的只是ID號(hào)碼而已。
res目錄中的前三個(gè)文件夾是存放圖片資源的,而且通常情況下同一張圖片要有三個(gè)版本二,高低中分辨率。
第四個(gè)文件夾是存放布局文件的,main.xml,一個(gè)Activity對(duì)應(yīng)一個(gè)xml文件,而且每個(gè)Activity都要在AndroidMainfest.xml中注冊(cè)一下。default.properties文件在學(xué)java的時(shí)候接觸過(guò),無(wú)非也是對(duì)對(duì)代碼的可重復(fù)性使用和修改提供了方便而已。第一個(gè)Java Activity程序,會(huì)體現(xiàn)出這些文件之間的關(guān)系和使用。
下面程序任務(wù):添加一個(gè)顯示文本和一個(gè)按鈕
對(duì)Activity的初步認(rèn)識(shí):就像一個(gè)窗口,能顯示信息,又像一個(gè)容器,能容納功能空間,如button,在程序角度上看,又像一個(gè) 類,可以和其他的類(Activity)發(fā)生聯(lián)系。
創(chuàng)建Activity的要點(diǎn):
一個(gè)Activity就是一個(gè)類,類名隨意起,不過(guò)必須繼承Activity這個(gè)父類。
需要復(fù)寫onCreate()方法
每一個(gè)Activity都應(yīng)該在AndroidManifest.xml文件中進(jìn)行配置
為Activity添加必要的控件
整體文件代碼預(yù)覽:
MyActivity.java 文件
package geeker.MyActivity; import android.app.Activity; import android.os.Bundle; import android.widget.Button; import android.widget.TextView; public class MyActivity extends Activity { //成員變量的聲明 private TextView myTextView = null; private Button myButton = null; //重寫OnCreate方法,會(huì)自動(dòng)生成 public void onCreate(Bundle savedInstanceState) { //調(diào)用父類方法,該句代碼自動(dòng)生成 super.onCreate(savedInstanceState); //通過(guò)布局文件的id調(diào)用該Activity所使用的布局文件 setContentView(R.layout.main); //通過(guò)findViewById()方法拿到布局文件中添加的控件 //不過(guò)在布局文件中添加控件的時(shí)候必須定義id號(hào), //如:android:id="@+id/myTextView" myTextView = (TextView)findViewById(R.id.myTextView); myButton = (Button)findViewById(R.id.myButton); //向控件上制定顯示文字 myTextView.setText("This is my first Activity !"); myButton.setText("MY FIRST BUTTON"); } }
main.xml 文件
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <TextView android:id="@+id/myTextView" android:layout_width="fill_parent" android:layout_height="wrap_content" /> <Button android:id="@+id/myButton" android:layout_width="fill_parent" android:layout_height="wrap_content" /> </LinearLayout>
R.jar 文件該文件自動(dòng)生成,不要自己改動(dòng)
/* AUTO-GENERATED FILE. DO NOT MODIFY. * * This class was automatically generated by the * aapt tool from the resource data it found. It * should not be modified by hand. */ package geeker.MyActivity; public final class R { public static final class attr { } public static final class drawable { public static final int icon=0x7f020000; } public static final class id { public static final int myButton=0x7f050001; public static final int myTextView=0x7f050000; } public static final class layout { public static final int main=0x7f030000; } public static final class string { public static final int app_name=0x7f040001; public static final int hello=0x7f040000; } }
其實(shí)走一遍添加Button的流程就明白各個(gè)文件間的聯(lián)系了:
1. 先打開main.xml文件,加一個(gè)button按鈕的布局
<Button android:id="@+id/myButton" android:layout_width="fill_parent" android:layout_height="wrap_content" />
2. 其實(shí)上一步完成后,編譯運(yùn)行已經(jīng)能看到一個(gè)Button按鈕了,但是我想在按鈕上添加文字以說(shuō)明該按鈕的作用,在java中的程序?yàn)?:
Button bt = new Button();
bt.setText("MY FIRST BUTTON");
那么在Android程序中如何在.java源文件中拿到剛才在main.xml中添加的控件呢?
基于這個(gè)目的,在main.xml文件中加了此句:android:id="@+id/myButton",這一句使得R.java文件中多了一個(gè)叫id的類,該控件的id號(hào)就在這個(gè)類中出現(xiàn)了,這樣做為了方便.java文件中的調(diào)用。
實(shí)際上如果不加上一句,該控件是不會(huì)在R.java文件中產(chǎn)生id號(hào)碼的,因?yàn)橹挥性趓es目錄中添加文件才會(huì)自動(dòng)在R.java中產(chǎn)生id號(hào),而添加一個(gè)控件只是在一個(gè)資源文件中做修改而已,所以不會(huì)自動(dòng)產(chǎn)生id號(hào)。
我們可以看一下R.java文件中自動(dòng)產(chǎn)生的ID代碼:
public static final class id { public static final int myButton=0x7f050001; public static final int myTextView=0x7f050000; }
然后在.java文件中就可通過(guò)getViewById()方法拿到控件了。
拿到控件之后就可以像java程序中一樣進(jìn)行相關(guān)操作了,代碼如:
private Button myButton = null; myButton = (Button)findViewById(R.id.myButton); myButton.setText("MY FIRST BUTTON");
實(shí)際上這個(gè)流程只體現(xiàn)了xml文件和R.java文件之間的聯(lián)系(通過(guò)該句:android:id="@+id/myButton),以及.java與R.java之間的聯(lián)系(通過(guò)該句:findViewById(R.id.myTextView) )。補(bǔ)充一下其他文件關(guān)系的代碼體現(xiàn):
MyActivity.java文件與Main.xml文件的聯(lián)系時(shí)通過(guò)MyActivity.java文件中的setContentView(R.layout.main);體現(xiàn)的,因?yàn)橐粋€(gè)Activity文件要對(duì)應(yīng)一個(gè)布局文件。
MyActivity.java文件與AndroidManifest.xml文件之間的聯(lián)系時(shí)通過(guò)AndroidManifest.xml文件中的。
<activity android:name=".MyActivity" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity>
來(lái)體現(xiàn)的,這也說(shuō)明了Activity創(chuàng)建的關(guān)鍵點(diǎn)之一:每一個(gè)Activity都應(yīng)該在AndroidManifest.xml文件中進(jìn)行配置。
PS:獲取Android的文件列表的方法
有的時(shí)候我們的程序需要去對(duì)android的指定目錄或者全局目錄進(jìn)行遍歷獲取其中的文件,但是獲取文件的時(shí)候可能會(huì)遇到無(wú)法列出文件夾中的文件的問(wèn)題,這就是我出現(xiàn)的問(wèn)題,對(duì)于某個(gè)子文件夾進(jìn)行獲取listFiles()的時(shí)候返回為NULL,也就是不允許列出文件夾中內(nèi)容。這個(gè)是由于android中的安全機(jī)制的緣故,由于android繼承了Linux系統(tǒng)的傳統(tǒng),對(duì)于某個(gè)特定的目錄有用戶的權(quán)限,一共分為三種--可讀,可寫,可執(zhí)行;雖然說(shuō)我們可以設(shè)置某個(gè)特定的目錄的權(quán)限,但是對(duì)于目錄里面的子目錄和子文件都可以進(jìn)行權(quán)限的設(shè)置,也就是說(shuō)出了根目錄權(quán)限之外,子目錄本身的權(quán)限也決定了子目錄可否訪問(wèn),這一點(diǎn)我們需要清楚了解,所以我們?cè)谂袛嗤炅耸欠袷悄夸浿?,我們還需要在進(jìn)行l(wèi)istFiles()獲取File[]數(shù)據(jù)后判斷獲取的數(shù)組是否為空,如果為空的話,文件夾是不可訪問(wèn)的。樣例代碼如下:
package net.nowamagic.file; import java.io.File; import java.util.ArrayList; import java.util.HashMap; import java.util.Map; import android.util.Log; /** * @author * function 用于掃描SD卡上的文件 * */ public class FileScan { private static final String TAG = "FileScan"; public HashMap<String, String> getMusicListOnSys(File file) { //從根目錄開始掃描 Log.i(TAG, file.getPath()); HashMap<String, String> fileList = new HashMap<String, String>(); getFileList(file, fileList); return fileList; } /** * @param path * @param fileList * 注意的是并不是所有的文件夾都可以進(jìn)行讀取的,權(quán)限問(wèn)題 */ private void getFileList(File path, HashMap<String, String> fileList){ //如果是文件夾的話 if(path.isDirectory()){ //返回文件夾中有的數(shù)據(jù) File[] files = path.listFiles(); //先判斷下有沒(méi)有權(quán)限,如果沒(méi)有權(quán)限的話,就不執(zhí)行了 if(null == files) return; for(int i = 0; i < files.length; i++){ getFileList(files[i], fileList); } } //如果是文件的話直接加入 else{ Log.i(TAG, path.getAbsolutePath()); //進(jìn)行文件的處理 String filePath = path.getAbsolutePath(); //文件名 String fileName = filePath.substring(filePath.lastIndexOf("/")+1); //添加 fileList.put(fileName, filePath); } } }
- Android項(xiàng)目基本結(jié)構(gòu)詳解
- 深入解讀Android的Volley庫(kù)的功能結(jié)構(gòu)
- 淺析Android系統(tǒng)的架構(gòu)以及程序項(xiàng)目的目錄結(jié)構(gòu)
- 淺談Android開發(fā)中項(xiàng)目的文件結(jié)構(gòu)及規(guī)范化部署建議
- 淺談Android系統(tǒng)的基本體系結(jié)構(gòu)與內(nèi)存管理優(yōu)化
- Android編程入門之HelloWorld項(xiàng)目目錄結(jié)構(gòu)分析
- Android源碼中的目錄結(jié)構(gòu)詳解
- Android程序結(jié)構(gòu)簡(jiǎn)單講解
相關(guān)文章
Spring?Boot?+?Spring?Batch?實(shí)現(xiàn)批處理任務(wù)的詳細(xì)教程
這篇文章主要介紹了Spring?Boot+Spring?Batch實(shí)現(xiàn)批處理任務(wù),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-08-08Java語(yǔ)言實(shí)現(xiàn)反轉(zhuǎn)鏈表代碼示例
這篇文章主要介紹了Java語(yǔ)言實(shí)現(xiàn)反轉(zhuǎn)鏈表代碼示例,小編覺(jué)得挺不錯(cuò)的,這里分享給大家,供需要的朋友參考。2017-10-10IDEA插件Statistic統(tǒng)計(jì)代碼快速分辨爛項(xiàng)目
這篇文章主要為大家介紹了使用IDEA插件Statistic來(lái)統(tǒng)計(jì)項(xiàng)目代碼,幫助大家快速識(shí)別出爛項(xiàng)目,有需要的朋友可以借鑒參考下,希望能夠有所幫助2022-01-01Java實(shí)現(xiàn)隨機(jī)出題,10道10以內(nèi)加減法計(jì)算代碼實(shí)例
這篇文章主要介紹了Java實(shí)現(xiàn)隨機(jī)出題,10道10以內(nèi)加減法計(jì)算,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04手把手教你用Java給暗戀對(duì)象發(fā)送一份表白郵件
隨著我們學(xué)習(xí)java的深入,也漸漸發(fā)現(xiàn)了它的一些樂(lè)趣,比如發(fā)送郵件,下面這篇文章主要給大家介紹了關(guān)于如何利用Java給暗戀對(duì)象發(fā)送一份表白郵件的相關(guān)資料,需要的朋友可以參考下2021-11-11java使用反射創(chuàng)建并操作對(duì)象的方法
這篇文章主要介紹了java使用反射創(chuàng)建并操作對(duì)象的方法,文中講解非常細(xì)致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下2020-06-06Java使用JDBC連接數(shù)據(jù)庫(kù)的詳細(xì)步驟
本文詳細(xì)講解了Java使用JDBC連接數(shù)據(jù)庫(kù)的詳細(xì)步驟,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-01-01SpringCloud Feign 服務(wù)調(diào)用的實(shí)現(xiàn)
Feign是一個(gè)聲明性web服務(wù)客戶端。本文記錄多個(gè)服務(wù)之間使用Feign調(diào)用,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-01-01