Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android學習筆記十二.深入理解LauncherActvity 之LauncherActivity、PreferenceActivity、PreferenceFragment

Android學習筆記十二.深入理解LauncherActvity 之LauncherActivity、PreferenceActivity、PreferenceFragment

編輯:關於Android編程

深入理解LauncherActvity 之LauncherActivity、PreferenceActivity、PreferenceFragment 從下圖我們可以知道,LauncherActivity、PreferanceActivity均繼承於ListActivity,其中LauncherActivity實現當列表界面列表項被點擊時所對應的Acitvity被啟動;PreferanceActivity實現一個程序參數設置、存儲功能的Activity列表界面。 height=343
一、LauncherActivity使用詳解 1.概述:LauncherActivity的作用是是開發一個列表界面Activity,但是這個列表界面與普通的列表界面有所不同。它開發出來的列表界面中的每個列表項都對應於一個Intent,通過重寫Intent intentForPosition(int position)方法根據不同列表返回不同的intent。當我們點擊不同列表項時,應用程序會自動啟動對應的Acitviy。效果如下: data-cke-saved-src=https://www.android5.online/Android/UploadFiles_5356/201702/2017022316110165.png
2.LauncherActivity類介紹 (1)構造方法:LauncherActivity() (2)重要方法 Intent intentForPosition(int position):根據不同列表返回不同的intent void onCreate(Bundle savedInstanceState):啟動Activity第一個被調用 void onListItemClick(ListView l, View v, int position, long id):當點擊一個列表項時調用該方法 (3)Intent構造方法:用於實例化一個Intent對象 Intent() Intent(Intent o) Intent(String action) Intent(String action, Uri uri) Intent(Context packageContext, Classcls) Intent(String action, Uri uri, Context packageContext, Classcls) 3.開發思路及源碼 (1)為LauncherActivity界面填充列表項內容。通過裝配適配器,將數組字符串數據源裝配到視圖,並根據按系統自帶的android.R.layout.simple_expandable_list_item_1布局文件設計每個列表項外觀和內容; String[] names={設置程序參數,查看人種}; ArrayAdapter adapter=new ArrayAdapter(this,android.R.layout.simple_expandable_list_item_1 , names); setListAdapter(adapter); data-cke-saved-src=https://www.android5.online/Android/UploadFiles_5356/201702/2017022316110142.png
(2)重寫Intent intentForPosition(int position)方法,實現根據不同列表返回不同的intent。當用戶點擊Activity列表項時,系統將傳遞該列表項所在的位置position參數給intentForPosition方法,最後返回一個intent給上下文界面從而實現啟動相對應的Acitvity。 Class[] classes={PreferenceActivityTest.class,ExpandableListActivityTest.class}; public Intent intentForPosition(int position) { return new Intent(LaunchActivity.this,classes[position]); //new一個intent } (3)實現intent對應的Acitvity,可以繼承於Activity、PreferenceActivity、ExpandableListActivity等. data-cke-saved-src=https://www.android5.online/Android/UploadFiles_5356/201702/2017022316110243.png

(3)源代碼
package com.example.android_activity_1;
import android.app.LauncherActivity; 
import android.content.Intent;
import android.os.Bundle;
import android.widget.ArrayAdapter;
/*主Activity:LauncherActivity
 * 每個列表項都對應於一個Intent
 * */
public class LaunchActivity extends LauncherActivity {
 //1.定義兩個Activity的名稱
 String[] names={設置程序參數,查看人種};
 //2.定義兩個Activity對應的實現類,前者用於顯示一個顯示設置選項參數並進行保存的窗口;後者用於顯示一個可展開的列表窗口(Activity)
 Class[] classes={PreferenceActivityTest.class,ExpandableListActivityTest.class};
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
 //3.裝配ArrayAdapter適配器,將數據裝配到對應的列表項視圖中
  ArrayAdapter adapter=new ArrayAdapter(this,android.R.layout.simple_expandable_list_item_1 , names);
 //4.設置該窗口顯示的列表所需的adapter
  setListAdapter(adapter);
 }
 //5.重寫Intent IntentForPosition(int position)方法:根據列表項返回的intent,用於啟動不同的Activity
 public Intent intentForPosition(int position){
  return new Intent(LaunchActivity.this,classes[position]);    //返回一個Intent對象,已指明將要啟動的類,其中 position的值在當用戶點擊Activity中列表項被確定
 }
}


