использование findviewbyid в предпочтениях

У меня есть экран предпочтений, и я указываю ресурс макета, используя атрибут android:layout. В активности предпочтений я использую/увеличиваю предпочтение, используя метод addPreferencesFromResource из onCreate. Внутри макета у меня есть несколько текстовых представлений и кнопок.

Проблема в том, что я не могу найти какие-либо текстовые поля, флажки и кнопки, используя метод findViewById! Каждый результат для findViewById возвращает null.

ИЗМЕНИТЬ:

Мне нужно прикрепить прослушиватель к флажку.

Может ли кто-нибудь помочь мне здесь?

ИЗМЕНИТЬ 2:

1) предпочтение_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) экран настроек

<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) Активность предпочтений при создании:

ИЗМЕНИТЬ 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);
    }

и

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

Я также попробовал приведенный выше код в onPostCreate, но все же возвращаемое значение равно нулю.

Я хочу найти флажки для responseer_generic.xml и email_preferences.xml. Есть ли способ найти и добавить к ним слушателей?

Спасибо, Адитья


person Adithya    schedule 31.03.2013    source источник
comment
можешь выложить что ты пробовал   -  person karan    schedule 31.03.2013
comment
я добавил свой код.   -  person Adithya    schedule 31.03.2013
comment
Пожалуйста, опубликуйте свой полный код Java   -  person karan    schedule 31.03.2013
comment
добавлен весь код согласно вашему требованию.   -  person Adithya    schedule 31.03.2013


Ответы (3)


Что я сделал, так это создал пользовательскую настройку, и это сработало. Я просто расширил класс Preference и раздул макет, представленный в layout/%MY_LAYOUT%.xml. Слушателей тоже звали, чего я и хотел добиться.

Думаю, этого решения нигде не было, поэтому я добавляю его в вики сообщества.

Примечание: если добавляется одна настройка, то решения с одним предпочтением должно быть достаточно. Я добавляю несколько настроек на экран (в моем случае 2), я реализовал пользовательские настройки.

person Community    schedule 02.04.2013

Из того, что вы спросили, видно, что вы не можете получить какое-либо представление при использовании

findViewById()

поэтому одной из возможных причин такого поведения может быть то, что вы, возможно, не позвонили

 setContentView(R.id.yourlayout);

проверьте это в своем коде...

person karan    schedule 31.03.2013
comment
на самом деле, есть различные настройки, которые я загружаю в действие, и у нескольких из них есть макеты, поэтому я не использовал setContentView для определенного макета. Вы предлагаете установитьContentView для обоих макетов один за другим? это сработает? Я попробую это все же. - person Adithya; 31.03.2013

У меня была такая же проблема, когда я пытался поместить RadioGroup непосредственно в PreferenceScreen. Я пытался установить проверенный RadioButton при создании действия (например, восстановление значения логического значения из общих настроек), но мне не удалось найтиViewById или аналогичный метод OnCreate. Вот мое (уродливое, но работающее) решение: я расширил класс 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;
    }
}}

затем поместите куда-нибудь в свой файл settings.xml (загружаемый PreferenceActivity):

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

и, наконец, создайте еще один файл в каталоге res/xml (с именем category_one.xml) и поместите:

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

Вы также можете использовать опцию android:onClick="" из файла xml, чтобы получить OnClickListener. В конкретном случае это была простая проверка логического «местного» (радиокнопка «вход» и радиокнопка «выход»). Вы также можете явно переопределить другие классические методы. Я думаю, может быть, это лучшее решение, чем расширение всего класса Preference. Надеясь, что это поможет кому-то.

person GabrieleG    schedule 15.04.2016