首頁 收藏 QQ群
 網(wǎng)站導航

ZNDS智能電視網(wǎng) 推薦當貝市場

TV應用下載 / 資源分享區(qū)

軟件下載 | 游戲 | 討論 | 電視計算器

綜合交流 / 評測 / 活動區(qū)

交流區(qū) | 測硬件 | 網(wǎng)站活動 | Z幣中心

新手入門 / 進階 / 社區(qū)互助

新手 | 你問我答 | 免費刷機救磚 | ROM固件

查看: 10872|回復: 0
上一主題 下一主題
[教程]

Android軟件開發(fā)之PreferenceActivity中的組件(二十八)

[復制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
發(fā)表于 2013-8-28 16:27 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
Android軟件開發(fā)之PreferenceActivity中的組件   
   
   
     
1.PreferenceActivity 介紹     
   
    PreferenceActivity 繼承ListActivity 它是以一個列表的形式在展現(xiàn)內(nèi)容,它最主要的特點是添加Preference可以讓控件的狀態(tài)持久化儲存,舉個例子 比如用戶選中checkbox后 退出應用然后在進入應用,這時用戶希望看到的是checkbox被選中,所以軟件須要記錄用戶每次操作的過程并且持久儲存,在進入應用的時候須要判斷這些久儲存的數(shù)據(jù)然后將系統(tǒng)控件的狀態(tài)呈現(xiàn)在UI中。   
      尤其是軟件開發(fā)肯定會有一堆設置選項選項,每次進入Activity都去手動的去取儲存的數(shù)據(jù),這樣代碼會變得很復雜很麻煩。 這個時候Preference就出來了,它就是專門解決這些特殊的選項保存與讀取的顯示。用戶每次操作事件它會及時的以鍵值對的形式記錄在SharedPreferences中,Activity每次啟動它會自動幫我們完成數(shù)據(jù)的讀取以及UI的顯示。   
      Android開發(fā)中一共為我們提供了4個組件,分別是CheckBoxPreference組件、EditTextPreference組件、ListPreference組件、RingtonePreference組件,下面我用一個例子一一向同學們介紹一下。   
   
   
   
2.CheckBoxPreference組件   
   
CheckBoxPreference 選中為true 取消選中為false 它的值會以boolean的形式儲存在SharedPreferences中。   
  1. <?xml version="1.0" encoding="utf-8"?>   
    <PreferenceScreen   
      xmlns:android="http://schemas.android.com/apk/res/android">   
              <PreferenceCategory android:title="CheckBoxPreference">           
              <CheckBoxPreference android:key="checkbox_0"   
                  android:title="CheckBox_A"   
                    android:summary="這是一個勾選框A" >   
            </CheckBoxPreference>   
               
              <CheckBoxPreference android:key="checkbox_1"   
                  android:title="CheckBox_B"   
                    android:summary="這是一個勾選框B" >   
            </CheckBoxPreference>   
            </PreferenceCategory>   
    </PreferenceScreen>   
復制代碼
     
  1. import android.content.Context;   
    import android.os.Bundle;   
    import android.preference.CheckBoxPreference;   
    import android.preference.Preference;   
    import android.preference.PreferenceActivity;   
    import android.preference.Preference.OnPreferenceChangeListener;   
    import android.preference.Preference.OnPreferenceClickListener;   
    import android.widget.Toast;   
       
    public class CheckBoxActivity extends PreferenceActivity {   
       
        Context mContext = null;   
        @Override   
        protected void onCreate(Bundle savedInstanceState) {   
            super.onCreate(savedInstanceState);   
            // 從資源文件中添Preferences ,選擇的值將會自動保存到SharePreferences   
            addPreferencesFromResource(R.xml.checkbox);   
          
            mContext = this;   
               
            //CheckBoxPreference組件   
            CheckBoxPreference mCheckbox0 = (CheckBoxPreference) findPreference("checkbox_0");   
            mCheckbox0.setOnPreferenceClickListener(new OnPreferenceClickListener() {   
                   
                @Override   
                public boolean onPreferenceClick(Preference preference) {   
                    //這里可以監(jiān)聽到這個CheckBox 的點擊事件   
                    return true;   
                }   
            });   
               
            mCheckbox0.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {   
                   
                @Override   
                public boolean onPreferenceChange(Preference arg0, Object newValue) {   
                    //這里可以監(jiān)聽到checkBox中值是否改變了   
                    //并且可以拿到新改變的值   
                      Toast.makeText(mContext, "checkBox_0改變的值為" +  (Boolean)newValue, Toast.LENGTH_LONG).show();     
                    return true;   
                }   
            });   
       
            CheckBoxPreference mCheckbox1 = (CheckBoxPreference) findPreference("checkbox_1");   
            mCheckbox1.setOnPreferenceClickListener(new OnPreferenceClickListener() {   
                   
                @Override   
                public boolean onPreferenceClick(Preference preference) {   
                    //這里可以監(jiān)聽到這個CheckBox 的點擊事件   
                    return true;   
                }   
            });   
               
            mCheckbox1.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {   
                   
                @Override   
                public boolean onPreferenceChange(Preference arg0, Object newValue) {   
                    //這里可以監(jiān)聽到checkBox中值是否改變了   
                    //并且可以拿到新改變的值   
                      Toast.makeText(mContext, "checkBox_1改變的值為" +  (Boolean)newValue, Toast.LENGTH_LONG).show();     
                    return true;   
                }   
            });   
          
        }   
       
    }   
