Android手机中的参数设置界面

作者: GolferChen | 来源:发表于2016-10-17 02:17 被阅读2297次

    引言

    android平台的手机上肯定会有如下图所示的“设置”快捷方式(要么在桌面上,要么在屏幕下拉列表中),点击进入设置界面后可以进行各种参数设置,如图所示。


    "设置"快捷方式

    下面带大家制作这个参数设置界面。

    开发知识基础

    PreferenceActivity

    PreferenceActivity间接继承自Activity,专门用于实现参数设置、存储界面
    PreferenceActivity和其他Activity的区别在于:

    1.PreferenceActivity不使用普通的界面布局文件(以<LinearLayout>等标签开头),而是使用专门的选项设置的布局文件,示例如下:

    普通界面布局文件:

    <LinearLayout  ......
    <Button ....../>
    ......
    </LinearLayout>
    

    专门的选项设置的布局文件:

    <?xml version="1.0" encoding="utf-8"?>
    <preference-headers xmlns:android="http://schemas.android.com/apk/res/android">
    <header    
    android:title="常规"    
    android:summary="常规设置"   
    android:fragment="com.golfer.www.parametersetting.PreferenceActivityTest$Fragment1"/>
    <header    
    android:title="声音设置"    
    android:summary="声音设置" 
    android:fragment="com.golfer.www.parametersetting.PreferenceActivityTest$Fragment2"/>
    </preference-headers>
    

    需要指出的是
    普通的界面布局文件路径为res/layout/XXX.xml,而参数设置布局文件路径为res/xml/XXX.xml

    2.PreferenceActivity加载界面布局文件的方式不同

    普通activity加载布局文件方式如下:

    public void onCreate(Bundle savedInstanceState)  {  
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main)//activity.xml为待加载界面布局文件
    }
    

    PreferenceActivity加载布局文件方式如下:

    public void onBuildHeaders(List<Header> target) {       
    loadHeadersFromResource(R.xml.list_headers,target);
    }//list_headers是待加载布局文件
    
    Activity与Fragment

    为了说明Activity和Fragment的关系,我们先来看张图片

    Fragment是Activity的片段
    图片左边是不同新闻类型的名称,当我们点击其中一个后右边会显示该种类型的新闻。Activity是我们看到的整个界面,而左右两边分别两个Fragment。
    因此,其实Fragment是Activity的片段(fragment译为“片段”),一个Activity可以包含多个Fragment

    如何指定某一Activity包含哪些Fragment呢?
    方法一(动态):在Activity的java文件中使用如下方法:

    add(com.golfer.www.parametersetting.PreferenceActivityTest$Fragment1)
    //参数指定了要增加的Fragment的路径及名称,
    //其中com.golfer.www.parametersetting为包名
    //PreferenceActivityTest.java中定义了多个Fragment,
    //$表示增加其中名称为Fragment1的那个Fragment)
    
    remove()//参数省略
    replace()//参数省略
    

    方法二(静态):在Activity的界面布局文件中

    android:fragment="com.golfer.www.parametersetting.Pr  
    eferenceActivityTest$Fragment1"
    

    对应地,PreferenceActivity和PreferenceFragment往往配合使用
    其中,PreferenceActivity的布局文件负责显示选项设置列表,而PreferenceFragment的布局文件负责显示具体的参数设置选项(即点击选项设置列表其中一项后显示的界面)

    Fragment和Activity一样(我们在理解时可以把Fragment理解为和Activity同地位),有自己的布局文件和Java实现文件,下面详细讲解PreferenceFragment的布局文件:

    <?xml version="1.0" encoding="utf-8"?>  
    <PreferenceScreen  xmlns:android="http://schemas.android.com/apk/res/android">
    <PreferenceCategory android:title="声音模式"> 
    <ListPreference        
    android:title="音量"        
    android:summary="选择低、中、高音量"
    android:icon="@drawable/yinliang"      
    android:entries="@array/size_name"         
    android:dialogTitle="音量选择"      
    android:entryValues="@array/size_value"/>      
    <CheckBoxPreference       
    android:title="静音模式"   
    android:icon="@drawable/noyinliang"    
    android:summaryOn="开启"       
    android:summaryOff="关闭"      
    android:defaultValue="false" />      
    </PreferenceCategory>    
    <PreferenceCategory android:title="铃音和通知">
    <RingtonePreference            
    android:title="来电铃声"            
    android:summary="选择铃声"    
    android:icon="@drawable/call"   >  
    </RingtonePreference>        
     </PreferenceCategory>
    </PreferenceScreen>
    

    其中,PreferenceCategory元素用于对参数选项进行分组(即同一类型的参数设置归为同一组,比如来电铃声设置、短信铃声设置、其他通知铃声设置就可以分为一组),用android:title指定参数组名,里面再包含具体的参数设置。

    RingtonePreference元素:
    点击该元素后系统会调用手机原有的铃声设置模块

    CheckBoxPreference元素:
    该元素旁边有选择框,勾选后会在标题下方显示summaryOn对应的字符,没有勾选则显示summaryOff对应的字符

    ListPreference元素:
    点击该元素后,会弹出一个名称为dialogTitle对应的字符的列表对话框,可在里面选择其中一项,如示例的高音量、中音量、低音量

    注:如何设置弹出的列表对话框显示什么内容呢?
    步骤:
    1.在res/values下添加arrays.xml
    2.编辑arrays.xml,代码示例如下:

    <resources>    
    <string-array name="size_name">      
    <item>"低音量"</item>      
    <item>中音量</item>       
    <item>高音量</item>   
    </string-array>
    
    <string-array name="size_value">      
    <item>"低音量"</item>      
    <item>中音量</item>       
    <item>高音量</item>   
    </string-array>
    </resources>
    

    3.在ListPreference中键入:

    android:entries="@array/size_name"
    android:entryValues="@array/size_value"
    //注意不要写成@arrays,否则会报错,
    类似地,字符串资源文件命名为strings.xml,
    但引用字符串时写成@string/app_name
    

    写完布局文件后,如何在PreferenceFragment的java文件中加载对应的布局文件呢?示例如下:

    public static class Fragment1 extends PreferenceFragment {//指明继承关系   
        public void onCreate(Bundle savedInstanceState) {                    
          super.onCreate(savedInstanceState);       
          addPreferencesFromResource(R.xml.XXX); //关键方法,R.xml.XXX为待加载的布局 文件  }
    }
    
    实战

    有了上面的知识,开始开发

    PreferenceActivity(命名为PreferenceActivityTest)的界面布局文件(负责显示选项设置列表)

                        list_headers.xml
    <?xml version="1.0" encoding="utf-8"?>
    <preference-headers xmlns:android="http://schemas.android.com/apk/res/android">
    <header    
    android:title="常规"    
    android:summary="常规设置"  
    android:fragment="com.golfer.www.parametersetting.PreferenceActivityTest$Fragment1"/>
    <header    
    android:title="声音设置"    
    android:summary="声音设置"        
    android:fragment="com.golfer.www.parametersetting.PreferenceActivityTest$Fragment2"/>    
    <header        
    android:title="显示"       
    android:summary="显示设置"  
    android:fragment="com.golfer.www.parametersetting.PreferenceActivityTest$Fragment3"/>
    </preference-headers>
    

    PreferenceActivity(命名为PreferenceActivityTest)的java文件(PreferenceFragment的java定义嵌入其中,作为内部类)

                 PreferenceActivityTest.java
    package com.golfer.www.parametersetting;
    import android.app.Fragment;
    import android.os.Bundle;
    import android.preference.PreferenceActivity;
    import android.preference.PreferenceFragment;
    import java.util.List;
    public class PreferenceActivityTest extends PreferenceActivity {   
     @Override    
    protected void onCreate(Bundle savedInstanceState) {   
     super.onCreate(savedInstanceState);}    
    public void onBuildHeaders(List<Header> target)   
     { loadHeadersFromResource(R.xml.list_headers,target); }   
     public boolean isValidFragment(String FragmentName)   
     {  return true; }   
    public static class Fragment1 extends PreferenceFragment {            
    public void onCreate(Bundle savedInstanceState) 
    { super.onCreate(savedInstanceState);                   
      addPreferencesFromResource(R.xml.regular);  }
    }       
    public static class Fragment2 extends  PreferenceFragment {          
     public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState);        
     addPreferencesFromResource(R.xml.sound);}       
     }        
    public static class Fragment3 extends     
    PreferenceFragment{            
    public void onCreate(Bundle savedInstanceState) {                    
    super.onCreate(savedInstanceState);  
    addPreferencesFromResource(R.xml.display); }                
    }  
    }
    

    PreferenceFragment(以Fragment1的布局文件sound.xml为例)的布局文件(负责显示具体的参数设置选项)

                           sound.xml
    <?xml version="1.0" encoding="utf-8"?>    
    <PreferenceScreen  xmlns:android="http://schemas.android.com/apk/res/android">
    <PreferenceCategory android:title="声音模式">        
    <ListPreference        
    android:title="音量"            
    android:summary="选择低、中、高音量"            
    android:icon="@drawable/yinliang"          
    android:entries="@array/size"        
    android:dialogTitle="音量选择"        
    android:entryValues="@array/Size"/>   
    <CheckBoxPreference      
     android:title="静音模式"       
    android:icon="@drawable/noyinliang"       
    android:summaryOn="开启"       
    android:summaryOff="关闭"       
    android:defaultValue="false" />       
    </PreferenceCategory>    
    <PreferenceCategory android:title="铃音和通知">        
    <RingtonePreference            
    android:title="来电铃声"                    
    android:summary="选择铃声"            
    android:icon="@drawable/call" >    
    </RingtonePreference>        
    <RingtonePreference            
    android:title="信息铃声"                
    android:summary="选择铃声"            
    android:icon="@drawable/text"   >        
    </RingtonePreference>        
    <RingtonePreference            
    android:title="其他通知铃声"                
    android:summary="选择铃声"            
    android:icon="@drawable/inform"  >            
    </RingtonePreference>        
    <CheckBoxPreference            
    android:title="响铃时振动"                
    android:icon="@drawable/zhendong"            
    android:summaryOff="关闭"            
    android:summaryOn="开启"            
    android:defaultValue="true">        
    </CheckBoxPreference>    
    </PreferenceCategory>
    </PreferenceScreen>
    

    成果演示:

    列表界面 声音设置界面 音量选择对话框
    开启静音模式
    铃声设置
    关闭振动

    相关文章

      网友评论

        本文标题:Android手机中的参数设置界面

        本文链接:https://www.haomeiwen.com/subject/fofayttx.html