我正在使用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>
我正在使用以下代码阅读textview 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,但是如果我尝试更改文本,例如在asynctask中,我看不到文本发生了变化。
这是asynctask的一部分:
@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并在funzion onPostExecute中修改文本,但不起作用。我错过了什么吗?我应该用另一种方法阅读textview吗?
答案 0 :(得分:1)
以下是解决方案:您需要实现扩展Android Preference
类的自定义Preference类。 确保您的自定义类位于单独的文件中 - 不属于另一个类 - 否则您将收到像this这样的“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();
}
另请参阅:Another answer here