二、PreferenceActivity使用詳解
1.概述:PreferenceActivity是一個非常有用的基類,當開發的Android應用程序需要進行選項設置並希望這些選項設置以參數的形式保存時,我們可以通過PreferenceActivity實現。PreferenceActivity與普通的Acitvity不同,它不再使用普通的界面布局文件,而是使用選項設置的布局文件。 選項設置的布局文件:以PreferenceScreen作為根元素,它表明定義一個參數設置的界面布局。 另外,一旦Activity繼承了PreferenceActivity,那麼該Activity完全不需要自己控制Preferences的讀寫,PreferenceActivity會為我們處理這一切。 2.PreferenceActivity類介紹 (1)嵌入類:class PreferenceActivity.Header 作用:用來描述用戶將要點擊的標頭列表項 (2)PreferenceActivity重要方法 public void loadHeadersFromResource (int resid, List target) 功能:解析resid所代表的布局資源文件,根據元素為一標頭(列表項)添加到目標列表list中。 public void onBuildHeaders (List target) 功能:負責加載頁面布局文件到Activity,通過該方法添加加載至少一項標頭到Activity列表中,並使acitvity運行在其fragment模式。其中,List為一個列表集合用來存放布局文件中的標頭,調用 loadHeadersFromResource(R.layout.*, List)方法將布局資源添加到列表list數據集中。 3.開發思路及源碼 為了創建一個PreferenceActivity界面,首先需要創建一個對應的界面布局文件。從Android3.0開始,官方推薦將PreferenceActivity結合PreferenceFragment來實現參數設置界面。其中,PreferenceActivity只負責加載選項設置列表的布局文件(如圖(A));PreferenceFragment才負責加載選項設置的布局文件(如圖(B)). data-cke-saved-src=https://www.android5.online/Android/UploadFiles_5356/201702/2017022316110258.png
(1)PreferenceActivity加載選項設置列表的布局文件,其根元素為...,每一列表項元素為
 
或者,具體效果如上圖(A)所示。 //實現一個列表項
android:icon= //指定列表項圖標
android:title= //指定列表項的標題
android:summary=> //指定列表項說明
,給Prefs1Fragment界面(Activity)傳遞數據,即website=www.baidu.com
android:value=www.baidu.com/> ,啟動一個Activity android:action=android.intent.action.VIEW
android:data=http://www.baidu.com/>
................

其中,android:fragment的作用是指定列表項啟動哪一個preferenceFragment界面,格式為:包.類.$內部類,這個內部類繼承於PreferenceFragment。在Prefs1Fragment 獲取傳入 該Fragment的參數 : String website=getArguments().getString(website); Toast.makeText(getActivity(), 網站域名是:+website, Toast.LENGTH_SHORT).show(); data-cke-saved-src=https://www.android5.online/Android/UploadFiles_5356/201702/2017022316110216.png
 源代碼res/layout/preference.xml: 該布局定義了三個列表項,其中前兩個列表項通過android:fragment屬性指定啟動響應的PreferenceFragment;第三個列表項通過子元素啟動指定的Activity.
 

(2)實現一個繼承於PreferenceActivity的Activity(PreferenceActivityTest.java),主要完成兩個任務: a.加載指定的選項設置列表布局文件(res/layout/preference.xml)到PreferenceActivity,通過重寫其public void onBuildHeaders(List
target)方法實現; public void onBuildHeaders(List
target) { super.loadHeadersFromResource(R.layout.preference, target); } b.定義實現選項設置列表的布局文件中使用的PreferenceFragment內部類; public static class Prefs1Fragment extends PreferenceFragment { public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.preferences); //加載選項設置布局文件到PreferenceFragment } }
源代碼src/包名/PreferenceActivityTest.java:
package com.example.android_activity_1;
import java.util.List; 
import android.os.Bundle; 
import android.preference.PreferenceActivity;
import android.preference.PreferenceFragment;
import android.widget.Button;
import android.widget.Toast;
/*PreferenceActivity:
 * 結合PreferenceFragment實現參數設置界面,
 * 其中,PreferenceFragment負責加載選項設置的布局文件;PreferenceActivity負責加載選項設置列表的布局文件*/
