1. 程式人生 > >android studio工程以及檔案解析

android studio工程以及檔案解析

1、資料夾功能

主要如下圖所示:

生成的R.java的檔案在這個地方

F:\MyApplication\app\build\generated\source\r\debug\com\goodix\myapplication

PS:說到這個res目錄,另外還有提下這個assets目錄,雖然這裡沒有,但是我們可以自己建立,兩者的區別在於是否前者下所有的資原始檔都會在R.java檔案下生成對應的資源id,而後者並不會;前者我們可以直接通過資源id訪問到對應的資源;而後者則需要我們通過AssetManager以二進位制流的形式來讀取!對了,這個R檔案可以理解為字典,res下每個資源都都會在這裡生成一個唯一的id!

接著說下res這個資源目錄下的相關目錄:

PS:下述mipmap的目錄,在Eclipse並不存在這個,Eclipse中都是drawable開頭的,其實區別不大,只是使用mipmap會在圖片縮放在提供一定的效能優化,解析度不同系統會根據螢幕解析度來選擇hdpi,mdpi,xmdpi,xxhdpi下的對應圖片,所以你解壓別人的apk可以看到上述目錄同一名稱的圖片,在四個資料夾下都有,只是大小和畫素不一樣而已!當然,這也不是絕對的,比如我們把所有的圖片都丟在了drawable-hdpi下的話,即使手機 本該載入ldpi資料夾下的圖片資源,但是ldpi下沒有,那麼載入的還會是hdpi下的圖片! 另外,還有一種情況:比如是hdpi,mdpi目錄下有,ldpi下沒有,那麼會載入mdpi中的資源! 原則是使用最接近的密度級別!另外如果你想禁止Android不跟隨螢幕密度載入不同資料夾的資源,只需在AndroidManifest.xml檔案中新增android:anyDensity="false"欄位即可!

1.先說下圖片資源:

  • drawable:存放各種點陣圖檔案,(.png,.jpg,.9png,.gif等)除此之外可能是一些其他的drawable型別的XML檔案
  • mipmap-hdpi:高解析度,一般我們把圖片丟這裡
  • mipmap-mdpi:中等解析度,很少,除非相容的的手機很舊
  • mipmap-xhdpi:超高解析度,手機螢幕材質越來越好,以後估計會慢慢往這裡過渡
  • mipmap-xxhdpi:超超高解析度,這個在高階機上有所體現

2.接著說下佈局資源:

  • layout:該目錄下存放的就是我們的佈局檔案,另外在一些特定的機型上,我們做螢幕適配,比如480*320這樣的手機,我們會另外建立一套佈局,就行:layout-480x320這樣的資料夾!

3.接下來說下選單資源:

  • menu:在以前有物理選單按鈕,即menu鍵的手機上,用的較多,現在用的並不多,選單項相關的資源xml可在這裡編寫,不知道谷歌會不會出新的東西來替代選單了~

4.接下來說下values目錄:

  • demens.xml:定義尺寸資源
  • string.xml:定義字串資源
  • styles.xml:定義樣式資源
  • colors.xml:定義顏色資源
  • arrays.xml:定義陣列資源
  • attrs.xml:自定義控制元件時用的較多,自定義控制元件的屬性!
  • theme主題檔案,和styles很相似,但是會對整個應用中的Actvitiy或指定Activity起作用,一般是改變視窗外觀的!可在Java程式碼中通過setTheme使用,或者在Androidmanifest.xml中為<application...>新增theme的屬性! PS:你可能看到過這樣的values目錄:values-w820dp,values-v11等,前者w代表平板裝置,820dp代表螢幕寬度;而v11這樣代表在API(11),即android 3.0後才會用到的!

5.在接著說下這個raw目錄: 用於存放各種原生資源(音訊,視訊,一些XML檔案等),我們可以通過openRawResource(int id)來獲得資源的二進位制流!其實和Assets差不多,不過這裡面的資源會在R檔案那裡生成一個資源id而已

6.最後還有個動畫的,動畫有兩種:屬性動畫和補間動畫:

  • animator:存放屬性動畫的XML檔案
  • anim:存放補間動畫的XML檔案

2、如何去訪問資源

嗯,知道有什麼資源,接下來就來了解該怎麼用了: 前面也說了,我們所有的資原始檔都會在R.java檔案下生成一個資源id,我們可以通過這個資源id來完成資源的訪問,使用情況有兩種:Java程式碼中使用和XML程式碼中使用。

Java程式碼中使用:

Java 文字:

txtName.setText(getResources().getText(R.string.name));

圖片:

imgIcon.setBackgroundDrawableResource(R.drawable.icon);

顏色:

txtName.setTextColor(getResouces().getColor(R.color.red));

佈局:

setContentView(R.layout.main);

控制元件:

txtName =(TextView)findViewById(R.id.txt_name);

XML程式碼中使用:

通過@xxx即可得到,比如這裡獲取文字和圖片:

<TextViewandroid:text="@string/hello_world"android:layout_width="wrap_content"android:layout_height="wrap_content"android:background="@drawable/img_back"/>

3、深入瞭解三大檔案


MainActivity.java的程式碼如下,這裡說說關鍵字extends

package com.example.huiyuan.myapplication;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
}

1.Java中使用extends關鍵字實現類的整合機制

2.通過繼承子類自動擁有了基類(superclass)的所有成員(成員變數和成員方法)

3.Java只支援單繼承

4.一個子類只能有一個基類,一個基類可以派生出多個子類

程式碼分析:



緊接著是頁面佈局檔案這裡是activity_main.xml檔案。

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/LinearLayout1"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:orientation ="vertical"
    tools:context="com.example.huiyuan.myapplication.MainActivity">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!" />
</RelativeLayout>
具體的意義如下所示:


然後是AndroidMainfest.xml檔案,可以由如下實現。
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.huiyuan.myapplication"
    android:revisionCode="1" android:versionName="1.0">
<uses-sdk android:minSdkVersion="8" android:targetSdkVersion="21"/>
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

具體如下所示:

程式碼分析:


實際上xml還是一門技術活啊!這就涉及到UI了,還是比較麻煩的。先記下來,後面有空的時候再研究

①如果app包含其他元件的話,都要使用型別說明語法在該檔案中進行宣告 Server:元素 BroadcastReceiver元素 ContentProvider元素 IntentFilter<intent-filter>元素

②許可權的宣告: 在該檔案中顯式地宣告程式需要的許可權,防止app錯誤地使用服務, 不恰當地訪問 資源,最終提高android app的健壯性 android.permission.SEND_SMS 有這句話表示app需要使用傳送資訊的許可權,安裝的時候就會提示使用者, 相關許可權可以在sdk參考手冊查詢!