【问题标题】:How to use DatePickerFragment inside PreferenceFragment to get Date如何在 PreferenceFragment 中使用 DatePickerFragment 来获取日期
【发布时间】:2014-11-24 08:08:33
【问题描述】:

我想在 PreferenceFragment 中使用 DatePickerFragment 作为出生日期。我们可以像使用 EditTextPreference 或其他任何我们必须使用的方式一样使用它吗?我知道 DatePickerFragemnt 和 PreferenceFragment 的基本功能。

如有任何帮助,我们将不胜感激。

已编辑

偏好设置的.xml 文件

    <PreferenceCategory android:title="@string/pref_profile_setting" >
        <EditTextPreference
                android:title="@string/pref_user_name"
                android:summary="@string/pref_user_name_summary"
                android:key="prefName"/>

        <com.mypkg.DatePickerFragment
            android:title="@string/pref_gender"
                android:summary="@string/pref_postcode_summary"
                android:key="prefDob"
                />
        <ListPreference
                android:title="@string/pref_gender"
                android:summary="@string/pref_postcode_summary"
                android:key="prefGender"
                android:entries="@array/gender"
                android:entryValues="@array/gender_type"/>

    </PreferenceCategory>
</PreferenceScreen>

扩展 PreferenceFragment 的类

public class MyFragment extends PreferenceFragment implements OnPreferenceChangeListener{


    private EditTextPreference etNamePref;
    private ListPreference lvGenderPref;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        addPreferencesFromResource(R.xml.pref_settings);

    }

    @Override
    public View onCreateView(LayoutInflater inflater,
            ViewGroup container, Bundle paramBundle) {
        View view = inflater.inflate(R.layout.fragment_settings, container, false);
        initView();

        return view;
    }


    private void initView() {
         etNamePref = (EditTextPreference)findPreference(ConstantsUtil.PREF_NAME);
         etNamePref.setOnPreferenceChangeListener(this);

    }


    @Override
    public boolean onPreferenceChange(Preference preference, Object newValue) {
        String key = preference.getKey();
        if(key.equalsIgnoreCase(ConstantsUtil.PREF_NAME)){
            etNamePref.setSummary(newValue.toString());
        }
        return false;
    }
}

【问题讨论】:

    标签: android android-fragments preferenceactivity preferencefragment


    【解决方案1】:

    在您的 .xml 文件中添加偏好标记

    <PreferenceCategory android:title="@string/pref_profile_setting" >
            <EditTextPreference
                    android:title="@string/pref_user_name"
                    android:summary="@string/pref_user_name_summary"
                    android:key="prefName"/>
    
    <Preference android:title="@string/pref_select_dob"
                 android:key="prefDob" >
            <ListPreference
                    android:title="@string/pref_gender"
                    android:summary="@string/pref_postcode_summary"
                    android:key="prefGender"
                    android:entries="@array/gender"
                    android:entryValues="@array/gender_type"/>
    
        </PreferenceCategory>
    </PreferenceScreen>
    

    在 .java 类中实现 OnPreferenceClickListener 及以下代码

    Preference preference = (Preference)findPreference("prefDob");
            preference.setOnPreferenceClickListener(this);
    

    在 onClick 内部调用 DatePickerFragment,如下所示

    @Override
        public boolean onPreferenceClick(Preference preference) {
            String key = preference.getKey();
            if(key.equalsIgnoreCase("prefDob")){
                showDatePicker();
            }
            return false;
        }
    
        protected void showDatePicker() {
    
            DatePickerFragment date = new DatePickerFragment();
    
             /**
             * Set Up Current Date Into dialog
             */
    
            Calendar calender = Calendar.getInstance();
            Bundle args = new Bundle();
            args.putInt("year", calender.get(Calendar.YEAR));
            args.putInt("month", calender.get(Calendar.MONTH));
            args.putInt("day", calender.get(Calendar.DAY_OF_MONTH));
            date.setArguments(args);
    
             /**
             * Set Call back to capture selected date
             */
    
            date.setCallBack(ondate);
            date.show(getFragmentManager(), "Date Picker");
    
        }
        OnDateSetListener ondate = new OnDateSetListener() {
            @Override
            public void onDateSet(DatePicker view, int year, int monthOfYear,
                    int dayOfMonth) {
                String dob = String.valueOf(dayOfMonth) + "/" + String.valueOf(monthOfYear)+ "/" + String.valueOf(year);
    
            }
        };
    

    完成!

    【讨论】:

      【解决方案2】:

      您必须为此创建自己的自定义DialogPreference,如下所示

      public class DatePickerPreference extends DialogPreference {
      
      
          public DatePickerPreference(Context context, AttributeSet attrs) {
              super(context, attrs);
          }
      
          public DatePickerPreference(Context context, AttributeSet attrs, int defStyle) {
              super(context, attrs, defStyle);
          }
      
          @Override
          protected void onSetInitialValue(boolean restorePersistedValue, Object defaultValue) {
              // TODO :: Set the initial value of the Preference.
          }
      
          @Override
          protected View onCreateDialogView() {
              return new DatePicker(getContext());
          }
      
          @Override
          protected void onDialogClosed(boolean positiveResult) {
              // TODO :: Save data to the SharedPreferences.
          }
      
      }
      

      【讨论】:

      • 那么如何从 PrefrenceFragment 打开该对话框首选项?此外,我将在 xml 文件中放置哪个控件以显示日期,并在选择该控件时打开自定义对话框片段。
      • 您可以将其直接添加到您的首选项屏幕 xml,
      • 不能这样工作。此外,如果添加了它,那么如何调用 DatePickerFragment 来代替 DialogPreference。 ?
      • 如果您将上述视图(直接使用 DatePicker 而不使用片段容器)添加到您的首选项 xml,当您单击它时,您应该会看到一个带有 DatePicker 视图的对话框。我可能在这里错过了你的观点,你能解释一下什么不起作用吗?
      • 见我在上面添加了代码。你能告诉我我需要在哪里改变吗?
      猜你喜欢
      • 1970-01-01
      • 2015-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-27
      相关资源
      最近更新 更多