2015-09-09 2 views
6

Мне просто пришлось перейти на использование PreferenceFragmentCompat для реализации проверки разрешений, что означает использование версии поддержки EditTextPreference. К сожалению, кажется, что getEditText отсутствует. Есть ли какая-нибудь работа?Android - Нет метода getEditText в EditTextPreference с библиотекой поддержки предпочтений

Обновление Найдено 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' 
+1

Если вы хотите использовать более мощный (* т.е. используя XML для установки атрибутов вместо установки из кода *) версии принятого решения, я рекомендую вам взглянуть на мои обходные пути ** Интересные вещи ** часть: https://github.com/Gericop/Android- Support-Preference-V7-Fix –

+0

Спасибо за ссылку, мне нужно было сделать кое-что, что только атрибуты не справятся, но стилистические элементы будут полезны. Удивительно, сколько сломано с этой поддержкой lib. – CodeChimp

+0

Я сообщил об ошибке для Google, пожалуйста, запустите ее, чтобы ее можно было решить: https://code.google.com/p/android/issues/detail?id=233169&q=EditTextPreference&colspec=ID%20Status%20Priority%20Owner % 20Summary% 20Stars% 20Reporter% 20Opened –

ответ

0

Создание пользовательских 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-файл для prefences:

<?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()}); 
    } 

} 

}

+0

Нет никакого getDialog на EditTextPreference внутри Preference Support Lib, я тоже думал о подобных строках. – CodeChimp

+0

Я обновил ответ. Теперь он должен работать –

+0

Я реализовал это и могу видеть, как init и onFocusChange вызывается при отладке. Но он не получает значение из предпочтения или не устанавливает его при нажатии OK, поэтому мое резюме/сохраненное предпочтение не обновляется. Конечно, что-то еще нужно реализовать, но не уверен, что. – CodeChimp

-1

getEditText() не хватает в поддержку библиотеки

проверить ссылку https://github.com/consp1racy/android-support-preference/blob/master/library/src/main/java/net/xpece/android/support/preference/EditTextPreference.java

Вы можете получить EditText,

пожалуйста, проверьте версию вашей библиотеки поддержки

+0

Я вижу, что библиотека использует android.support.v7.widget.AppCompatEditText; findPreference внутри PreferenceFragmentCompat не может использовать этот тип. Я использую com.android.support:preference-v14:23.0.1 – CodeChimp

+2

Это не официальная библиотека поддержки. –

Смежные вопросы