2015-09-09 14 views
6

Ho appena dovuto passare a utilizzare PreferenceFragmentCompat per l'implementazione del controllo delle autorizzazioni che significa utilizzare la versione di supporto di EditTextPreference. Sfortunatamente sembra che getEditText sia mancante. C'è qualche problema?Android - Nessun metodo getEditText in EditTextPreference con la libreria di supporto delle preferenze

Aggiornamento Trovato questo issue registrato. Sembra che sia stato deliberatamente rimosso, ma la risposta non spiega come implementare ciò che voglio fare.

Il codice che usavo è la seguente

final EditText editTextTL; 
editTextTL = ((EditTextPreference) findPreference("my_preference")).getEditText(); 
editTextTL.setFilters(new InputFilter[]{new NumericRangeFilter()}); 
editTextTL.setOnFocusChangeListener(new AmountOnFocusChangeListener()); 

miei importazioni rilevanti

import android.support.v7.preference.EditTextPreference; 
import android.support.v7.preference.Preference; 
import android.support.v7.preference.PreferenceCategory; 
import android.support.v7.preference.PreferenceFragmentCompat; 

mio Gradle dipendenze

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

Se si desidera utilizzare un più potente (* vale a dire. utilizzando XML per impostare gli attributi invece di impostare dal codice *) versione della soluzione accettata, ti consiglio di dare un'occhiata alle mie soluzioni alternative '** Cose interessanti ** parte: https://github.com/Gericop/Android- Support-Preference-V7-Fix –

+0

Grazie per il collegamento, avevo bisogno di fare alcune cose che gli attributi da soli non avrebbero affrontato ma gli elementi di stile sarebbero stati utili. Incredibile quanto è rotto con questo supporto lib. – CodeChimp

+0

Ho segnalato un bug per Google, per favore recitalo in modo che possa essere trattato: https://code.google.com/p/android/issues/detail?id=233169&q=EditTextPreference&colspec=ID%20Status%20Priority%20Owner % 20Summary% 20Stars% 20Reporter% 20Apened –

risposta

0

Crea EditTextPreference personalizzato:

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

dichiararlo nel file XML per Preferenze di Google:

<?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> 

Aggiorna il tuo PreferenceFragmentCompat con le prossime righe:

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

Non c'è getDialog su EditTextPreference all'interno di Preferential Support Lib, stavo pensando anch'io a linee simili. – CodeChimp

+0

Ho aggiornato la risposta. Dovrebbe funzionare ora –

+0

L'ho implementato e posso vedere init e onFocusChange essere chiamati quando eseguo il debug. Ma non ottiene il valore dalla preferenza o lo imposta quando viene premuto OK, quindi la mia preferenza di sommario/persistente non viene aggiornata. Certo qualcos'altro deve essere implementato ma non è sicuro di cosa. – CodeChimp

-1

getEditText() non manca nella libreria di supporto

controlla il link https://github.com/consp1racy/android-support-preference/blob/master/library/src/main/java/net/xpece/android/support/preference/EditTextPreference.java

È possibile ottenere EditText,

si prega di verificare la versione del vostro libreria di supporto

+0

Vedo che la libreria utilizza android.support.v7.widget.AppCompatEditText; findPreference all'interno di PreferenceFragmentCompat non può trasmettere a quel tipo. Sto usando com.android.support:preference-v14:23.0.1 – CodeChimp

+2

Questa non è la libreria di supporto ufficiale. –