2013-03-31 11 views
5

Mam ekran preferencji i określam zasób layoutu przy użyciu atrybutu android:layout. W działaniach preferencji używam/pompuję preferencje, używając metody . Wewnątrz układu mam kilka widoków tekstowych i przycisków.korzystanie z findviewbyid w preferenceactivity

Problem polega na tym, że nie mogę znaleźć żadnego z odsłon, pól wyboru i przycisków za pomocą metody findViewById! Każdy wynik dla findViewById zwraca wartość null.

EDIT:

muszę dołączyć słuchacza do wyboru.

Czy ktoś może mi pomóc tutaj?

EDIT 2:

1) preference_layout.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="33dp" 
    android:gravity="center_vertical" 
    android:minHeight="33dp" 
    android:id="@+id/preference_header_switch_item_responder_layout" 
    style="?android:attr/listSeparatorTextViewStyle" > 

    <CheckBox 
    android:id="@+id/switchWidget" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_gravity="center" 
    android:clickable="true" 
    android:focusable="false" 
    android:padding="8dip" 
    android:layout_marginRight="14dip" /> 
</LinearLayout> 

2) korzystne ekran

<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" > 

    <Preference 
     android:defaultValue="false" 
     android:key="auto_responder_key" 
     android:widgetLayout="@layout/preference_layout" 
     android:title="@string/auto_responder"> 
    </Preference> 

</PreferenceScreen> 

3) Pierwszeństwo aktywny onCreate:

EDIT 3:

@Override 
    protected void onCreate(Bundle savedInstanceState) 
    { 
     if(savedInstanceState != null && savedInstanceState.containsKey(HEADERS_KEY)) 
     { 
      headers = savedInstanceState.getParcelableArrayList(HEADERS_KEY); 
     } 

     super.onCreate(savedInstanceState); 
     applicationContext = getApplicationContext(); 

     setupSimplePreferencesScreen(); 
//  setContentView(getListView()); 
     headerCompound = findViewById(R.id.switchWidget); 
     headerCompoundEmail = findViewById(R.id.switchWidgetEmail); 
    } 

i

private void setupSimplePreferencesScreen() 
    { 
     if (!isSimplePreferences(this)) 
     { 
      return; 
     } 

     addPreferencesFromResource(R.xml.responder_generic); 

    PreferenceCategory fakeHeader = new PreferenceCategory(this); 

     fakeHeader.setLayoutResource(R.layout.place_holder_auto_reply_header); 

     getPreferenceScreen().addPreference(fakeHeader); 
     addPreferencesFromResource(R.xml.auto_reply_sms_call_check_box_preference); 
     addPreferencesFromResource(R.xml.auto_reply_preferences); 

     Preference smsTemplatePreference = findPreference(SMS_TEMPLATE_KEY); 
     if(smsTemplatePreference != null) 
     { 
      bindPreferenceSummaryToValue(smsTemplatePreference); 
     } 

     Preference customTemplatePreference = findPreference(SMS_CUSTOM_TEMPLATE_KEY); 
     if(customTemplatePreference != null) 
     { 
      customTemplatePreference.setEnabled(false); 
      bindPreferenceSummaryToValue(customTemplatePreference); 
      getPreferenceScreen().removePreference(customTemplatePreference); 
     } 

     // Add 'email' preferences, and a corresponding header. 

     // Add 'email header' preferences. 
     addPreferencesFromResource(R.xml.email_enable_check); 
     addPreferencesFromResource(R.xml.email_preferences); 

     Preference passwordPreference = findPreference(EMAIL_PWD_KEY); 

     if(passwordPreference != null) 
     { 
      bindPreferenceSummaryToValue(passwordPreference); 
      // the advanced version of SMS template 
     } 

     Preference customPasswordPreference = findPreference(EMAIL_CUSTOM_PWD_KEY); 
     if(customPasswordPreference != null) 
     { 
      bindPreferenceSummaryToValue(customPasswordPreference); 
      getPreferenceScreen().removePreference(customPasswordPreference); 
     } 

     // Add 'network' preferences, and a corresponding header. 
     fakeHeader = new PreferenceCategory(this); 
     fakeHeader.setLayoutResource(R.layout.place_holder_network_header); 

     getPreferenceScreen().addPreference(fakeHeader); 
     addPreferencesFromResource(R.xml.network_preferences_check_box); 

     // Add 'misc' preferences, and a corresponding header. 
     fakeHeader = new PreferenceCategory(this); 
     fakeHeader.setLayoutResource(R.layout.place_holder_misc_header); 

     getPreferenceScreen().addPreference(fakeHeader); 
     addPreferencesFromResource(R.xml.misc_preferences); 
     addPreferencesFromResource(R.xml.misc_reject_ignore_check_box_preferences); 

     // Bind the summaries of EditText/Switch/CheckBox preferences to 
     // their values. When their values change, their summaries are updated 
     // to reflect the new value, per the Android Design guidelines. 
     bindPreferenceSummaryToValue(findPreference(AUTO_REPLY_SMS_KEY)); 
     bindPreferenceSummaryToValue(findPreference(AUTO_REPLY_CALL_KEY)); 
     bindPreferenceSummaryToValue(findPreference(DATA_NETWORK_KEY)); 
     bindPreferenceSummaryToValue(findPreference(WIFI_KEY)); 
     bindPreferenceSummaryToValue(findPreference(PASSCODE_KEY)); 
     bindPreferenceSummaryToValue(findPreference(EMAIL_USR_KEY)); 
     bindPreferenceSummaryToValue(findPreference(EMAIL_INT_KEY)); 
     bindPreferenceSummaryToValue(findPreference(AUTO_RESPONDER_KEY)); 
} 

