是否可以将EditTextPreference与CheckBoxPreference结合使用?

时间:2012-03-16 08:37:46

标签: android preferenceactivity

我有一个PreferenceActivity,其中包括一个包含呼叫前转选项的类别。我想要的是偏好:

  • 如果用户按下右侧的复选框,则启用/禁用。
  • 如果用户按下文本(或首选项中的任何其他内容),则打开EditTextPreference对话框。

它可能没有任何用处,但这里是这个特殊偏好类别的片段:

    <PreferenceCategory
        android:title="@string/category_callforward">

    <EditTextPreference
            android:key="call_forward_always"
            android:title="@string/call_forward_always"
            android:summary="@string/call_forward_forwardto" />
    </PreferenceCategory>

编辑

如果可能,我想在此方法中实现它:

    // Locates the correct data from saved preferences and sets input type to numerics only
private void setCallForwardType()
{
    ep1 = (EditTextPreference) findPreference("call_forward_always");

    EditText et = (EditText) ep1.getEditText();
    et.setKeyListener(DigitsKeyListener.getInstance());

}

EDIT2

如果有人还在想 - 这就是我想要的偏好:

http://i.imgur.com/GHOeK.png

EDIT3

我现在已经搜索了几个小时并且想出了一个单词:'PreferenceGroupAdapter'。但是,我没有找到示例或教程向我展示如何使用它。建议?这甚至是正确的道路吗?

EDIT4

如果这真的不可能,我非常希望能够实现替代(编辑和复选框组合首选项)替代(用户友好)解决方案的建议。

3 个答案:

答案 0 :(得分:2)

你可以这样做。首先,为首选项创建一个类,该类应该从PreferenceActivity扩展。使用方式如下:

// editbox ise your EditTextPreference, so set it.  
checkbox = (CheckBoxPreference) findPreference("checkbox_preference");

checkbox.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
    public boolean onPreferenceChange(Preference preference, Object newValue) {
        if(newValue.toString().equals("false")) {
            PrefActivity.this.editbox.setEnabled(false);
        } else if(newValue.toString().equals("true")) {
            PrefActivity.this.editbox.setEnabled(true);
        }
        return true;
    }
});

我希望它有所帮助。

答案 1 :(得分:2)

有点晚了,但我想我已经成功创建了一个类似的对话框,创建了一个带有编辑文本和复选框的布局,应该可以在普通布局中做同样的事情:

 public class CheckEditTextPreference extends DialogPreference {
    private static final String KEY_PROPERTY_DISABLED = "key_property_disabled";
    private EditText editText;
    private CheckBox checkBox;
    private String text;
    private boolean isDisabled;
    private SharedPreferences mySharedPreferences = PreferenceManager.getDefaultSharedPreferences(getContext());

    public CheckEditTextPreference(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    @Override
    protected View onCreateDialogView() {
        return buildUi();
    }

    /**
     * Build a dialog using an EditText and a CheckBox
     */
    private View buildUi() {

        FrameLayout.LayoutParams layoutParams = new FrameLayout.LayoutParams(
                ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
        layoutParams.setMargins(25, 0, 0, 0);

        LinearLayout linearLayout = new LinearLayout(getContext());
        linearLayout.setOrientation(LinearLayout.VERTICAL);
        linearLayout.setLayoutParams(layoutParams);

        checkBox = new CheckBox(getContext());
        editText = new EditText(getContext());

        editText.setLayoutParams(layoutParams);
        checkBox.setLayoutParams(layoutParams);
        checkBox.setText("Disabled");

        FrameLayout dialogView = new FrameLayout(getContext());
        linearLayout.addView(editText);
        linearLayout.addView(checkBox);
        dialogView.addView(linearLayout);

        checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                editText.setEnabled(!isChecked);
            }
        });

        return dialogView;
    }

    @Override
    protected void onBindDialogView(View view) {
        super.onBindDialogView(view);
        checkBox.setChecked(isDisabled());
        editText.setText(getText());
    }

    @Override
    protected void onDialogClosed(boolean positiveResult) {
        if (positiveResult) {
            String text = editText.getText().toString();
            boolean isChecked = checkBox.isChecked();
            if (callChangeListener(text)) {
                setText(text);
            }

            if (callChangeListener(isChecked)) {
                isDisabled(isChecked);
            }
        }
    }

    @Override
    protected Object onGetDefaultValue(TypedArray a, int index) {
        return a.getString(index);
    }

    @Override
    protected void onSetInitialValue(boolean restorePersistedValue, Object defaultValue) {
        setText(restorePersistedValue ? getPersistedString("") : defaultValue.toString());
        isDisabled(mySharedPreferences.getBoolean(KEY_PROPERTY_DISABLED, true));
    }

    public void setText(String value) {
        this.text = value;
        persistString(this.text);
    }

    public String getText() {
        return this.text;
    }

    private void isDisabled(boolean value) {
        this.isDisabled = value;
        mySharedPreferences.edit().putBoolean(KEY_PROPERTY_DISABLED, this.isDisabled).apply();
    }

    public boolean isDisabled() {
        return this.isDisabled;
    }
}

并将其放入首选项屏幕:

    <your.package.name.CheckEditTextPreference
        android:key="chkEtPref"
        android:title="Title"/>

Disabled Enabled

答案 2 :(得分:1)

res/values/strings.xml中为CheckBoxPreference定义一个键。

CheckBoxPreference XML属性android:key="@string/THE_KEY_YOU_DEFINED"提供给SharedPreferences,以便自动保存状态。

为您的EditTextPreference提供XML属性android:dependency="@string/THE_KEY_YOU_DEFINED

EditTextPreference应启用/禁用,具体取决于CheckBoxPreference的状态。