【问题标题】:How do I programmatically add EditTextPreferences to my PreferenceFragment?如何以编程方式将 EditTextPreferences 添加到我的 PreferenceFragment?
【发布时间】:2018-09-25 07:31:31
【问题描述】:

我是 Android 新手,所以我需要一些关于如何以编程方式EditTextPreference 对象添加到我的 PreferenceFragment 的指导。

我正在从 Web 服务中提取值列表。我已将它们成功保存到我的 SharedPreferences,并使用它们生成 URL(路径部分)。

我希望我的应用程序的用户能够编辑这些值,但在 Google 上进行大量搜索后,我不清楚如何以编程方式添加 EditTextPreference 对象到我的 PreferenceFragment

请注意,我的 PreferenceFragment 对于我将作为名称硬编码到首选项 xml 文件 (PreferenceScreen) 中的 SharedPreferences 值工作正常。我也知道如何获得我的 SharedPreferences,所以不用担心必须向我解释那部分。

我在 PreferenceFragmentonCreate 中使用 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>

【问题讨论】:

    标签: android preferencescreen edittextpreference


    【解决方案1】:

    您可以添加首选项,例如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>
    

    希望对某人有所帮助。

    【讨论】:

    • 这适用于无 xml 的偏好。实际上不需要虚拟 XML,可以使用它来代替: PreferenceScreen screen = getPreferenceManager().createPreferenceScreen(getActivity()); setPreferenceScreen(screen);
    【解决方案2】:

    这是以编程方式创建 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);
        }
    }
    

    【讨论】:

      【解决方案3】:

      我不知道它是否适用于 onCreateView 方法,但它适用于 onViewCreated。 这是我的代码(在 PreferenceFragment 的子类中):

      @Override
      public void onViewCreated(View view, Bundle savedInstanceState) {
          super.onViewCreated(view, savedInstanceState);
      
          this.getPreferenceScreen().addPreference(new EditTextPreference(getActivity()));
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-11-23
        • 2023-04-08
        • 1970-01-01
        • 2011-08-22
        • 2013-12-30
        • 1970-01-01
        • 2013-03-09
        • 1970-01-01
        相关资源
        最近更新 更多