Próbowałem powyższy kod w onPostCreate jak dobrze, ale wciąż wartość zwracana jest wartość null.

Chcę znaleźć pola wyboru responder_generic.xml i email_preferences.xml. Czy istnieje sposób na znalezienie i dodanie do nich słuchaczy?

Dzięki, Adithya

+0

Czy możesz opublikować, co próbowałem –

+0

dodałem mój kod. – Adithya

+0

pls opublikować pełny kod Java –

Odpowiedz

2

Po utworzeniu niestandardowej preferencji działało. Po prostu rozszerzyłem klasę Preference i nadmuchałem układ podany w layoucie /% MY_LAYOUT% .xml. Wezwano także słuchaczy, co chciałem osiągnąć.

To rozwiązanie nigdzie nie było moim zdaniem, dlatego dodałem to do społeczności Wiki.

Uwaga: jeśli jest dodawana jedna preferencja, powinna wystarczyć wartość single preference solution. Dodaję wiele preferencji na ekranie (w moim przypadku 2), zaimplementowałem własne preferencje.

0

Od czego prosić Wydaje się, że nie jesteś w stanie uzyskać żadnego widoku, gdy używasz

findViewById() 

więc jeden z możliwych powodów takiego zachowania może być, że ciebie może nie nazwali

setContentView(R.id.yourlayout); 

sprawdzić to w kodzie ...

+0

W rzeczywistości istnieją różne preferencje, które ładuję na działania i kilka z nich ma układy, a więc nie użyłem setContentView dla konkretnego układu. Czy sugerujesz ustawićContContView dla obu układów jeden po drugim? czy to będzie działało ? Spróbuję jednak. – Adithya

0

Miałem ten sam problem, próbując bezpośrednio umieścić RadioGroup w PreferenceScreen. Próbowałem ustawić zaznaczone RadioButton podczas tworzenia działania (na przykład przywracania wartości boolean z sharedpreferences), ale nie byłem w stanie findViewById lub podobne metody OnCreate. Oto moje rozwiązanie (brzydki, ale działa): ja przedłużony klasy RadioButton:

public class RadioButtonSettings extends RadioButton { 
public RadioButtonSettings(Context context, AttributeSet attrs) { 
    super(context, attrs); 
    boolean isLocal = context.getSharedPreferences("",Context.MODE_PRIVATE).getBoolean("local",true); 
    switch(getId()){ 
     case R.id.radio_in: 
      if(isLocal) 
       setChecked(true); 
      break; 
     case R.id.radio_out: 
      if(!isLocal) 
       setChecked(true); 
      break; 
     default: 
      break; 
    } 
}} 

następnie umieścić gdzieś w pliku preferences.xml (załadowany przez PreferenceActivity):

<PreferenceCategory 
android:title="CATEGORY EXAMPLE"> 
<Preference android:layout="@xml/category_one" 
    android:selectable="false" 
    android:key="radiobuttons"> 
</Preference> 
</PreferenceCategory> 

i wreszcie tworzenia kolejny plik w katalogu RES/xml (o nazwie category_one.xml) i umieścić:

<RadioGroup 
    android:id="@+id/radio" 
    android:orientation="vertical" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 
    <your.package.RadioButtonSettings 
     tools:context="your.package.SettingsActivity" 
     android:id="@+id/radio_in" 
     android:text="@string/radioIn" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content"> 
    </your.package.RadioButtonSettings> 
    <your.package.RadioButtonSettings 
     tools:context="your.package.SettingsActivity" 
     android:id="@+id/radio_out" 
     android:text="@string/radioOut" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content"> 
    </your.package.RadioButtonSettings> 
</RadioGroup> 

można również skorzystać z Androidem: onClick = "" opcja z pliku xml, aby uzyskać OnClickListener. W konkretnym przypadku było to proste sprawdzenie boolowskiej "lokalnej" (radiobutton "in" i radiobutton "out"). Oczywiście możesz oczywiście zastąpić inne klasyczne metody. Myślę, że może to lepsze rozwiązanie niż rozszerzenie całej klasy Preferencji. Mam nadzieję, że komuś to pomoże.

Powiązane problemy