復制代碼
3.EditTextPreference組件   
   
EditTextPreference 點擊后會彈出一個輸入框,輸入的內(nèi)容會以字符串的的形式儲存在SharedPreferences中。   
  1. <?xml version="1.0" encoding="utf-8"?>   
    <PreferenceScreen   
      xmlns:android="http://schemas.android.com/apk/res/android">   
             <PreferenceCategory android:title="EditTextPreference">           
             <EditTextPreference android:key="edit_0"   
                    android:title="輸入信息_A"   
                    android:summary="請輸入您的信息"   
                    android:defaultValue="請輸入信息"   
                    android:dialogTitle="輸入框">   
            </EditTextPreference>   
                        
             <EditTextPreference android:key="edit_1"   
                    android:title="輸入信息_B"   
                    android:summary="請輸入您的信息"   
                    android:defaultValue="請輸入信息"   
                    android:dialogTitle="輸入框">   
            </EditTextPreference>   
            </PreferenceCategory>   
    </PreferenceScreen>
復制代碼
     
     
  1. import android.content.Context;   
    import android.os.Bundle;   
    import android.preference.EditTextPreference;   
    import android.preference.PreferenceActivity;   
       
    public class EditTextActivity extends PreferenceActivity {   
       
        Context mContext = null;   
       
        @Override   
        protected void onCreate(Bundle savedInstanceState) {   
            super.onCreate(savedInstanceState);   
            // 從資源文件中添Preferences ,選擇的值將會自動保存到SharePreferences   
            addPreferencesFromResource(R.xml.edittext);   
       
            mContext = this;   
       
            // EditTextPreference組件   
            EditTextPreference mEditText = (EditTextPreference) findPreference("edit_0");   
               
            //設置dialog按鈕信息   
            mEditText.setPositiveButtonText("確定");   
            mEditText.setNegativeButtonText("取消");   
               
            //設置按鈕圖標   
            mEditText.setDialogIcon(R.drawable.jay);   
        }   
       
         
    }
復制代碼
4.ListPreference組件   
   
在res/array中先寫兩個數(shù)組,一個用與list的顯示內(nèi)容,一個用戶list的選中數(shù)值。   
  1. <?xml version="1.0" encoding="utf-8"?>   
    <resources>   
       
    <string-array name="auto_logout_time_key">   
                    <item>10 mins.</item>   
                    <item>20 mins.</item>   
                    <item>30 mins.</item>   
                    <item>60 mins.</item>   
    </string-array>   
       
    <string-array name="auto_logout_time_value">   
                    <item>600000</item>   
                    <item>1200000</item>   
                    <item>1800000</item>   
                    <item>3600000</item>   
    </string-array>   
    </resources>
復制代碼
ListPreference點擊后會彈出一個列表框,選中后會將選中的內(nèi)容(上面數(shù)組中的值)會以字符串的的形式儲存在SharedPreferences中。   
  1. <?xml version="1.0" encoding="utf-8"?>   
    <PreferenceScreen   
      xmlns:android="http://schemas.android.com/apk/res/android">   
      <PreferenceCategory android:title="ListPreference">           
                     <ListPreference   
                             android:key="list_0"   
                         android:title="登錄設置A"   
                         android:dialogTitle="選擇在線時間"   
                         android:entries="@array/auto_logout_time_key"   
                            android:entryValues="@array/auto_logout_time_value" >   
                    </ListPreference>   
               
                     <ListPreference   
                             android:key="list_0"   
                         android:title="登錄設置A"   
                         android:dialogTitle="選擇在線時間"   
                         android:entries="@array/auto_logout_time_key"   
                            android:entryValues="@array/auto_logout_time_value" >   
                    </ListPreference>   
            </PreferenceCategory>   
    </PreferenceScreen>
復制代碼
     
  1. import android.os.Bundle;   
    import android.preference.PreferenceActivity;   
       
    public class ListActivity extends PreferenceActivity {   
        @Override   
        protected void onCreate(Bundle savedInstanceState) {   
            super.onCreate(savedInstanceState);   
            // 從資源文件中添Preferences ,選擇的值將會自動保存到SharePreferences   
            addPreferencesFromResource(R.xml.list);   
        }   
    }   
