2016-04-24 68 views
0

我想自定義EditTextPreference來顯示一個Textview(即顯示首選項的值)和一個清除/刪除按鈕在其右側。Android自定義EditTextPreference UI沒有得到更新

我創建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> 

我指定的preferences_list.xml我的自定義EditTextPreference在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並輸入一個字符串。輸入的字符串將被保存,但不會在我的自定義小部件佈局的文本視圖中顯示。但是,如果我殺了我的應用程序,並再次啓動它,textview將顯示保存的字符串。現在,當我點擊清除/刪除按鈕時,我可以看到要刪除的值,但UI未更新以清除字符串textview並隱藏清除/刪除按鈕。

爲了方便起見,我已經上傳我的樣本項目到下面GitHub上:

Sample GitHub Project

回答

0

好像notifyChanged()需要更新的偏好時調用。

我注意到了調用setTitle()和setSummary()會更新UI。事實證明,notifyChanged()在那些函數中都被調用。

用修正更新github項目。

GitHub Project