Android - 带有首选项支持库的 EditTextPreference 中没有 getEditText 方法
Android - No getEditText method in EditTextPreference with Preference Support Library
我不得不更改为使用 PreferenceFragmentCompat 来实现权限检查,这意味着使用 EditTextPreference 的支持版本。不幸的是,似乎缺少 getEditText。有什么解决办法吗?
更新
发现此 issue 已记录。似乎它被故意删除了,但答案没有解释如何实现我想做的事情。
我使用的代码如下
final EditText editTextTL;
editTextTL = ((EditTextPreference) findPreference("my_preference")).getEditText();
editTextTL.setFilters(new InputFilter[]{new NumericRangeFilter()});
editTextTL.setOnFocusChangeListener(new AmountOnFocusChangeListener());
我的相关进口
import android.support.v7.preference.EditTextPreference;
import android.support.v7.preference.Preference;
import android.support.v7.preference.PreferenceCategory;
import android.support.v7.preference.PreferenceFragmentCompat;
我的 Gradle 依赖项
compile 'com.android.support:support-v4:23.0.1'
compile 'com.android.support:appcompat-v7:23.0.1'
compile 'com.android.support:preference-v14:23.0.1'
compile 'com.android.support:recyclerview-v7:23.0.1'
支持库中不缺少 getEditText()
可以获得EditText,
请检查您的支持库的版本
创建自定义 EditTextPreference:
public class CustomEditTextPreference extends EditTextPreference {
public CustomEditTextPreference(Context context, AttributeSet attrs, int defStyleAttr,
int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
}
public CustomEditTextPreference(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
public CustomEditTextPreference(Context context, AttributeSet attrs) {
super(context, attrs);
}
public CustomEditTextPreference(Context context) {
super(context);
}
}
在 xml 文件中声明它的首选项:
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<com.example.CustomEditTextPreference
android:key="test_key"
android:title="Title" />
</PreferenceScreen>
使用下一行更新您的 PreferenceFragmentCompat:
public class PrefFragment extends PreferenceFragmentCompat {
private static final String DIALOG_FRAGMENT_TAG =
"android.support.v7.preference.PreferenceFragment.DIALOG";
@Override
public void onCreatePreferences(Bundle bundle, String s) {
addPreferencesFromResource(R.xml.settings);
}
@Override
public void onDisplayPreferenceDialog(Preference preference) {
// check if dialog is already showing
if (getFragmentManager().findFragmentByTag(DIALOG_FRAGMENT_TAG) != null) {
return;
}
DialogFragment f = null;
if (preference instanceof CustomEditTextPreference) {
f = EditTextPreferenceDialog.newInstance(preference.getKey());
} else {
super.onDisplayPreferenceDialog(preference);
}
if (f != null) {
f.setTargetFragment(this, 0);
f.show(getFragmentManager(), DIALOG_FRAGMENT_TAG);
}
}
public static class EditTextPreferenceDialog extends EditTextPreferenceDialogFragmentCompat {
public static EditTextPreferenceDialog newInstance(String key) {
final EditTextPreferenceDialog
fragment = new EditTextPreferenceDialog();
final Bundle b = new Bundle(1);
b.putString(ARG_KEY, key);
fragment.setArguments(b);
return fragment;
}
@Override
protected void onBindDialogView(View view) {
super.onBindDialogView(view);
((EditText)view.findViewById(android.R.id.edit)).setFilters(new InputFilter[]{new NumericRangeFilter()});
}
}
}
也许这会有所帮助,我今天为此苦苦挣扎,我找到了基于片段的解决方案。假定已显示首选项对话框,此代码在单击 EditTextPreference 后起作用。
List<Fragment> fragments = getSupportFragmentManager().getFragments();
Fragment dialogFragment = null;
boolean dialogFragmentFound = false;
for (Fragment f : fragments) {
if (f != null) {
String tag = f.getTag();
if (tag != null) {
tag = tag.toLowerCase().trim();
if (tag.indexOf("preference") >= 0 && tag.indexOf("dialog") >= 0) {
dialogFragmentFound = true;
dialogFragment = f;
}
}
}
}
if (dialogFragmentFound) {
Dialog dialog = ((DialogFragment) dialogFragment).getDialog();
EditText ediText = dialog.findViewById(android.R.id.edit);
if (ediText != null)
ediText.setText("your text");
}
此致
使用AndroidX偏好库,setOnBindEditTextListener(...)
,Listener实现给出了EditText
元素,您可以根据需要自定义EditText。
2021:答案
为了更改 EditText
值或属性,您需要根据新的 AndroidX Kotlin 设置 setOnBindEditTextListener
回调。
findPreference<EditTextPreference>("key")?.setOnBindEditTextListener {
it.filters = arrayOf<InputFilter>(InputFilter.AllCaps())
}
我不得不更改为使用 PreferenceFragmentCompat 来实现权限检查,这意味着使用 EditTextPreference 的支持版本。不幸的是,似乎缺少 getEditText。有什么解决办法吗?
更新 发现此 issue 已记录。似乎它被故意删除了,但答案没有解释如何实现我想做的事情。
我使用的代码如下
final EditText editTextTL;
editTextTL = ((EditTextPreference) findPreference("my_preference")).getEditText();
editTextTL.setFilters(new InputFilter[]{new NumericRangeFilter()});
editTextTL.setOnFocusChangeListener(new AmountOnFocusChangeListener());
我的相关进口
import android.support.v7.preference.EditTextPreference;
import android.support.v7.preference.Preference;
import android.support.v7.preference.PreferenceCategory;
import android.support.v7.preference.PreferenceFragmentCompat;
我的 Gradle 依赖项
compile 'com.android.support:support-v4:23.0.1'
compile 'com.android.support:appcompat-v7:23.0.1'
compile 'com.android.support:preference-v14:23.0.1'
compile 'com.android.support:recyclerview-v7:23.0.1'
支持库中不缺少 getEditText()
可以获得EditText,
请检查您的支持库的版本
创建自定义 EditTextPreference:
public class CustomEditTextPreference extends EditTextPreference {
public CustomEditTextPreference(Context context, AttributeSet attrs, int defStyleAttr,
int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
}
public CustomEditTextPreference(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
public CustomEditTextPreference(Context context, AttributeSet attrs) {
super(context, attrs);
}
public CustomEditTextPreference(Context context) {
super(context);
}
}
在 xml 文件中声明它的首选项:
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<com.example.CustomEditTextPreference
android:key="test_key"
android:title="Title" />
</PreferenceScreen>
使用下一行更新您的 PreferenceFragmentCompat:
public class PrefFragment extends PreferenceFragmentCompat {
private static final String DIALOG_FRAGMENT_TAG =
"android.support.v7.preference.PreferenceFragment.DIALOG";
@Override
public void onCreatePreferences(Bundle bundle, String s) {
addPreferencesFromResource(R.xml.settings);
}
@Override
public void onDisplayPreferenceDialog(Preference preference) {
// check if dialog is already showing
if (getFragmentManager().findFragmentByTag(DIALOG_FRAGMENT_TAG) != null) {
return;
}
DialogFragment f = null;
if (preference instanceof CustomEditTextPreference) {
f = EditTextPreferenceDialog.newInstance(preference.getKey());
} else {
super.onDisplayPreferenceDialog(preference);
}
if (f != null) {
f.setTargetFragment(this, 0);
f.show(getFragmentManager(), DIALOG_FRAGMENT_TAG);
}
}
public static class EditTextPreferenceDialog extends EditTextPreferenceDialogFragmentCompat {
public static EditTextPreferenceDialog newInstance(String key) {
final EditTextPreferenceDialog
fragment = new EditTextPreferenceDialog();
final Bundle b = new Bundle(1);
b.putString(ARG_KEY, key);
fragment.setArguments(b);
return fragment;
}
@Override
protected void onBindDialogView(View view) {
super.onBindDialogView(view);
((EditText)view.findViewById(android.R.id.edit)).setFilters(new InputFilter[]{new NumericRangeFilter()});
}
}
}
也许这会有所帮助,我今天为此苦苦挣扎,我找到了基于片段的解决方案。假定已显示首选项对话框,此代码在单击 EditTextPreference 后起作用。
List<Fragment> fragments = getSupportFragmentManager().getFragments();
Fragment dialogFragment = null;
boolean dialogFragmentFound = false;
for (Fragment f : fragments) {
if (f != null) {
String tag = f.getTag();
if (tag != null) {
tag = tag.toLowerCase().trim();
if (tag.indexOf("preference") >= 0 && tag.indexOf("dialog") >= 0) {
dialogFragmentFound = true;
dialogFragment = f;
}
}
}
}
if (dialogFragmentFound) {
Dialog dialog = ((DialogFragment) dialogFragment).getDialog();
EditText ediText = dialog.findViewById(android.R.id.edit);
if (ediText != null)
ediText.setText("your text");
}
此致
使用AndroidX偏好库,setOnBindEditTextListener(...)
,Listener实现给出了EditText
元素,您可以根据需要自定义EditText。
2021:答案
为了更改 EditText
值或属性,您需要根据新的 AndroidX Kotlin 设置 setOnBindEditTextListener
回调。
findPreference<EditTextPreference>("key")?.setOnBindEditTextListener {
it.filters = arrayOf<InputFilter>(InputFilter.AllCaps())
}