2012-03-16 4 views
6

나는 콜 포워드 옵션을 포함한 카테고리와 함께 PreferenceActivity를 가지고 있습니다. 내가 원하는 것은 다음과 같은 환경 설정입니다 :EditTextPreference와 CheckBoxPreference를 결합 할 수 있습니까?

  • 사용자가 오른쪽의 확인란을 선택하면 활성화/비활성화됩니다.

    <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> 
    
    : 사용자가 (기본 설정 또는 다른 것) 텍스트

그것은 어떤 사용이 없을 것입니다을 누르면 그러나 여기이 특정 preferencecategory의 조각 인 경우

  • 는 EditTextPreference 대화 상자를 엽니 다

    내가 좋아하는 것

    편집은 가능하면이 방법을 구현하는 :

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

    만약 사람이 아직도 궁금하다 -이 나는 기본 설정으로 원하는 것입니다 : 내가했습니다

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

    EDIT3

    시든 지금 두시간 동안 주위에 흘렀고, 1 개의 단어 : 'PreferenceGroupAdapter'를 생각해 내었다. 그러나 나는 그것을 사용하는 방법을 보여주는 예제 나 튜토리얼을 찾을 수 없었다. 제안? 이것은 올바른 경로일까요? EDIT4

    이 정말없는 경우

    가능성이 나는 것 매우 다른 내가 대신 결합 편집 - 및 체크 박스 환경 설정의 구현할 수 있습니다 (사용자 친화적 인) 솔루션 제안 등이있다.

  • +0

    혹시이 문제를 해결하기 위해 관리나요? 환경 설정 행에있는 체크 박스를 사용하거나 환경 설정 대화 상자에 통합하여 이처럼 사용자 정의 환경 설정을 만들려고했지만이 위치는 어디서나 찾을 수있는 유일한 참조입니다. –

    +0

    @ SeanO'Toole 내 대답이 도움이되는지 확인하십시오. – theblang

    답변

    2

    이 작업을 수행 할 수 있습니다. 먼저 PreferenceActivity에서 확장해야하는 환경 설정에 대한 클래스를 만듭니다. 다음과 같이 사용 :

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

    나는 그것이 도움이 되길 바랍니다.

    +0

    나는 이미 PreferencesActivity를 확장 한 나의 SettingsActivity를 이미 가지고 있습니다. 이 클래스 내에서 제안을 따르는 메소드를 간단하게 작성할 수 있습니까? 또한. findPreference()를 사용하고 있습니다. 이 chechboxpreferences를 onCreate()에서 프로그래밍 방식으로 추가해야합니까? – CodePrimate

    +0

    예,'listeners'라는 메소드를 생성하고'onCreate' 메소드를 호출하십시오. 효과가있을 것입니다. –

    +0

    내 의견을 편집했습니다 :) – CodePrimate

    1

    CheckBoxPreference에 대해 res/values/strings.xml에 키를 정의하십시오.

    에 XML 속성 android:key="@string/THE_KEY_YOU_DEFINED"을 지정하면 상태는 자동으로 SharedPreferences에 저장됩니다.

    EditTextPreferenceandroid:dependency="@string/THE_KEY_YOU_DEFINED이라는 XML 속성을 지정하십시오.

    EditTextPreferenceCheckBoxPreference의 상태에 따라 활성화/비활성화해야합니다.

    0

    약간 늦었지만 내가 편집 텍스트와 체크 박스와 레이아웃 생성이 클래스 생성 비슷한 만드는 데 성공했다고 생각 :

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

    을 그리고 기억 (기본 설정이 점을 넣어 "그 . android.example.example.com.androiddemo "패키지의 이름)입니다 :

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

    당신이 당신의 주요 활동이 예와 같이 뭔가를 시도 할 수있는 데이터 활용하려면 다음

    Disabled Enabled

    관련 문제