1

我正在使用PreferenceFragment一些默认首选项类别和一种自定义布局:

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

    <PreferenceCategory
        android:key="first_category"
        android:title="config" >
        <EditTextPreference
            android:defaultValue="example"
            android:dialogMessage="text"
            android:dialogTitle="Title"
            android:key="mykey"
            android:summary="summary"
            android:title="title" />

        <Preference
            android:key="test_connection"
            android:title="Test connection"
            android:layout="@layout/test_conn"  />
 </PreferenceCategory>

</PreferenceScreen>

我的 test_conn 布局:

   <?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginBottom="6dip"
    android:layout_marginLeft="15dip"
    android:layout_marginRight="6dip"
    android:layout_marginTop="6dip"
    android:layout_weight="1" >

    <TextView
        android:id="@+id/title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_marginLeft="20dp"
        android:ellipsize="marquee"
        android:fadingEdge="horizontal"
        android:text="Test connection"
        android:textAppearance="?android:attr/textAppearanceLarge" />

    <TextView
        android:id="@+id/summary"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_marginRight="20dp"
        android:ellipsize="marquee"
        android:fadingEdge="horizontal"
        android:text="Ko"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:textColor="#ff0000"
        android:textStyle="bold" />

</RelativeLayout>

我正在R.id.summary使用以下代码阅读文本视图:

        addPreferencesFromResource(R.xml.preferences);
        findPreference(TEST_CONN).setOnPreferenceClickListener(this);    
        Preference custom = findPreference(TEST_CONN);
        customv = custom.getView(null, null);
        res = (TextView) customv.findViewById(R.id.summary);

我可以正确阅读我的 TextView,但如果我尝试更改文本,例如在异步任务中,我看不到文本已更改。

这是异步任务的一部分:

        @Override
    protected void onPostExecute(Boolean result) {
        if (result == true){
            res.setText("Ok");
            res.setTextColor(Color.GREEN);
        }
        else {
            res.setText("Ko");
            res.setTextColor(Color.RED);
        }
        pdia.dismiss();
    }

当用户单击首选项“test_connection”时,asynctask 将启动并在函数 onPostExecute 中修改文本,但不起作用。我错过了什么吗?我应该用另一种方法阅读文本视图吗?

4

1 回答 1

1

这是一个解决方案:您需要实现一个扩展 Android 类的自定义 PreferencePreference类。确保您的自定义类位于一个单独的文件中——而不是另一个类的一部分——否则您将收到类似这样的“Inflate XML 错误” 。这是一个例子:

我的CustomPreference.java文件:

public class CustomPreference extends Preference {
    private TextView txt;

    public CustomPreference(Context context, AttributeSet attrs) {
        super(context, attrs);
        this.setWidgetLayoutResource(R.layout.test_conn);
    }

    @Override
    protected void onBindView(View view) {
        super.onBindView(view);
        txt = (TextView) view.findViewById(R.id.summary);
    }

    public void setText(String text, int color) {
        txt.setText(text);
        txt.setTextColor(color);
    }
}

您的settings.xml文件应插入/使用自定义 Preference 类,如下所示:

 <com.myapp.example.widget.CustomPreference
        android:name="com.myapp.example.widget.CustomPreference"
        android:key="test_connection"
        android:title="Test connection"
        android:layout="@layout/test_conn"  />

当您想修改自定义布局上的 TextView 或 Button 时,您需要调用公共方法setText(),提供文本和颜色等参数:

        @Override
    protected void onPostExecute(Boolean result) {
        if (result == true){
            CustomPreference custom = (CustomPreference) findPreference(TEST_CONN);
            custom.setText("Ok", Color.GREEN);
        }
        else {
            CustomPreference custom = (CustomPreference) findPreference(TEST_CONN);
            custom.setText("Ko", Color.RED);
        }
        pdia.dismiss();
    }

另请参阅:此处的另一个答案

于 2013-08-29T13:02:01.017 回答