復制代碼
5.RingtonePreference組件   
   
RingtonePreference點擊后會彈出一個系統(tǒng)鈴聲的列表框,選中后會將選中的內(nèi)容(uri字符集)會以字符串的的形式儲存在SharedPreferences中。   
  1. <?xml version="1.0" encoding="utf-8"?>   
    <PreferenceScreen   
      xmlns:android="http://schemas.android.com/apk/res/android">   
    <PreferenceCategory android:title="RingtonePreference">           
              <RingtonePreference     
                        android:key="ringtone_0"     
                        android:summary="選擇系統(tǒng)鈴聲A"     
                        android:title="鈴聲設置"     
                        android:ringtoneType="all"     
                        android:showSilent="true" ></RingtonePreference>   
          
        <RingtonePreference     
                android:key="ringtone_!"     
                android:summary="選擇系統(tǒng)鈴聲B"     
                android:title="鈴聲設置"     
                android:ringtoneType="all"     
                android:showSilent="true" ></RingtonePreference>   
          
        </PreferenceCategory>   
    </PreferenceScreen>
復制代碼
android:ringtoneType 系統(tǒng)一共提供了4中響鈴模式的類型分別為  鈴聲(ringtone)  通知( notification) 警告(alarm) 全部(all)   
   
模擬器默認是沒有鈴聲的,下圖中的鈴聲我是將歌曲文件拷貝到SD卡中,設置鈴聲后才會出現(xiàn)的。如果覺得拷貝麻煩可以使用豌豆莢或者91助手將歌曲文件放入手機SD卡中,在鈴聲設置那里設置一下在這里就會出現(xiàn)。   
   
     
  1. import android.os.Bundle;   
    import android.preference.PreferenceActivity;   
       
    public class RingtoneActivity extends PreferenceActivity {   
        @Override   
        protected void onCreate(Bundle savedInstanceState) {   
            super.onCreate(savedInstanceState);   
            // 從資源文件中添Preferences ,選擇的值將會自動保存到SharePreferences   
            addPreferencesFromResource(R.xml.ringtone);   
        }   
    }   
復制代碼
5.自定義控件   
   
使用系統(tǒng)的控件在顯示方面難免會有些單一,如果想做一個好看的界面就需要使用自定義Preference。下面我簡單說明一下如何編寫自定義Preference。首先在res/layout中添加preferences文件   
  1. <?xml version="1.0" encoding="utf-8"?>   
    <LinearLayout         xmlns:android="http://schemas.android.com/apk/res/android"   
            android:layout_width="fill_parent"   
            android:layout_height="fill_parent"   
            android:background="#00000000">   
            <LinearLayout   
                    android:gravity="center_vertical"   
                    android:background="@drawable/preference_mid_background"   
       
                    android:layout_width="fill_parent"   
                    android:layout_height="wrap_content"   
                    >   
                    <ImageView   
                            android:focusable="false"   
                            android:layout_width="wrap_content"   
                            android:layout_height="wrap_content" android:src="@drawable/setting_about_us">   
                    </ImageView>   
                    <RelativeLayout   
                            android:layout_width="wrap_content"   
                            android:layout_height="wrap_content"   
                            android:layout_marginLeft="15dip"   
                            android:layout_marginTop="6dip"   
                            android:layout_marginRight="6dip"   
                            android:layout_marginBOTTom="6dip"   
                            android:layout_weight="1"   
                            >   
                            <TextView   
                                    android:textSize="15dip"   
                                    android:textColor="#000000"   
                                    android:ellipsize="marquee"   
                                    android:id="@+android:id/title"   
                                    android:fadingEdge="horizontal"   
                                    android:layout_width="wrap_content"   
                                    android:layout_height="wrap_content"   
                                    android:singleLine="true"   
                                    >   
                            </TextView>   
                            <TextView   
                                    android:textAppearance="?android:attr/textAppearanceSmall"   
                                    android:textColor="#565656"   
                                    android:id="@+android:id/summary"   
                                    android:layout_width="wrap_content"   
                                    android:layout_height="wrap_content"   
                                    android:maxLines="4"   
                                    android:layout_below="@+android:id/title"   
                                    android:layout_alignLeft="@+android:id/title"   
                                    >   
                            </TextView>   
                    </RelativeLayout>   
                            <ImageView   
                                    android:focusable="false"   
                                    android:layout_width="wrap_content"   
                                    android:layout_height="wrap_content"   
                                    android:background="@drawable/preference_arrows"/>   
            </LinearLayout>   
    </LinearLayout>
