PreferenceActivity 可以自定义它处理触摸的方式吗?

Can PreferenceActivity customize how it handles touches?

我最近被介绍给 PreferenceActivity,我想改变我处理与 xml 中定义的 EditTextPreference 交互的方式。

我已经将日志、toast 和断点放在样板文件被覆盖的地方 onListItemClick( 但没有任何回复。我什至尝试进入超级 class 并且能够在 ifreturn 上成功设置断点,尽管它们最终没有被捕获。

protected void onListItemClick(ListView l, View v, int position, long id) {
    if (!isResumed()) {
        return;
    }
    super.onListItemClick(l, v, position, id);

感谢观看

编辑 @DanielLe,这是我的代码:

//This isn't getting called?!
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
    String selection = l.getItemAtPosition(position).toString();
    Toast.makeText(this, selection, Toast.LENGTH_LONG).show();
    Log.d("Activity", "onListItemClick=" + l.getItemAtPosition(position).toString());
    super.onListItemClick(l, v, position, id);
}

冒着重复之前发生的事情的风险,一种解决方案是按照 Android dev 的 Google 指南中所述扩展 DialogPreferences。它只显示确定和取消按钮,我认为这是 persisting DialogPreferences 实现的最小值:

Android: Creating custom preference

import android.content.Context;
import android.content.DialogInterface;
import android.os.Parcel;
import android.os.Parcelable;
import android.preference.DialogPreference;
import android.preference.EditTextPreference;
import android.util.AttributeSet;
import android.widget.Button;
import android.widget.EditText;

public class ClickablePreference extends DialogPreference {
    private String mNewValue;
    private EditText mEditText;

    public ClickablePreference(Context context, AttributeSet attrs) {
        super(context, attrs);

        setDialogLayoutResource(R.layout.dir_picker_dialog);
        setPositiveButtonText(android.R.string.ok);
        setNegativeButtonText(android.R.string.cancel);

        setDialogIcon(null);
    }

    @Override
    protected void onDialogClosed(boolean positiveResult) {
        // When the user selects "OK", persist the new value
        if (positiveResult) {
            persistString(mNewValue);
        }
    }

    private static class SavedState extends BaseSavedState {
        // Member that holds the setting's value
        // Change this data type to match the type saved by your Preference
        String value;

        public SavedState(Parcelable superState) {
            super(superState);
        }

        public SavedState(Parcel source) {
            super(source);
            // Get the current preference's value
            value = source.readString();  // Change this to read the appropriate data type
        }

        @Override
        public void writeToParcel(Parcel dest, int flags) {
            super.writeToParcel(dest, flags);
            // Write the preference's value
            dest.writeString(value);  // Change this to write the appropriate data type
        }

        // Standard creator object using an instance of this class
        public static final Parcelable.Creator<SavedState> CREATOR =
                new Parcelable.Creator<SavedState>() {

                    public SavedState createFromParcel(Parcel in) {
                        return new SavedState(in);
                    }

                    public SavedState[] newArray(int size) {
                        return new SavedState[size];
                    }
                };
    }

    @Override
    protected void onSetInitialValue(boolean restorePersistedValue, Object defaultValue) {
        if (restorePersistedValue) {
            // Restore existing state
            mNewValue = this.getPersistedString("");
        } else {
            // Set default state from the XML attribute
            mNewValue = (String) defaultValue;
            persistString(mNewValue);
        }
    }

    @Override
    protected Parcelable onSaveInstanceState() {
        final Parcelable superState = super.onSaveInstanceState();
        // Check whether this Preference is persistent (continually saved)
        if (isPersistent()) {
            // No need to save instance state since it's persistent,
            // use superclass state
            return superState;
        }

        // Create instance of custom BaseSavedState
        final SavedState myState = new SavedState(superState);
        // Set the state's value with the class member that holds current
        // setting value
        myState.value = mNewValue;
        return myState;
    }

    @Override
    protected void onRestoreInstanceState(Parcelable state) {
        // Check whether we saved the state in onSaveInstanceState
        if (state == null || !state.getClass().equals(SavedState.class)) {
            // Didn't save the state, so call superclass
            super.onRestoreInstanceState(state);
            return;
        }

        // Cast state to custom BaseSavedState and pass to superclass
        SavedState myState = (SavedState) state;
        super.onRestoreInstanceState(myState.getSuperState());

        // Set this Preference's widget to reflect the restored state
        mEditText.setText(myState.value);
    }

    @Override
    protected void onClick() {
        super.onClick();
    }

    @Override
    public void onClick(DialogInterface dialog, int which) {
        super.onClick(dialog, which);
    }
}

我还没有详细查看 Concise way of writing new DialogPreference classes?,尽管它看起来与我从 Google 那里得到的非常相似。

这个解决方案的问题,除了它的大小,是 mEditText 未被使用,我实际上无法获取对 xml 中定义的显示 EditText 的引用。


滚动解决方案 2

感谢Android: launch a custom Preference from a PreferenceActivity

刚刚在 MyPreferenceActivity 的 onPostCreate 末尾标记了这个

protected void onPostCreate(Bundle savedInstanceState) {
    super.onPostCreate(savedInstanceState);
    setupSimplePreferencesScreen();
    Preference customPref = (Preference) findPreference("pref_do_something");
    customPref.setOnPreferenceClickListener(
            new Preference.OnPreferenceClickListener() {
                public boolean onPreferenceClick(Preference preference) {
                    Log.d("Activity", "onPreferenceClick=" + preference.toString());
                    return true;
                }
            });
}

好多了:)