findViewById为首选项布局返回null

时间:2013-03-29 17:47:43

标签: android android-preferences

我有一个首选项屏幕(responder_generic.xml),如下所示:

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" >

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

</PreferenceScreen>

我实例化如下:(在2.3.3版本中)

addPreferencesFromResource(R.xml.responder_generic);

我的布局= preference_header_switch_item_responder如下所示:

<?xml version="1.0" encoding="utf-8"?>
<!-- Layout of a header item in PreferenceActivity. -->
<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"
    style="?android:attr/listSeparatorTextViewStyle" >

    <RelativeLayout
        android:layout_width="0dip"
        android:layout_height="wrap_content"
        android:layout_marginLeft="5dp"
        android:layout_weight="1" >

        <TextView
            android:id="@+id/title"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:ellipsize="marquee"
            android:fadingEdge="horizontal"
            android:singleLine="true"
            android:text="@string/auto_responder"
            android:textAppearance="?android:attr/textAppearanceSmall"
            android:textStyle="bold" />

        <TextView
            android:id="@+id/summary"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_below="@android:id/title"
            android:ellipsize="end"
            android:textAppearance="?android:attr/textAppearanceSmall" />
    </RelativeLayout>

    <include layout="@layout/compound_button" />

</LinearLayout>

现在,我分别在layout文件夹和layout/v-14中定义了复合按钮,如下所示:

<?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" >

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

</merge>

<?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

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

</merge>

onPostCreate方法中,我试图在运行时使用findViewById(R.id.switchWidget)找到此复选框/开关,但它始终返回null。

任何想法可能是什么原因?

2 个答案:

答案 0 :(得分:6)

原因是我在屏幕上添加了多个首选项,因此,我不得不求助于添加自定义首选项。以下链接提供了详细的解决方案:

解决方案已在以下链接中提供。

usage of findviewbyid in preferenceactivity

答案 1 :(得分:1)

原因在于使用了几个PreferenceScreen。每个Preference视图都有自己的id。

要访问视图ID,您需要创建自己的Preference类继承自Preference 并覆盖onBindView

CALL apoc.periodic.iterate(
"MATCH (a:Node), (b:Node) 
WHERE ID(a) < ID(b) 
AND a.id IN b.refs RETURN a, b",
"CREATE (b)-[:CITES]->(a)",
{batchSize:10000, parallel:false,iterateList:true})

要在PreferenceScreen xml文件中使用您的类,请指定

public class LogListPreference extends EditTextPreference {

    public LogListPreference(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public LogListPreference(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        this.setLayoutResource(R.layout.preference_widget_loglist);
    }

     @Override
        protected void onBindView(View view) {
            super.onBindView(view);
            EditText edit = (EditText) view.findViewById(R.id.logText);
            ...
        }
}

首选项布局文件/layout/preference_widget_loglist.xml:

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

     <com.company.LogListPreference
         android:title="@string/pref_log_title_log"
         android:key="log_text" />

 </PreferenceScreen>