復制代碼
android:background="@drawable/preference_mid_background"   
通過這一行可以設置這個按鈕的點擊、選中默認的顯示狀態(tài),這樣可以讓你的按鈕更加好看。須要在res/drawable中添加xml文件   
   
android:state_facused :為控件選中顯示   
android:state_pressed:為控件按下顯示   
最后一個為默認顯示   
VRa">
  1. <?xml version="1.0" encoding="utf-8"?>   
    <selector   
            xmlns:android="http://schemas.android.com/apk/res/android">   
            <item   
                    android:state_focused="true"   
                    android:drawable="@drawable/preference_mid_pressed"   
                    >   
            </item>   
            <item   
                    android:state_pressed="true"   
                    android:drawable="@drawable/preference_mid_pressed"   
                    >   
            </item>   
            <item   
       
                    android:drawable="@drawable/preference_mid"   
                    >   
            </item>   
       
    </selector>
復制代碼
     
  1. import android.content.Context;   
    import android.os.Bundle;   
    import android.preference.Preference;   
    import android.preference.PreferenceActivity;   
    import android.preference.Preference.OnPreferenceClickListener;   
    import android.widget.Toast;   
       
    public class AllActivity extends PreferenceActivity {   
          
        /**自定義布局A**/   
        Preference preference0 = null;   
          
        /**自定義布局B**/   
        Preference preference1 = null;   
          
        Context mContext = null;   
        @Override   
        protected void onCreate(Bundle savedInstanceState) {   
            super.onCreate(savedInstanceState);   
            // 從資源文件中添Preferences ,選擇的值將會自動保存到SharePreferences   
            addPreferencesFromResource(R.xml.all);   
            mContext = this;   
               
            preference0 = findPreference("pref_key_0");   
               
            preference0.setOnPreferenceClickListener(new OnPreferenceClickListener() {   
                   
                @Override   
                public boolean onPreferenceClick(Preference preference) {   
                      Toast.makeText(mContext, "自定義布局A被按下", Toast.LENGTH_LONG).show();     
                    return false;   
                }   
            });   
            preference1 = findPreference("pref_key_1");   
               
            preference1.setOnPreferenceClickListener(new OnPreferenceClickListener() {   
                   
                @Override   
                public boolean onPreferenceClick(Preference preference) {   
                      Toast.makeText(mContext, "自定義布局B被按下", Toast.LENGTH_LONG).show();     
                    return false;   
                }   
            });   
        }   
    }
復制代碼
讀取數(shù)據(jù)   
   
在PreferenceActivity中可以用下面這種方式拿到SharedPreferences中儲存的數(shù)值,通過PreferenceManager.getDefaultSharedPreferences(this) 方法拿到控件默認儲存的sharedPreferences對象。   
  1. SharedPreferences prefs =PreferenceManager.getDefaultSharedPreferences(this) ;   
        boolean something = prefs.getBoolean("something",false);
復制代碼
在模擬起中將SharedPreferences儲存內(nèi)容拷貝出來后,可以清楚的看到通過點擊系統(tǒng)控件儲存的數(shù)值。這里我說一下鈴聲的儲存,它是以一個字符串形式的uri字符集,它所指向的是系統(tǒng)鈴聲儲存的路徑。所以根據(jù)這個字符集就可以找到這個鈴聲。   
  1. <?xml version=1.0 encoding=utf-8 standalone=yes ?>   
    <map>   
    <string name="ringtone_!">content://media/external/audio/media/1</string>   
    <string name="ringtone_0">content://media/external/audio/media/1</string>   
    <string name="list_0">1800000</string>   
    <string name="edit_1">請輸入信息1212</string>   
    <string name="list">1200000</string>   
    <string name="ringtone">content://settings/system/ringtone</string>   
    <boolean name="checkbox_0" value="true" />   
    <boolean name="checkbox_1" value="true" />   
    <string name="edit_0">請輸入信息</string>   
    </map>   
復制代碼
第二十八講 Preference.rar(307.78 KB, 下載次數(shù): 273)[/I]2011-9-3 01:12 上傳點擊文件名   下載積分: 下載豆 -2

上一篇:android條形碼掃描(留著自己學習)
下一篇:Android中Surface和SurfaceView的一些理解和總結(jié)
您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

Archiver|新帖|標簽|軟件|Sitemap|ZNDS智能電視網(wǎng) ( 蘇ICP備2023012627號 )

網(wǎng)絡信息服務信用承諾書 | 增值電信業(yè)務經(jīng)營許可證:蘇B2-20221768 丨 蘇公網(wǎng)安備 32011402011373號

GMT+8, 2024-10-20 00:32 , Processed in 0.074835 second(s), 15 queries , Redis On.

Powered by Discuz!

監(jiān)督舉報:report#znds.com (請將#替換為@)

© 2007-2024 ZNDS.Com

快速回復 返回頂部 返回列表