Android首选项:XML对象引用
我正在Android的基本设置应用程序中开发一个偏好屏幕。简而言之,我发现很难访问首选项本身的视图对象:我希望根据一些文件输入设置开关的值 我正在从不推荐的方法加载首选项屏幕:Android首选项:XML对象引用,android,platform,preference,Android,Platform,Preference,我正在Android的基本设置应用程序中开发一个偏好屏幕。简而言之,我发现很难访问首选项本身的视图对象:我希望根据一些文件输入设置开关的值 我正在从不推荐的方法加载首选项屏幕: addPreferencesFromResource(R.xml.preferences); 现在我正在尝试: switchOn = (Switch) getActivity().findViewById(getPreferenceManager().findPreference("myPreference").get
addPreferencesFromResource(R.xml.preferences);
现在我正在尝试:
switchOn = (Switch) getActivity().findViewById(getPreferenceManager().findPreference("myPreference").getLayoutResource());
除了感觉不好和不对劲之外,它似乎真的不起作用。当我尝试计算getLayoutResource()部分时,它给了我一个字符串(文档中说它返回一个int),该字符串是“res/layout/preference_holo.xml”
谢谢你的阅读
编辑:我想指定/注意,包含此代码的类扩展了PreferenceFragment。以下是伊利诺伊大学的Lawrence Angrave为Coursera Android应用程序类提供的代码。我在评论中指出,我在他给我们的东西上添加了行或方法。总体上看,您似乎遇到了问题,所以我给了您一系列代码,看看什么是有效的。也许您可以将其与您的代码进行比较,并查看您可能想要进行的一些更改 请注意,当您从设置活动获取用户输入时,您只能获取字符串。当您通过代码获取您在SharedReferences中放入的首选项时,您就有了更多的灵活性,例如使用浮点、整数等
package your.package.name;
import android.annotation.TargetApi;
import android.app.Activity;
import android.app.Fragment;
import android.app.FragmentTransaction;
import android.os.Build;
import android.os.Bundle;
import android.preference.PreferenceActivity;
import android.preference.PreferenceFragment;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
public class PreferencesActivity extends PreferenceActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB ) {
showPreferencesPreHoneycomb();
}
else {
showPreferencesFragmentStyle(savedInstanceState);
}
}
private void showPreferencesFragmentStyle(Bundle savedInstanceState) {
if (savedInstanceState == null) { // if we are going through for the first time
FragmentTransaction transaction = getFragmentManager().beginTransaction();
Fragment fragment = new MyPreferencesFragment();
transaction.replace(android.R.id.content, fragment);
transaction.commit();
}
}
@SuppressWarnings("deprecation")
private void showPreferencesPreHoneycomb() {
// this file is in res/xml (not layout!)
addPreferencesFromResource(R.xml.penguin_prefs);
}
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
public static class MyPreferencesFragment extends PreferenceFragment
// I added next two lines
implements OnSharedPreferenceChangeListener {
private SharedPreferences mPrefs;
public void OnAttach(Activity activity) {
super.onAttach(activity);
}
// I added this method
@Override
public void onPause() {
// DONT FORGET TO DO THIS!!!
// If you don't, the old fragments cause Illegal Exceptions!
mPrefs.unregisterOnSharedPreferenceChangeListener(this);
super.onPause();
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// this file is in res/xml (not res/layout!)
this.addPreferencesFromResource(R.xml.penguin_prefs);
// I added next two lines
mPrefs = getPreferenceScreen().getSharedPreferences();
mPrefs.registerOnSharedPreferenceChangeListener(this);
return super.onCreateView(inflater, container, savedInstanceState);
}
};
// Here is some of my code processing user inputs on the Settings Page
@Override
public void onSharedPreferenceChanged(SharedPreferences p, String key) {
// Here we are validating the user input and...
// updating the "summary" field on the menu to show the new values that
// the user just input or default values if the user entered junk
int pointsToWin;
float paddleHeight;
// Limit points_to_win to 21, with a default of 11
if (key.equals(getResources().getString(R.string.points_to_win_key))) {
try {
pointsToWin = Integer.parseInt(p.getString(key,
getResources().getString(R.string.eleven)));
} catch (Exception ex) {
// user put in garbage, so fix it.
pointsToWin = 22;
}
if (pointsToWin < 1 || pointsToWin > 21) {
SharedPreferences.Editor editor = p.edit();
editor.putString(key,
getResources().getString(R.string.eleven));
editor.commit();
}
}
// Limit paddle height to > 4% and < 75%
else if (key.equals(getResources().getString(R.string.paddle_height_key))) {
try {
paddleHeight = Integer.parseInt(p.getString(key,
getResources().getString(R.string.seventeen)));
} catch (Exception ex) {
// user put in garbage, so fix it.
paddleHeight = 100.0f;
}
if (paddleHeight < 4.0f || paddleHeight > 75.0f) {
SharedPreferences.Editor editor = p.edit();
editor.putString(key,
getResources().getString(R.string.seventeen));
editor.commit();
}
}
}
打包您的.package.name;
导入android.annotation.TargetApi;
导入android.app.Activity;
导入android.app.Fragment;
导入android.app.FragmentTransaction;
导入android.os.Build;
导入android.os.Bundle;
导入android.preference.PreferenceActivity;
导入android.preference.PreferenceFragment;
导入android.util.Log;
导入android.view.LayoutInflater;
导入android.view.view;
导入android.view.ViewGroup;
公共类PreferenceActivity扩展了PreferenceActivity{
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
if(Build.VERSION.SDK\u INT21){
sharedReferences.Editor=p.edit();
编辑器.putString(键,
getResources().getString(R.string.eleven));
commit();
}
}
//将桨叶高度限制在>4%和<75%
else if(key.equals(getResources().getString(R.string.palle\u height\u key))){
试一试{
pableHeight=Integer.parseInt(p.getString(键,
getResources().getString(R.string.seven));
}捕获(例外情况除外){
//用户放入垃圾,所以修复它。
桨叶高度=100.0f;
}
如果(桨叶高度<4.0f | |桨叶高度>75.0f){
sharedReferences.Editor=p.edit();
编辑器.putString(键,
getResources().getString(R.string.seven));
commit();
}
}
}
希望这有帮助!它仍然感觉不对劲,但您可能希望尝试使用
getWidgetLayoutResource()
而不是getLayoutResource()
无论如何,如果您只想设置开关值,您可以这样做
((SwitchPreference)getPreferenceManager().findPreference("myPreference")).setChecked(checked)
哦,我刚才又读到你在设置一个开关。这是我的代码:private void setBooleanPref(String key,boolean b){if(mPrefs.getBoolean(key,b)!=b){//它还没有设置为我们想要的,所以把它设置为SharedPreferences.Editor=mPrefs.edit();Editor.putBoolean(key,b);Editor.commit();}下面是对它的调用:setBooleanPref(getResources().getString(R.string.numPlayers_key),false);这似乎起作用了。您的代码示例似乎缺少一些导入语句,但我的应用程序不再cra