2012-03-16 17 views
6

Possiedo un PreferenceActivity con, tra le altre cose, una categoria che include opzioni di inoltro delle chiamate. Quello che voglio è una preferenza che:È possibile combinare un EditTextPreference con un CheckBoxPreference?

  • Abilita/disabilita se l'utente preme una casella di controllo sulla destra.
  • apre la finestra di dialogo EditTextPreference se l'utente preme il testo (o qualsiasi altra cosa nella preferenza)

Probabilmente non è di alcuna utilità, ma qui è un frammento di questo particolare preferencecategory:

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

EDIT

mi piacerebbe per la sua attuazione in questo metodo, se possibile:

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

Se qualcuno è ancora chiedendo - questo è quello che voglio come preferenza:

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

Edit3

ho scottare Ched in giro per un paio d'ore e hanno escogitato una sola parola: 'PreferenceGroupAdapter'. Non ho, tuttavia, stato in grado di trovare esempi o tutorial che mi mostrano come usarlo. Suggerimenti? È questa anche la strada giusta da percorrere?

edit4

Se questo non è davvero forse mi piacerebbe molto un suggerimento per una soluzione (user-friendly), che posso realizzare al posto della preferenza Modifica- e Casella combinata alternativa.

+0

Hai mai riesce a risolvere questo problema? Ho cercato di creare una preferenza personalizzata come questa, con la casella di controllo nella riga delle preferenze o incorporata nella finestra di dialogo delle preferenze, ma questo è l'unico riferimento che sono riuscito a trovare ovunque. –

+0

@ SeanO'Toole Vedi se la mia risposta è di aiuto. – theblang

risposta

2

È possibile farlo. Innanzitutto, crea una classe per le preferenze che dovrebbe essere estesa da PreferenceActivity. Utilizzare in questo modo:

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

Spero che sia d'aiuto.

+0

Ho già il mio SettingsActivity che, ovviamente, estende PreferenceActivity. Non posso semplicemente creare un metodo all'interno di questa classe che segue il tuo suggerimento? Inoltre. stai usando findPreference(). Dovrebbero essere aggiunte programmaticamente queste voci di chechbox in onCreate()? – CodePrimate

+0

Sì, crea un metodo chiamato 'ascoltatori' e chiama il metodo' onCreate'. Funzionerà. –

+0

Ho modificato il mio commento :) – CodePrimate

1

Definire una chiave in res/values/strings.xml per il proprio CheckBoxPreference.

Assegnare l'attributo XML android:key="@string/THE_KEY_YOU_DEFINED" in modo che salvi automaticamente lo stato in SharedPreferences.

Fornire l'attributo XML android:dependency="@string/THE_KEY_YOU_DEFINEDEditTextPreference.

Il EditTextPreference deve quindi abilitare/disabilitare in base allo stato dello CheckBoxPreference.

0

un po 'tardi, ma penso che sono riuscito a creare qualcosa di simile la creazione di questa classe che crea un layout con un testo di modifica e una casella di controllo:

public class CheckEditTextPreference extends DialogPreference { 
    protected static final String chkKey="ChkKey"; 
    private EditText editText; 
    private CheckBox checkBox; 
    private String etValue; 
    private boolean chkValue; 
    SharedPreferences mySharedPreferences = PreferenceManager.getDefaultSharedPreferences(getContext()); 

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

    } 

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

    @Override 
    protected View onCreateDialogView() { 
     FrameLayout.LayoutParams layoutParams = new FrameLayout.LayoutParams(
       ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT); 
     layoutParams.setMargins(25, 0, 0, 0); 
     LinearLayout llChkEtPreference=new LinearLayout(getContext()); 
     llChkEtPreference.setOrientation(LinearLayout.VERTICAL); 
     llChkEtPreference.setLayoutParams(layoutParams); 
     checkBox=new CheckBox(getContext()); 
     editText = new EditText(getContext()); 
     editText.setLayoutParams(layoutParams); 
     checkBox.setLayoutParams(layoutParams); 
     checkBox.setText("Disabled"); 
     FrameLayout dialogView = new FrameLayout(getContext()); 
     llChkEtPreference.addView(editText); 
     llChkEtPreference.addView(checkBox); 
     dialogView.addView(llChkEtPreference); 
     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(getValueChk()); 
     editText.setText(getValueEt()); 
    } 

    @Override 
    protected void onDialogClosed(boolean positiveResult) { 
     if (positiveResult) { 
      String newValue = editText.getText().toString(); 
      boolean newValueChk=checkBox.isChecked(); 
      if (callChangeListener(newValue)) { 
       setValueEt(newValue); 
      } 
      if(callChangeListener(newValueChk)) 
      { 
       setValueChk(newValueChk); 
      } 
     } 
    } 

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

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

    public void setValueEt(String value) { 
     this.etValue = value; 
     persistString(this.etValue); 
    } 

    public String getValueEt() { 
     return this.etValue; 
    } 
    public void setValueChk(boolean value) { 
     this.chkValue = value; 
     mySharedPreferences.edit().putBoolean(chkKey, this.chkValue).apply(); 
    } 

    public boolean getValueChk() { 
     return this.chkValue; 
    } 
} 

E mettere questo in tue preferenze (ricordare che " . android.example.example.com.androiddemo" è il nome del pacchetto):

<android.example.example.com.androiddemo.CheckEditTextPreference 
     android:key="chkEtPref" 
     android:title="Title"/> 

Per ottenere i dati si può provare qualcosa di simile a questo esempio nella vostra attività principale:

if(!mySharedPreferences.getBoolean(CheckEditTextPreference.chkKey, true)) 
    Toast.makeText(this, mySharedPreferences.getString("chkEtPref", "Testing"),Toast.LENGTH_LONG).show(); 

Disabled Enabled

Problemi correlati