Android自定义EditTextPreference用户界面未获得更新

时间:2016-04-24 03:26:46

标签: android button clear edittextpreference

我正在尝试自定义EditTextPreference以显示文本视图(即显示首选项的值)和右侧的清除/删除按钮。

我创建了 CustomEditTextPreference.java

package com.customedittextpreference;

import android.content.Context;
import android.content.SharedPreferences;
import android.media.Image;
import android.preference.EditTextPreference;
import android.preference.Preference;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;
import android.widget.ImageButton;
import android.widget.TextView;

/**
 * Created by cyong on 23/04/16.
 */
public class CustomEditTextPreference extends EditTextPreference {

private ImageButton clearButton;
private TextView valueTextView;

public CustomEditTextPreference(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
    setupChangeListener();
}

public CustomEditTextPreference(Context context, AttributeSet attrs)    {
    super(context, attrs);
    setupChangeListener();
}

public CustomEditTextPreference(Context context) {
    super(context);
    setupChangeListener();
}

@Override
protected void onBindView(View view) {
    super.onBindView(view);

    valueTextView = (TextView) view.findViewById(R.id.value_textview);
    clearButton = (ImageButton) view.findViewById(R.id.clear_button);

    clearButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            setText("");

        }
    });

    String valueString = getText();
    Log.v(Settings.APP_NAME, "refreshValue(): valueString=" + valueString);
    valueTextView.setText(valueString);

    toggleClearButton(valueString);

}


private void toggleClearButton(String value)
{
    if (value.length()==0)
    {
        clearButton.setVisibility(View.GONE);
    }
    else
    {
        clearButton.setVisibility(View.VISIBLE);
    }


}

private void setupChangeListener()
{
    setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
        @Override
        public boolean onPreferenceChange(Preference preference, Object newValue) {

            String newStringValue = (String) newValue;
            valueTextView.setText(newStringValue);

            toggleClearButton(newStringValue);

            return true;
        }
    });
}

}

CustomEditTextPreference类使用下面的布局(即prefwidget_edittext.xml)作为窗口小部件布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="horizontal"
android:descendantFocusability="blocksDescendants"
android:padding="0dp">
<TextView
    android:id="@+id/value_textview"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginRight="10dp"
    android:layout_gravity="center_vertical"
    android:singleLine="true" />

<ImageButton
    android:id="@+id/clear_button"
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:scaleType="centerInside"
    android:layout_marginRight="5dp"
    android:paddingLeft="6dp"
    android:paddingRight="6dp"
    android:layout_gravity="center_vertical"
    android:src="@mipmap/delete_icon"
    android:background="#00000000"
    />
</LinearLayout>

我在res / xml

下的preferences_list.xml中指定我的自定义EditTextPreference
 <?xml version="1.0" encoding="utf-8"?>
 <PreferenceScreen  xmlns:android="http://schemas.android.com/apk/res/android">
<ListPreference
    android:key="status_choice"
    android:entries="@array/array_status_entries"
    android:entryValues="@array/array_status_values"
    android:title="@string/choose_status_title"
    android:summary="%s"
    android:defaultValue="0"
    />
<CheckBoxPreference
    android:defaultValue="false"
    android:key="has_email"
    android:title="@string/has_email_title" >
</CheckBoxPreference>
 <com.customedittextpreference.CustomEditTextPreference
 android:widgetLayout="@layout/prefwidget_edittext"
 android:title="@string/productcode_title"
 android:key="code"/>
</PreferenceScreen>

我可以点击edittextpreference并输入一个字符串。输入的字符串将被保存,但在此之后不会显示在我的自定义窗口小部件布局的textview中。但是,如果我杀了我的应用程序并再次启动它,textview将显示已保存的字符串。现在,当我点击清除/删除按钮时,我可以看到正在删除的值但是,UI没有被更新以清除字符串textview并隐藏清除/删除按钮。

为方便起见,我已将我的示例项目上传到github:

Sample GitHub Project

1 个答案:

答案 0 :(得分:0)

似乎需要在更新首选项时调用notifyChanged()。

我注意到调用setTitle()和setSummary()会更新UI。事实证明,在这两个函数中调用notifyChanged()。

使用修复程序更新github项目。

GitHub Project