Android的資源引用(3)(Layout、Menu、Style、Them、Attribute、assets)
一、Layout資源時放在/res/layout/目錄下面,layout資源下面的根元素通常為佈局管理器,在每個佈局管理器中定義各種的view.
二、使用選單menu資源,資源時放在/res/menu/目錄下面,資源的根元素通常為<menu ...../>元素,其中menu的用法在,另一片有介紹menu的一些用法
三、樣式Style,該資源存放在/res/values/目錄下面,樣式資源的根元素通常為<resources......./>,該元素中可以包含多個<style....../>子元素,每一個<style.../>定義一個樣式。
<style...../>元素指定如下的兩個屬性。
name:樣式的名稱
parent:樣式繼承父樣式,該樣式繼承父樣式的全部定義,也可以覆蓋父樣式的指定格式
<style...../>包含多個<item..../>子元素。
如下:
<resources> <!-- Base application theme. --> <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> <!-- Customize your theme here. --> <item name="colorPrimary">@color/colorPrimary</item> <item name="colorPrimaryDark">@color/colorPrimaryDark</item> <item name="colorAccent">@color/colorAccent</item> </style> <style name="DefaultFontStyle"> <item name="android:textSize">29sp</item> <item name="android:textColor">#101010</item> </style> <style name="DefaultBackgroud" parent="DefaultFontStyle"> <item name="android:background">#3cf968</item> </style> <style name="DefaultStyle" parent="@style/DefaultBackgroud"> </style> <style name="TextViewFontStyle"> <item name="android:textSize">30sp</item> </style> <style name="ButtonDefault"> <item name="android:background">@drawable/pzb</item> <item name="android:focusable">true</item> <item name="android:clickable">true</item> <item name="android:layout_margin">20dp</item> </style> <style name="EditTextDefault"> <item name="android:background">@drawable/ps</item> <item name="android:textColor">#ec7272</item> <item name="android:layout_marginLeft">10dp</item> <item name="android:layout_marginRight">10dp</item> </style> <style name="ButtonChange"> <item name="android:background">@drawable/button_selector</item> <item name="android:layout_margin">20dp</item> </style> <style name="Button_gradient"> <item name="android:textSize">20sp</item> <item name="android:background">@drawable/button_selector_gradient</item> </style> </resources>
在佈局檔案中可已使用
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context="com.example.asus.styletheme.MainActivity"> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="測試andoid的style和theme" android:id="@+id/test_style" style="@style/TextViewFontStyle"/> <Button android:layout_width="30dp" android:layout_height="20dp" android:id="@+id/pz" style="@style/ButtonDefault"/> <EditText android:layout_width="match_parent" android:layout_height="37dp" android:id="@+id/edit_test" style="@style/EditTextDefault"/> <Button android:layout_width="50dp" android:layout_height="50dp" style="@style/ButtonChange" android:id="@+id/button_test"/> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/button_gradient" android:text="test" style="@style/Button_gradient"/> </LinearLayout>
效果圖
四、主題資源使用,主題資源通常也放在/res/values/目錄下面,主題資源的xml檔案同樣也是以<resource..../>作為根元素,同樣也是使用<style..../>元素來定義主題樣式。
主題和樣式的區別:
1、主題不能作用於單個的view元件上面,主題應該是對整個應用中的所有activity起作用,或者對指定的activity起作用。
2、主題定義的格式應該是改變外觀的格式,比如:視窗標題,視窗邊框
如:
<resources> <!-- Base application theme. --> <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> <!-- Customize your theme here. --> <item name="colorPrimary">@color/colorPrimary</item> <item name="colorPrimaryDark">@color/colorPrimaryDark</item> <item name="colorAccent">@color/colorAccent</item> </style> </resources>
使用:
<application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme"> <service android:name=".service.MyService"></service> <service android:name=".service.MyService1"></service> <service android:name=".service.ChangeService"></service> <receiver android:name=".SmsReceiver.SmsReceiver"> <intent-filter><action android:name="android.provider.Telephony.SMS_RECEIVED"/> </intent-filter> </receiver> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application>
五、屬性attribute資源的使用:資源也是存放在/res/values目錄下面,根元素也是<resource..../>
包含兩個屬性:
1、attr子元素:定義一個屬性
2、declare-styleable子元素,內一個styleable物件就是一組attr屬性組合:
七、assets資源
除了上面介紹的各種XML檔案、圖片檔案之外,Android應用可能還需要用到大量其他型別的資源,比如聲音資源等。實際上,聲音對於Android應用非常重要,選擇合適的音效可以讓Android應用增色不少。類似於聲音檔案及其他各種型別的檔案,只要Android沒有為之提供專門的支援,這種資源都被稱為原始資源。Android 的原始資源可以放在如下兩個地方。
1、位於/res/raw/目錄下,Android SDK會處理該目錄下的原始資源,Android SDK會在R清單類中為該目錄下的資源生成一個索引項。
2、位於/assets/目錄下,該目錄下的資源是更徹底的原始資源。Android 應用需要通過AssetManager來管理該目錄下的原始資源。
Android SDK會為位於/res/raw/目錄下的資源在R清單類中生成一個索引項,接下來在XML檔案中可通過如下語法格式來訪問它:
@[<package_ name>: ]raw/file_ name
在Java程式碼中則按如下語法格式來訪問:
[<package_ name>.]R.raw. <file_ name>
通過上面的索引項,Androiad 應用就可以非常方便地訪問/raw目錄下的原始資源了。至於獲取原始資源之後如何處理,則完全取決於實際專案的需要。AssetManager是一個 專門管理assets目錄下原始資源的管理器類,AssetManager提供瞭如
下兩個常用方法來訪問Assets資源。
1、InputStream open(String fileName): 根據檔名來獲取原始資源對應的輸入流。
2、AssetFileDescriptor openFd(String fileName): 根據檔名來獲取原始資源對應的AssetFileDescriptor。AssetFileDescriptor 代表了一項原始資源的描述,應用程式可通過AssetFileDescriptor來獲取原始資源。
例項:
建立raw和assets檔案,分別在其中新增兩個.mp3的檔案,實現音樂播放.
package com.example.asus.summary2; import android.content.res.AssetFileDescriptor; import android.content.res.AssetManager; import android.media.MediaPlayer; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.widget.Button; import java.io.IOException; /** * Created by asus on 2018/7/28. */ public class AssetsActivity extends AppCompatActivity implements View.OnClickListener{ private MediaPlayer mediaPlayer1; private MediaPlayer mediaPlayer2; protected void onCreate(Bundle saveInstanceState) { super.onCreate(saveInstanceState); setContentView(R.layout.ass_activity); Button raw_m=findViewById(R.id.raw_m); Button assets_m=findViewById(R.id.assets_m); raw_m.setOnClickListener(this); assets_m.setOnClickListener(this); } @Override public void onClick(View view) { switch (view.getId()){ case R.id.assets_m:{ AssetManager manager=getAssets(); try { AssetFileDescriptor descriptor=manager.openFd("ass.mp3"); mediaPlayer2=new MediaPlayer(); mediaPlayer2.setDataSource(descriptor.getFileDescriptor()); mediaPlayer2.prepare(); } catch (IOException e) { e.printStackTrace(); } mediaPlayer2.start(); break; } case R.id.raw_m:{ mediaPlayer1=MediaPlayer.create(this,R.raw.ra); try { mediaPlayer1.prepare(); } catch (IOException e) { e.printStackTrace(); } mediaPlayer1.start(); break; } default: break; } } }