9

我有一个首选项屏幕,我正在使用该android:layout属性指定一个布局资源。在偏好活动中,我使用addPreferencesFromResourcefromonCreate方法使用/夸大偏好。在布局里面我有几个文本视图和按钮。

问题是我无法使用findViewById方法找到任何文本视图、复选框和按钮!的每个结果都findViewById返回 null。

编辑

我需要在复选框上附加一个侦听器。

任何人都可以在这里帮助我吗?

编辑 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) 偏好画面

<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)Preference Activity onCreate:

编辑 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但返回的值仍然为空。

我想找到 responder_generic.xml 和 email_preferences.xml 的复选框。有没有办法找到并添加听众?

谢谢, 阿迪西亚

4

3 回答 3

4

我所做的是创建一个自定义首选项并且它有效。我只是扩展Preference了类并膨胀了 layout/%MY_LAYOUT%.xml 中提供的布局。听众也被召唤,这是我想要实现的。

我不相信这个解决方案,因此,我将它添加到社区 Wiki。

注意:如果添加了一个首选项,那么单个首选项解决方案就足够了。我在屏幕上添加了多个首选项(在我的案例 2 中),我实现了自定义首选项。

于 2013-04-02T12:00:53.167 回答
0

根据您的要求,您在使用时似乎无法获得任何视图

findViewById()

所以这种行为的一个可能原因可能是你可能没有打电话

 setContentView(R.id.yourlayout);

在您的代码中检查一下...

于 2013-03-31T11:08:57.223 回答
0

我在尝试将 RadioGroup 直接放入 PreferenceScreen 时遇到了同样的问题。我试图在创建 Activity 时设置选中的 RadioButton(例如,从 sharedpreferences 中恢复布尔值),但我无法从 OnCreate 方法中找到 ViewById 或类似的值。这是我(丑陋但有效)的解决方案:我扩展了 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;
    }
}}

然后放在你的preferences.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>

您还可以使用 xml 文件中的 android:onClick="" 选项来获取 OnClickListener。在特定情况下,这是对布尔“本地”(单选按钮“输入”和单选按钮“输出”)的简单检查。您显然也可以覆盖其他经典方法。我认为这可能是比扩展整个 Preference 类更好的解决方案。希望它会帮助某人。

于 2016-04-15T20:27:12.637 回答