现在的位置: 首页 > 综合 > 正文

Pro Android学习笔记(六三):Preferences(7):代码控制首选项

2013年01月05日 ⁄ 综合 ⁄ 共 2817字 ⁄ 字号 评论关闭

代码实现preference

View可以不通过xml进行设置,有代码直接进行设置,首选项preference也一样。下面是代码设置list preference的例子,是在通过header来指向PreferenceFragment的类,在PreferenceActivity中的实现也是类似的。

public class ListPreferenceFragment extends PreferenceFragment { 
    @Override
    public void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState);
        addPreferencesFromResource(R.xml.fightoptions); 
        // 通过key来获得prefrenence
        ListPreference listpref = (ListPreference) findPreference("selected_flight_sort_option");
        listpref.setEntries(new String[]{"Entry 1","Entry 2","Entry 3"});
        listpref.setEntryValues(new String[]{"0","1","2"});
    }
}

如果需要从创建PreferenceScreen开始,下面是例子:

public class ListPreferenceFragment extends PreferenceFragment {
   @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //创建PreferenceScreen
        PreferenceScreen screen = getPreferenceManager().createPreferenceScreen( getActivity() );
        //创建PreferenceCategory,并加入preference screen
        PreferenceCategory inlinePrefCat = new PreferenceCategory(getActivity());

        inlinePrefCat.setTitle("Hello");
        screen.addPreference(inlinePrefCat);
        //创建List preference,并加入preference category
        ListPreference listpref = new ListPreference(getActivity());

        listpref.setKey("my_list_pref");
        listpref.setTitle("Code For list preference");
        listpref.setSummary("完全用代码编写的首选项测试");
        listpref.setEntries(new String[]{"Entry 1","Entry 2","Entry 3"});
        listpref.setEntryValues(new String[]{"0","1","2"}); 
        screen.addPreference(listpref);
        // 将preference screen加入 preference fragment中
        setPreferenceScreen(screen);

    } 
}

利用preference保存状态

Preference的信息在设备中通过文件保存,我们可以利用这个特点来进行数据和状态的存贮,例如游戏的最高得分。下面的例子,利用preference存贮文件保存两个参数,“initialized”是boolean,表示应用是否第一次运行。“call_number”是个计数器,每次调用dataStore()方法就加一。

private final String INITIALIZER = "initialized";
private final String CALLNUM = "call_number";

private void dataStore(){ 
   //等同于PreferenceManager.getDefaultSharedPreferences(this);或者通过getShearedPreferences(name,mode)来指定文件名,可以通过editor来写。除了MODE_PRIVATE外,还有MODE_WORLD_READABLE和MODE_WORLD_WRITEABLE,这是用来创建preference是设置的权限。如果我们只限于本应用使用,可设置MODE_PRIVATE。
    SharedPreferences prefs = getPreferences(MODE_PRIVATE);  
    boolean hasPreferences = prefs.getBoolean(INITIALIZER, false);
    int num = prefs.getInt(CALLNUM, 0);
    if(hasPreferences){ 
        Log.d("PRO","We've been called " + num + " times before. ");
    }else{ 
        Log.d("PRO","First time ever being called.");
    }

    //写入preference
   Editor editor = prefs.edit(); 
   editor.putBoolean(INITIALIZER, true); 
   num ++; 
   editor.putInt(CALLNUM, num);
   editor.commit(); 
//或者editor.apply();
}

DialogPreference

DialogPreference是EditTextPreference和ListPreference的基类,如果我们需要有自己的弹框效果,可以继承DialogPreference来自定制layout,点击触发处理,并在onDialogClose()中处理写preference文件。

本博文涉及的例子代码,可以在Pro Android学习:Preference(首选项)小例子中下载。

相关链接:
我的Android开发相关文章

抱歉!评论已关闭.