Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android首选项:XML对象引用_Android_Platform_Preference - Fatal编程技术网

Android首选项:XML对象引用

Android首选项:XML对象引用,android,platform,preference,Android,Platform,Preference,我正在Android的基本设置应用程序中开发一个偏好屏幕。简而言之,我发现很难访问首选项本身的视图对象:我希望根据一些文件输入设置开关的值 我正在从不推荐的方法加载首选项屏幕: addPreferencesFromResource(R.xml.preferences); 现在我正在尝试: switchOn = (Switch) getActivity().findViewById(getPreferenceManager().findPreference("myPreference").get

我正在Android的基本设置应用程序中开发一个偏好屏幕。简而言之,我发现很难访问首选项本身的视图对象:我希望根据一些文件输入设置开关的值

我正在从不推荐的方法加载首选项屏幕:

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