package com.sloydev.preferator.editor; import android.content.Context; import android.text.Editable; import android.text.TextUtils; import android.text.TextWatcher; import android.util.AttributeSet; import android.view.LayoutInflater; import android.widget.EditText; import android.widget.FrameLayout; import com.sloydev.preferator.R; import java.util.HashSet; import java.util.Set; import static java.util.Arrays.asList; public class SetPrefEditor extends FrameLayout { private EditText valueView; private OnSetValueChangeListener onSetValueChangeListener; public SetPrefEditor(Context context) { this(context, null); } public SetPrefEditor(Context context, AttributeSet attrs) { this(context, attrs, 0); } public SetPrefEditor(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(); } private void init() { LayoutInflater.from(getContext()).inflate(R.layout.item_editor_string, this, true); valueView = (EditText) findViewById(R.id.pref_value); valueView.addTextChangedListener(new TextWatcher() { @Override public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { if (onSetValueChangeListener != null) { onSetValueChangeListener.onValueChange(stringToSet(charSequence.toString())); } } @Override public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { } @Override public void afterTextChanged(Editable editable) { } }); } public void setValue(Set<String> value) { valueView.setText(setToString(value)); } public Set<String> getValue() { String rawValue = valueView.getText().toString(); return stringToSet(rawValue); } public void setOnSetValueChangeListener(OnSetValueChangeListener onSetValueChangeListener) { this.onSetValueChangeListener = onSetValueChangeListener; } private Set<String> stringToSet(String rawValue) { String[] items = rawValue.split(","); return new HashSet<>(asList(items)); } private String setToString(Set<String> set) { return TextUtils.join(",", set); } public interface OnSetValueChangeListener { void onValueChange(Set<String> newValue); } }