gpt4 book ai didi

android - 如何不使用 XML 文件而是使用 Java 将 header 和首选项对象添加到 PreferenceActivity?

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:21:47 26 4
gpt4 key购买 nike

我有 PreferenceFragment 和 PreferenceActivity,我通过这种方式从 XML 文件添加 header :

偏好 Activity

@Override
public void onBuildHeaders(List<Header> target) {
if(DEBUG) Log.i("PreferenceActivity", "onBuildHeaders() -> LogicAnalizerPrefs");
if(android.os.Build.VERSION.SDK_INT >= 12) {
loadHeadersFromResource(R.xml.preference_header_logicanalizer, target);
}
}

PreferenceFragment:

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

if(DEBUG) Log.i("PreferenceFragment", "onCreate() -> LogicAnalizerPrefsFragment");
int res = getActivity().getResources().getIdentifier(getArguments().getString("logicprefsheaders"), "xml", getActivity().getPackageName());
addPreferencesFromResource(res);
}

我有 header 的 XML 文件是:

R.xml.preference_header_logicanalizer:

<header
android:fragment="com.protocolanalyzer.andres.LogicAnalizerPrefsFragment"
android:icon="@drawable/settings"
android:title="General" >
<extra
android:name="logicprefsheaders"
android:value="logicgeneral" />
</header>
<header
android:fragment="com.protocolanalyzer.andres.LogicAnalizerPrefsFragment"
android:icon="@drawable/settings"
android:title="Canal 1" >
<extra
android:name="logicprefsheaders"
android:value="c1analizerprefs" />
</header>
<header
android:fragment="com.protocolanalyzer.andres.LogicAnalizerPrefsFragment"
android:icon="@drawable/settings"
android:title="Canal 2" >
<extra
android:name="logicprefsheaders"
android:value="c2analizerprefs" />
</header>
<header
android:fragment="com.protocolanalyzer.andres.LogicAnalizerPrefsFragment"
android:icon="@drawable/settings"
android:title="Canal 3" >
<extra
android:name="logicprefsheaders"
android:value="c3analizerprefs" />
</header>
<header
android:fragment="com.protocolanalyzer.andres.LogicAnalizerPrefsFragment"
android:icon="@drawable/settings"
android:title="Canal 4" >
<extra
android:name="logicprefsheaders"
android:value="c4analizerprefs" />
</header>

这是我的一个 xml 文件,用于在单击标题时显示其中一个首选项:

c1analizerprefs.xml:

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" >

<PreferenceCategory android:title="@string/AnalyzerProtocolTitle1" >
<ListPreference
android:defaultValue="0"
android:entries="@array/protocolList"
android:entryValues="@array/protocolValues"
android:key="protocol1"
android:summary="@string/AnalyzerProtocolSummary"
android:title="@string/AnalyzerProtocolTitle1" />
<ListPreference
android:defaultValue="1"
android:entries="@array/channelNames"
android:entryValues="@array/protocolValues"
android:key="SCL1"
android:summary="@string/AnalyzerSCLSummary"
android:title="@string/AnalyzerSCLTitle" />

<EditTextPreference
android:defaultValue="9600"
android:title="@string/AnalyzerBaudTitle"
android:key="BaudRate1"
android:summary="@string/AnalyzerBaudSummary"
android:inputType="number" />
</PreferenceCategory>

</PreferenceScreen>

所以在大屏幕上我有this结果符合预期,我只使用一个 PreferenceFragment 来添加我的 4 个 header 。

但我在 XML 中定义的四个首选项(如 c1analizerprefs.xml)几乎相同,唯一的变化是数字(例如:Pref. 1、Pref. 2、...)所以我想在 Java 中添加它们我可以使用 for() 添加 4 个或更多首选项,轻松更改重复次数,因为文本始终相同,我只更改一个数字,这样我就不需要为每个首选项创建一个 XML 文件,我在 Java 中动态创建它们。

如何在 Java 中向 header 添加首选项而不是使用 XML 文件?在 PreferenceFragment 中,我只有 addPreferencesFromResource() 或 addPreferencesFromIntent()。有什么方法可以添加首选项对象吗?

最佳答案

以防万一有人真的在寻找一些代码......

以下示例从 XML 加载一些 header ,然后以编程方式附加到它们。

在您的 PreferenceActivity 中第一次覆盖 onBuildHeaders:

@Override
public void onBuildHeaders(List<Header> target) {
loadHeadersFromResource(R.xml.preference_headers, target);

// Add layer as a new settings header
Header header = new Header();
header.title = "More Settings";
header.summary = "Change even more settings";
header.fragment = SettingsFragment.class.getName();

Bundle b = new Bundle();
b.putString("category", "MoreSettings");
header.fragmentArguments = b;
target.add(header);
}

然后在您的 PreferenceActivity 中覆盖 onHeaderClick。请注意,您将 header 的 fragmentArguments 传递给 fragment ,以便您可以检测单击了哪个 header (类别):

@Override
public void onHeaderClick(Header header, int position) {
this.startPreferencePanel(SettingsFragment.class.getName(), header.fragmentArguments, header.titleRes, header.title, null, 0);
}

然后在您的 PreferenceFragment 中覆盖 onCreate:

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

if (savedInstanceState == null) {
mCategory = getArguments().getString("category");
}
else {
// Orientation Change
mCategory = savedInstanceState.getString("category");
}

if (mCategory.equals("Map")) {
// Load the preferences from an XML resource
addPreferencesFromResource(R.xml.preferences_map);
}
if (mCategory.equals("MoreSettings")) {
// Load the preferences from an XML resource
PreferenceScreen preferenceScreen = getPreferenceManager().createPreferenceScreen(getActivity());
// add prefrences using preferenceScreen.addPreference()
this.setPreferenceScreen(preferenceScreen);
}
}

如果您想查看预定义 header 的 xml。

res/xml/preference_headers.xml

<?xml version="1.0" encoding="utf-8"?>
<preference-headers xmlns:android="http://schemas.android.com/apk/res/android">
<header
android:fragment="com.appName.fragments.SettingsFragment"
android:title="@string/pref_category_map_title"
android:summary="@string/pref_category_map_sum" >
<!-- key/value pairs can be included as arguments for the fragment. -->
<extra android:name="category" android:value="Map" />
</header>
</preference-headers>

res/xml/preferences_map.xml

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<CheckBoxPreference
android:key="pref_zoomToCurrentLocationOnStart"
android:title="@string/pref_zoomToCurrentLocationOnStart_title"
android:summary="@string/pref_zoomToCurrentLocationOnStart_sum"
android:defaultValue="true" />
<CheckBoxPreference
android:key="pref_myLocation"
android:title="@string/pref_myLocation_title"
android:summary="@string/pref_myLocation_sum"
android:defaultValue="true" />
</PreferenceScreen>

关于android - 如何不使用 XML 文件而是使用 Java 将 header 和首选项对象添加到 PreferenceActivity?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15749698/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com