2016-04-24 6 views
0

Я пытаюсь настроить EditTextPreference для отображения текстового представления (например, для отображения значения предпочтения) и кнопки очистки/удаления с правой стороны.Пользовательский интерфейс EditTextPreference для Android не обновляется

Я создал 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> 

Уточняю мои пользовательские EditTextPreference в preferences_list.xml под res/xml

<?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 и ввести строку. Введенная строка будет сохранена, но после этого не будет отображаться в текстовом представлении моего пользовательского макета виджетов. Однако, если я убью свое приложение и начну его снова, текстовое окно отобразит сохраненную строку. Теперь, когда я нажимаю кнопку очистки/удаления, я вижу, что значение удаляется, но пользовательский интерфейс не обновляется, чтобы очистить строку от текстового поля и скрыть кнопку очистки/удаления.

Для удобства я загрузил свой образец проекта в GitHub ниже:

Sample GitHub Project

ответ

0

Похоже notifyChanged() должна вызываться при обновлении предпочтений.

Я заметил, что вызовы setTitle() и setSummary() обновили пользовательский интерфейс. Оказывается, notifyChanged() вызывается в этих обеих этих функциях.

Обновите проект github с исправлением.

GitHub Project