我是Android新手,因此我需要一些指导,如何以编程方式将 EditTextPreference 对象添加到 PreferenceFragment 。
我从Web服务中提取值列表。我已将它们成功保存到 SharedPreferences ,并使用它们生成URL(路径部分)。
我希望我的应用的用户能够编辑这些值,但在Google上进行大量搜索后,我不清楚如何以编程方式添加 EditTextPreference < / strong>对象 PreferenceFragment 。
请注意,我的 PreferenceFragment 适用于 SharedPreferences 值,我将其硬编码为首选项xml文件( PreferenceScreen )。我也知道如何获得 SharedPreferences ,所以不要担心必须向我解释这部分内容。
我在 PreferenceFragment 的 onCreate 中使用 addPreferencesFromResource 。我应该在 onCreateView 中添加它们吗?我以为我可以获得 PreferenceCategory 并将其添加到那里?但同样,我不知道该怎么做。我真的很感激你的帮助!
//代码
PrefsFragment.java:
package com.example.lorddoineedhelp;
import android.os.Bundle;
import android.preference.PreferenceFragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
public class PrefsFragment extends PreferenceFragment {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.preferences);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View v = super.onCreateView(inflater, container, savedInstanceState);
// I am guessing I need to do something here?
return v;
}
}
PreferenceFragment的XML文件:
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<!-- Hard coded values -->
<PreferenceCategory
android:title="General">
<CheckBoxPreference
android:key="debug"
android:title="Debug"
android:summary="Enable Debug" />
</PreferenceCategory>
<PreferenceCategory android:title="Address">
<EditTextPreference
android:key="ipAddress"
android:title="IP Address"
android:summary="IP Address used for Image pings"
/>
<EditTextPreference
android:key="port"
android:title="Port"
android:summary="Port used for Image pings" />
</PreferenceCategory>
<!-- Where I want to add the values from my web service -->
<PreferenceCategory
android:title="Paths"
android:key="urlPaths">
</PreferenceCategory>
</PreferenceScreen>
答案 0 :(得分:14)
您可以添加偏好设置,例如EditTextPreference,CheckBox等,以编程方式在PreferenceFragment的“onCreate”方法中。
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Load "dummy" (empty) preferences from an XML resource
addPreferencesFromResource(R.xml.preferences_channelconfig);
PreferenceScreen screen = this.getPreferenceScreen(); // "null". See onViewCreated.
// Create the Preferences Manually - so that the key can be set programatically.
PreferenceCategory category = new PreferenceCategory(screen.getContext());
category.setTitle("Channel Configuration");
screen.addPreference(category);
CheckBoxPreference checkBoxPref = new CheckBoxPreference(screen.getContext());
checkBoxPref.setKey(channelConfig.getName() + "_ENABLED");
checkBoxPref.setTitle(channelConfig.getShortname() + "Enabled");
checkBoxPref.setSummary(channelConfig.getDescription());
checkBoxPref.setChecked(channelConfig.isEnabled());
category.addPreference(checkBoxPref);
}
关键步骤是addPreferencesFromResource(...)
,带有一个虚拟xml,用于将空的PreferenceScreen附加到片段。如果没有这个,就没有“顶层Preference作为Preference层次结构的根”,因此this.getPreferenceScreen()
返回Null。
我使用的XML只是:
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
android:orderingFromXml="true">
</PreferenceScreen>
希望能有所帮助。
答案 1 :(得分:0)
我不知道它是否适用于 onCreateView 方法,但它确实在 onViewCreated 中。 这是我的代码(在PreferenceFragment的子类中):
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
this.getPreferenceScreen().addPreference(new EditTextPreference(getActivity()));
}
答案 2 :(得分:0)
以下是通过程序创建PreferenceFragment的代码:
public class MyPreferenceFragment extends PreferenceFragment {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
PreferenceScreen screen = getPreferenceManager().createPreferenceScreen(getActivity());
setPreferenceScreen(screen);
EditTextPreference preference = new EditTextPreference(screen.getContext());
preference.setKey("EditTextPreference");
preference.setTitle("Edit Text Preference");
preference.setSummary("Click the preference to edit text.");
screen.addPreference(preference);
}
}