2012-09-23 4 views
1

여기를 검색하여 샘플을 살펴 보았지만 본질적으로 간단한 문제에 대한 답변을 아직 찾지 못했습니다. 앞의 ListPreference에서 선택한 선택 사항에 따라 코드에서 CheckBoxPreferences의 환경 설정 화면을 동적으로 생성하고 싶습니다.이 화면은 클릭 리스너로 간단한 환경 설정을 클릭 할 때 표시됩니다. 확인란과 확인란의 수는 각각 다릅니다.다른 설정에 따라 코드 환경 설정 화면

이것은 지금까지 제가 가지고있는 곳입니다 - onClick 수신기의 개념을 테스트하는 간단한 코드가 있지만 확인란 환경 설정 화면을 표시하는 방법은 무엇입니까? 왜 그렇게하지 않는지에 대한 간단한 설명이 있어야합니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까? 내 XML 코드의

부 : "카테고리에 대한 표시 필터"의

<PreferenceCategory android:title="Filters"> 
    <PreferenceScreen android:key="FilterScreen" 
     android:title="Filters" android:summary="Click to change filter settings"> 
     <ListPreference android:title="Filter type" 
      android:summary="Set to: Gliding" 
      android:key="filterType" 
      android:defaultValue="0" 
      android:entries="@array/filterTypeOptions" 
      android:entryValues="@array/filterTypeValues" /> 
     <CheckBoxPreference android:title="" 
      android:summary="Include Aerodrome Notams" 
      android:defaultValue="false" android:key="filterIncludeAerodrome" /> 
     <CheckBoxPreference android:title="" 
      android:summary="Delete night-time Notams" 
      android:defaultValue="true" android:key="filterDeleteNighttime" /> 
     <ListPreference android:title="Select category to change" 
      android:summary="Set to: Airspace organisation" 
      android:key="filterCategory" 
      android:defaultValue="0" 
      android:entries="@array/filterCategoryOptions" 
      android:entryValues="@array/filterCategoryValues" /> 
     <Preference android:title="Show filters for category" 
      android:summary="Click to choose subjects to delete" 
      android:key="filterShow" /> 
    </PreferenceScreen> 
</PreferenceCategory> 

내용은 "필터 유형"과 설정을 "변경 카테고리 선택"에 따라 달라집니다.

이것은 간단한 테스트 나는 (필수을 보여주기 위해 단지 삭감) 수신기를 클릭은 "필터"를 가지고 코드입니다 : 내가 가진 무엇을 나는 간단한 대답이 있어야 확신

public class Settings extends PreferenceActivity 
        implements OnSharedPreferenceChangeListener 
{ 
    ------ 
    public static final String KEY_FILTER_SHOW = "filterShow"; 

    ------ 
    private Preference mFilterShow; 

    ------ 
    @Override 
    protected void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     addPreferencesFromResource(R.layout.settings); 

     // Get a reference to the preferences 

     ------ 
     mFilterShow = (Preference)findPreference(KEY_FILTER_SHOW); 

     ------ 
     // Set the click listener for Show Filter options 
     mFilterShow.setOnPreferenceClickListener(new OnPreferenceClickListener() 
     { 
      public boolean onPreferenceClick(Preference pref) 
      { 
       Context ctx = pref.getContext(); 
       PreferenceScreen screen = 
        pref.getPreferenceManager().createPreferenceScreen(ctx); 
       CheckBoxPreference cb1 = new CheckBoxPreference(ctx); 
       cb1.setTitle("This is cb1"); 
       cb1.setKey("cb1_key"); 
       cb1.setDefaultValue(false); 
       screen.addPreference(cb1); 
       return true; 
      } 

     }); 

잘못했거나 내가 놓친 것! 제발 도와주세요 ...

+0

"setPreferenceScreen (screen);"행을 추가하면 "return true"직전에 Show Filters 환경 설정을 클릭해도 아무 것도 나타나지 않습니다. 그러나 '뒤로'를 클릭하면 cb1 화면이 나타납니다! 그런 다음 '뒤로'를 다시 클릭하면 다시 설정에서 완전히 벗어납니다. 그래서 나는 거의 내가 거기에 있다고 생각한다. –

+0

조금 더 가까이. Show Filters Preference를 xml의 PreferenceScreen으로 변경하고 Line PreferenceScreen screen = ...을 (PreferenceScreen) getPreferenceScreen()으로 변경했습니다. findPreference (KEY_FILTER_SHOW); 이전 주석에서 언급 한 임시 setPreferenceScreen (화면)을 제거했습니다. 이제 첫 번째 클릭에는 아무 것도 표시되지 않지만 두 번째 클릭에는 두 개의 cb1이 표시되고 이후의 각 클릭에는 cb1이 추가됩니다 (예상 됨). 하지만 첫 번째 클릭으로 인해 단일 cb1이 표시된 화면이 표시되지 않는 이유는 알 수 없습니다. '뒤로'를 클릭하면 예상대로 작동합니다. –

답변

3

좋아, 내가 반복 과정을 통해 자신을 문제를 해결했습니다! 다른 사람들은 이것이 유용 할 수도 있습니다.

은 그냥 XML에 빈 PreferenceScreen을 만들 :
 <PreferenceScreen android:title="Show filters for category" 
      android:summary="Click to choose subjects to delete" 
      android:key="filterShow"> 
     </PreferenceScreen> 

그런 다음 코드에서 온 클릭 리스너에 대한 필요가 없습니다 -에서 onCreate 함수에서 생성 된 화면의 내용을 표시합니다.

public static final String KEY_FILTER_SHOW = "filterShow"; 
...  
private PreferenceScreen mFilterShow; 
... 

// In onCreate: 

    // Get a reference to the PreferenceScreen 
    mFilterShow = 
     (PreferenceScreen)getPreferenceScreen().findPreference(KEY_FILTER_SHOW); 

    // Now the code to create the contents of the screen 
    mFilterShow.removeAll(); 
    CheckBoxPreference cb1 = new CheckBoxPreference(this); 
    cb1.setTitle("This is cb1"); 
    cb1.setKey("cb1_key"); 
    cb1.setDefaultValue(true); 
    mFilterShow.addPreference(cb1); 
: 사실, 화면의 내용이 범주 목록 환경에서 만든 선택이 변경 (원래의 코드를 참조) 할 때 변경해야하기 때문에,이에서 onCreate에서 모두에게 전화를 onSharedPreferenceChanged되는 별도의 기능에 갈 필요

위의 내용은 단지 "개념 증명"입니다. 예상대로 정확하게 작동합니다. 최종 버전에서는 처음에 '새'라는 CheckBoxPreferences 배열을 만든 다음 각 범주 선택 항목의 화면 내용을 변경할 때이를 다시 사용합니다 (제목 및 기본값 변경). 필요한 확인란의 수는 각 범주마다 다를 수 있습니다. 필요한 최대 수의 배열을 만들고 각 경우에 필요한만큼 추가합니다.

관련 문제