public class PreferenceActivityTest extends PreferenceActivity {
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
 //1.該方法用於為該界面設置一個標題按鈕
  if(hasHeaders())
  {
   Button button=new Button(this);
   button.setText(設置操作);
   //將該按鈕添加到該界面上
   setListFooter(button);
  }
 }
 //2.該方法加載選項列表的頁面布局文件
 @Override
 public void onBuildHeaders(List
target) { // TODO Auto-generated method stub super.loadHeadersFromResource(R.layout.preference, target); } //3.在PreferenceActivityTest中顯示Prefs1Fragment、Prefs2Fragment兩個內部類 public static class Prefs1Fragment extends PreferenceFragment { @Override public void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.preferences); //加載選項設置布局文件到PreferenceFragment } } public static class Prefs2Fragment extends PreferenceFragment { @Override public void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.display_prefs); //加載選項設置布局文件到PreferenceFragment //獲取傳入該Fragment的參數 String website=getArguments().getString(website); Toast.makeText(getActivity(), 網站域名是:+website, Toast.LENGTH_SHORT).show(); } } }

height=431 (3)建立選項設置參數布局文件display_prefs.xml、preferences.xml 選項設置參數布局文件,以為根元素。選項參數的每一項,我們可以通過系統提供的屬性來構造自己的選項設置參數組,實現預期的功能。
data-cke-saved-src=https://www.android5.online/Android/UploadFiles_5356/201702/2017022316110245.png
源代碼res/xml/preferences.xml
 
 
 
       
 

 
 
 

源代碼res/xml/display_prefs.xml
 
 
 
 
 
 
 

 
 
 
 
data-cke-saved-src=https://www.android5.online/Android/UploadFiles_5356/201702/2017022316110215.png
 說明:上面的界面布局文件定義了一個參數設置界面,該參數設置界面中包括兩個參數設置組。一旦定義了參數設置的界面布局文件,我們再在PreferenceFragment中調用 addPreferencesFromResource(R.xml.preferences);方法加載選項設置布局文件到PreferenceFragment。 (1)android:key屬性: (2)res/values/array/數組 最亮 1 2 3 (4)修改工程文件AndroidManifest.xml配置、管理上面的三個Activity。即在清單文件的元素中增加ExpandableListActivityTest和PreferenceActivityTest界面Activity。

    

總結:上述應用通過PreferenceActivity生成選項設置列表界面;PreferenceFragment生成選項設置界面(如圖(B))。使用PreferenceActivity來進行應用程序選項參數的設置,系統會自動將設置的參數永久的保存到系統中。例如,我們單擊設置選項中的填寫用戶名列表項,程序將會自動保存設置的選項參數到手機/data/data/<應用程序包名>/share_prefs路徑下,文件名為<應用程序包名>_preferences.xml。 三、PreferenceFragment詳解 在android的應用中通常都有setting功能,能夠設置一些全局的選項,例如字體顏色,個人喜好等等。 這些東西都是存在一個xml中的,在android中對應的對象就是SharedPreferences。 PreferenceFragment 還是 PreferenceActivity 很明顯PreferenceFragment 是Fregment, PreferenceActivity是Activity。 當你的應用針對的系統在3.0以上的時候,你就應該用PreferenceFragment,現在主流系統4.0的情況下,當然選擇使用PreferenceFragment。原因是PreferenceFragment是一個更加平滑的結構,你可以將它依附在任何的activity上面,谷歌強力推薦使用PreferenceFragment! 常用Preference CheckPreference —— CheckBox 單選框 EditTextPreference —— EditText 輸入文本框 ListPreference —— ListView 列表框 RingtonePreference —— 選擇鈴聲 XML定義常用的屬性有: android:key : 每個Preference控件獨一無二的”ID”,唯一表示此Preference。 android:defaultValue : 默認值。 例如,CheckPreference的默認值可為”true”,默認為選中狀態; EditTextPreference的默認值可為”110” 。 android:enabled : 表示該Preference是否可用狀態。 android:title : 每個Preference在PreferenceScreen布局上顯示的標題——大標題 android:summary : 每個Preference在PreferenceScreen布局上顯示的標題——小標題(可以沒有) ListPreference中: android:entries:類型為array,控件欲顯示的文本 android:entryValues:類型為array,與文本相對應的key-value鍵值對,value保存至sharedPreference文件
PreferenceFragment 使用步驟(方法二) 1.定義preference在項目的res/xml中新建一個preferences.xml.用於定義菜單界面的設置選項 (其中,android:entries 和 android:entryValues 定義在res/values/strings.xml中) 2.創建一個activity用於給PreferenceFragment 依附
  1. package com.example.androidpreferencefragment;
  2.  
  3. import android.app.Activity;
  4. import android.os.Bundle;
  5.  
  6. public class SetPreferenceActivity extends Activity {
  7.  
  8. @Override
  9. protected void onCreate(Bundle savedInstanceState) {
  10. // TODO Auto-generated method stub
  11. super.onCreate(savedInstanceState);
  12.  
  13. getFragmentManager().beginTransaction().replace(android.R.id.content,
  14. new PrefsFragment()).commit();
  15. }
  16.  
  17. } 3. 創建PreferenceFragment。 implements OnSharedPreferenceChangeListener 是用於監聽SharedPreference是否改變的。這裡主要的作用是當SharedPreference改變的時候及時更新界面中preference的summary,提供一個更好的交互。注意在OnResume和OnPause中要注冊和卸載監聽器,維護activity中的生命周期。注:不能給每個preference設置OnChangeListener來更新界面中preference的summary,這樣會阻止系統存儲preference.xml.
    1. package com.example.androidpreferencefragment;
    2.  
    3. import android.annotation.SuppressLint;
    4. import android.content.SharedPreferences;
    5. import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
    6. import android.os.Bundle;
    7. import android.preference.Preference;
    8. import android.preference.PreferenceFragment;
    9. import android.preference.Preference.OnPreferenceChangeListener;
    10.  
    11. @SuppressLint(NewApi)
    12. public class PrefsFragment extends PreferenceFragment implements OnSharedPreferenceChangeListener{
    13.  
    14. @Override
    15. public void onCreate(Bundle savedInstanceState) {
    16. // TODO Auto-generated method stub
    17. super.onCreate(savedInstanceState);
    18.  
    19. // Load the preferences from an XML resource
    20. addPreferencesFromResource(R.xml.preferences);
    21. }
    22.  
    23. @Override
    24. public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
    25. // TODO Auto-generated method stub
    26. // Set summary to be the user-description for the selected value
    27. if(!key.equals(MainActivity.PRF_CHECK))
    28. {
    29. Preference connectionPref = findPreference(key);
    30. connectionPref.setSummary(sharedPreferences.getString(key, ));
    31. }
    32. }
    33.  
    34. @Override
    35. public void onResume() {
    36. super.onResume();
    37. getPreferenceManager().getSharedPreferences().registerOnSharedPreferenceChangeListener(this);
    38.  
    39. }
    40.  
    41. @Override
    42. public void onPause() {
    43. getPreferenceManager().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this);
    44. super.onPause();
    45. }
    46.  
    47. }

       

      4.設置默認 當用戶第一次運行應用的時候,用戶還沒有設置自己preference,這時候就要指定默認的prefernnce了。

      首先在xml定義好android:defaultValue項。然後在主Activity(也可以是其他activity,但在第一次運行的時候一定會進去,比如閃屏Activity)的onCreate方法中調用setDefaultValues方法。

      1. PreferenceManager.setDefaultValues(this, R.xml.preferences, false);

        這個函數有三個參數:

        第一個為應用上下文,第二個是preference的id,第三個為false指只在第一次運行的時候加載默認值。

        5.取出preference值

         

        SharedPreferences mySharedPreferences = PreferenceManager.getDefaultSharedPreferences(this); 然後通過get方法和key值就可以取出對應的值了,比如:

         

        boolean my_checkbox_preference = mySharedPreferences.getBoolean(checkbox_preference, false);

        String my_edittext_preference = mySharedPreferences.getString(edittext_preference, ); 參考: http://blog.csdn.net/silangquan/article/details/11022335

         
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved