From 7f33b6412061a23ec1d1f166997eb8e14d56df90 Mon Sep 17 00:00:00 2001 From: Atanas Dimitrov Date: Thu, 6 Aug 2015 16:51:59 +0300 Subject: [PATCH 1/5] AutoCompletionTextView --- .../taggroup/demo/TagEditorActivity.java | 27 ++++++++++++ .../me/gujun/android/taggroup/TagGroup.java | 41 ++++++++++++++++++- 2 files changed, 66 insertions(+), 2 deletions(-) diff --git a/demo/src/main/java/me/gujun/android/taggroup/demo/TagEditorActivity.java b/demo/src/main/java/me/gujun/android/taggroup/demo/TagEditorActivity.java index 27d2ea1..b1a3d0f 100644 --- a/demo/src/main/java/me/gujun/android/taggroup/demo/TagEditorActivity.java +++ b/demo/src/main/java/me/gujun/android/taggroup/demo/TagEditorActivity.java @@ -2,8 +2,15 @@ import android.os.Bundle; import android.support.v7.app.ActionBarActivity; +import android.text.TextUtils; +import android.util.Log; import android.view.Menu; import android.view.MenuItem; +import android.view.View; +import android.widget.ArrayAdapter; +import android.widget.AutoCompleteTextView; + +import java.util.Random; import me.gujun.android.taggroup.TagGroup; import me.gujun.android.taggroup.demo.db.TagsManager; @@ -13,6 +20,10 @@ public class TagEditorActivity extends ActionBarActivity { private TagGroup mTagGroup; private TagsManager mTagsManager; + private String[] a = new String[] {"bla", "tra", "gha"}; + private String[] b = new String[] {"blas", "tras", "ghas"}; + private String[] c = new String[] {"blas2", "tras3", "ghas4"}; + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -23,6 +34,22 @@ protected void onCreate(Bundle savedInstanceState) { mTagGroup = (TagGroup) findViewById(R.id.tag_group); mTagGroup.setTags(tags); + mTagGroup.setOnTagCharEntryListener(new TagGroup.OnTagCharEntryListener() { + @Override + public void onCharEntry(String text) { + Log.e("dsad", text); + + if (text.equals("b")) { + mTagGroup.getTagView().setAdapter(new ArrayAdapter<>(TagEditorActivity.this, android.R.layout.simple_list_item_1, new String[] {"bl", "bg", "bd"})); + } else if (text.equals("bl")) { + mTagGroup.getTagView().setAdapter(new ArrayAdapter<>(TagEditorActivity.this, android.R.layout.simple_list_item_1, new String[] {"bla", "bga", "bda"})); + } else if (text.equals("bla")) { + mTagGroup.getTagView().setAdapter(new ArrayAdapter<>(TagEditorActivity.this, android.R.layout.simple_list_item_1, new String[] {"blag", "bgag", "bdag"})); + } else if (text.equals("blag")) { + mTagGroup.getTagView().setAdapter(new ArrayAdapter<>(TagEditorActivity.this, android.R.layout.simple_list_item_1, new String[] {"blaga", "bgagd", "bdagd"})); + } + } + }); } @Override diff --git a/library/src/main/java/me/gujun/android/taggroup/TagGroup.java b/library/src/main/java/me/gujun/android/taggroup/TagGroup.java index 5f2ae99..432fcce 100644 --- a/library/src/main/java/me/gujun/android/taggroup/TagGroup.java +++ b/library/src/main/java/me/gujun/android/taggroup/TagGroup.java @@ -17,6 +17,7 @@ import android.text.TextWatcher; import android.text.method.ArrowKeyMovementMethod; import android.util.AttributeSet; +import android.util.Log; import android.util.TypedValue; import android.view.Gravity; import android.view.KeyEvent; @@ -26,6 +27,8 @@ import android.view.inputmethod.EditorInfo; import android.view.inputmethod.InputConnection; import android.view.inputmethod.InputConnectionWrapper; +import android.widget.ArrayAdapter; +import android.widget.AutoCompleteTextView; import android.widget.TextView; import java.util.ArrayList; @@ -125,6 +128,8 @@ public class TagGroup extends ViewGroup { /** The vertical tag padding, default is 3.0dp. */ private int verticalPadding; + private AutoCompleteTextView tagView; + /** Listener used to dispatch tag change event. */ private OnTagChangeListener mOnTagChangeListener; @@ -134,6 +139,8 @@ public class TagGroup extends ViewGroup { /** Listener used to handle tag click event. */ private InternalTagClickListener mInternalTagClickListener = new InternalTagClickListener(); + public OnTagCharEntryListener onTagCharEntryListener; + public TagGroup(Context context) { this(context, null); } @@ -329,7 +336,7 @@ public void onRestoreInstanceState(Parcelable state) { * * @return the INPUT state tag view or null if not exists */ - protected TagView getInputTag() { + public TagView getInputTag() { if (isAppendMode) { final int inputTagIndex = getChildCount() - 1; final TagView inputTag = getTagAt(inputTagIndex); @@ -367,6 +374,10 @@ protected TagView getLastNormalTagView() { return lastNormalTagView; } + public AutoCompleteTextView getTagView() { + return tagView; + } + /** * Returns the tag array in group, except the INPUT tag. * @@ -522,6 +533,10 @@ protected void deleteTag(TagView tagView) { } } + public void setOnTagCharEntryListener(OnTagCharEntryListener listener) { + this.onTagCharEntryListener = listener; + } + /** * Interface definition for a callback to be invoked when a tag group is changed. */ @@ -553,6 +568,10 @@ public interface OnTagClickListener { void onTagClick(String tag); } + public interface OnTagCharEntryListener { + void onCharEntry(String text); + } + /** * Per-child layout information for layouts. */ @@ -648,7 +667,7 @@ public void onClick(View v) { /** * The tag view which has two states can be either NORMAL or INPUT. */ - class TagView extends TextView { + class TagView extends AutoCompleteTextView { public static final int STATE_NORMAL = 1; public static final int STATE_INPUT = 2; @@ -737,6 +756,24 @@ public boolean onLongClick(View v) { if (state == STATE_INPUT) { requestFocus(); + addTextChangedListener(new TextWatcher() { + @Override + public void beforeTextChanged(CharSequence s, int start, int count, int after) { + + } + + @Override + public void onTextChanged(CharSequence s, int start, int before, int count) { + + } + + @Override + public void afterTextChanged(Editable s) { + tagView = TagView.this; + onTagCharEntryListener.onCharEntry(s.toString()); + } + }); + // Handle the ENTER key down. setOnEditorActionListener(new OnEditorActionListener() { @Override From 56ff1e9219be17089190dca8535e51535163bc02 Mon Sep 17 00:00:00 2001 From: Atanas Dimitrov Date: Fri, 7 Aug 2015 11:30:03 +0300 Subject: [PATCH 2/5] Tag text entry listener changed name -> OnTagTextEntryListener. onTextEnry() method receives the AutoCompleteTextView tagView as an argument. --- .../taggroup/demo/TagEditorActivity.java | 23 ++++-------- .../me/gujun/android/taggroup/TagGroup.java | 35 +++++++++---------- 2 files changed, 22 insertions(+), 36 deletions(-) diff --git a/demo/src/main/java/me/gujun/android/taggroup/demo/TagEditorActivity.java b/demo/src/main/java/me/gujun/android/taggroup/demo/TagEditorActivity.java index b1a3d0f..c59f501 100644 --- a/demo/src/main/java/me/gujun/android/taggroup/demo/TagEditorActivity.java +++ b/demo/src/main/java/me/gujun/android/taggroup/demo/TagEditorActivity.java @@ -2,16 +2,11 @@ import android.os.Bundle; import android.support.v7.app.ActionBarActivity; -import android.text.TextUtils; -import android.util.Log; import android.view.Menu; import android.view.MenuItem; -import android.view.View; import android.widget.ArrayAdapter; import android.widget.AutoCompleteTextView; -import java.util.Random; - import me.gujun.android.taggroup.TagGroup; import me.gujun.android.taggroup.demo.db.TagsManager; @@ -20,10 +15,6 @@ public class TagEditorActivity extends ActionBarActivity { private TagGroup mTagGroup; private TagsManager mTagsManager; - private String[] a = new String[] {"bla", "tra", "gha"}; - private String[] b = new String[] {"blas", "tras", "ghas"}; - private String[] c = new String[] {"blas2", "tras3", "ghas4"}; - @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -34,19 +25,17 @@ protected void onCreate(Bundle savedInstanceState) { mTagGroup = (TagGroup) findViewById(R.id.tag_group); mTagGroup.setTags(tags); - mTagGroup.setOnTagCharEntryListener(new TagGroup.OnTagCharEntryListener() { + mTagGroup.setOnTagTextEntryListener(new TagGroup.OnTagTextEntryListener() { @Override - public void onCharEntry(String text) { - Log.e("dsad", text); - + public void onTextEntry(AutoCompleteTextView tagView, String text) { if (text.equals("b")) { - mTagGroup.getTagView().setAdapter(new ArrayAdapter<>(TagEditorActivity.this, android.R.layout.simple_list_item_1, new String[] {"bl", "bg", "bd"})); + tagView.setAdapter(new ArrayAdapter<>(TagEditorActivity.this, android.R.layout.simple_list_item_1, new String[]{"Au", "Bu", "Cy"})); } else if (text.equals("bl")) { - mTagGroup.getTagView().setAdapter(new ArrayAdapter<>(TagEditorActivity.this, android.R.layout.simple_list_item_1, new String[] {"bla", "bga", "bda"})); + tagView.setAdapter(new ArrayAdapter<>(TagEditorActivity.this, android.R.layout.simple_list_item_1, new String[]{"Aus", "Bul", "Cyp"})); } else if (text.equals("bla")) { - mTagGroup.getTagView().setAdapter(new ArrayAdapter<>(TagEditorActivity.this, android.R.layout.simple_list_item_1, new String[] {"blag", "bgag", "bdag"})); + tagView.setAdapter(new ArrayAdapter<>(TagEditorActivity.this, android.R.layout.simple_list_item_1, new String[]{"Aust", "Bulg", "Cypr"})); } else if (text.equals("blag")) { - mTagGroup.getTagView().setAdapter(new ArrayAdapter<>(TagEditorActivity.this, android.R.layout.simple_list_item_1, new String[] {"blaga", "bgagd", "bdagd"})); + tagView.setAdapter(new ArrayAdapter<>(TagEditorActivity.this, android.R.layout.simple_list_item_1, new String[]{"Australia", "Bulgaria", "Cyprus"})); } } }); diff --git a/library/src/main/java/me/gujun/android/taggroup/TagGroup.java b/library/src/main/java/me/gujun/android/taggroup/TagGroup.java index 432fcce..b219eee 100644 --- a/library/src/main/java/me/gujun/android/taggroup/TagGroup.java +++ b/library/src/main/java/me/gujun/android/taggroup/TagGroup.java @@ -17,7 +17,6 @@ import android.text.TextWatcher; import android.text.method.ArrowKeyMovementMethod; import android.util.AttributeSet; -import android.util.Log; import android.util.TypedValue; import android.view.Gravity; import android.view.KeyEvent; @@ -27,7 +26,6 @@ import android.view.inputmethod.EditorInfo; import android.view.inputmethod.InputConnection; import android.view.inputmethod.InputConnectionWrapper; -import android.widget.ArrayAdapter; import android.widget.AutoCompleteTextView; import android.widget.TextView; @@ -128,8 +126,6 @@ public class TagGroup extends ViewGroup { /** The vertical tag padding, default is 3.0dp. */ private int verticalPadding; - private AutoCompleteTextView tagView; - /** Listener used to dispatch tag change event. */ private OnTagChangeListener mOnTagChangeListener; @@ -139,7 +135,8 @@ public class TagGroup extends ViewGroup { /** Listener used to handle tag click event. */ private InternalTagClickListener mInternalTagClickListener = new InternalTagClickListener(); - public OnTagCharEntryListener onTagCharEntryListener; + /** Listener used to handle tag text entry event. */ + public OnTagTextEntryListener onTagTextEntryListener; public TagGroup(Context context) { this(context, null); @@ -336,7 +333,7 @@ public void onRestoreInstanceState(Parcelable state) { * * @return the INPUT state tag view or null if not exists */ - public TagView getInputTag() { + protected TagView getInputTag() { if (isAppendMode) { final int inputTagIndex = getChildCount() - 1; final TagView inputTag = getTagAt(inputTagIndex); @@ -355,7 +352,7 @@ public TagView getInputTag() { * * @return the INPUT state tag view or null if not exists */ - public String getInputTagText() { + protected String getInputTagText() { final TagView inputTagView = getInputTag(); if (inputTagView != null) { return inputTagView.getText().toString(); @@ -374,10 +371,6 @@ protected TagView getLastNormalTagView() { return lastNormalTagView; } - public AutoCompleteTextView getTagView() { - return tagView; - } - /** * Returns the tag array in group, except the INPUT tag. * @@ -468,6 +461,15 @@ public void setOnTagChangeListener(OnTagChangeListener l) { mOnTagChangeListener = l; } + /** + * Register a callback to be invoked when a tag text is entered. + * + * @param l the callback that will be used to inform text entry event + */ + public void setOnTagTextEntryListener(OnTagTextEntryListener l) { + this.onTagTextEntryListener = l; + } + /** * @see #appendInputTag(String) */ @@ -533,10 +535,6 @@ protected void deleteTag(TagView tagView) { } } - public void setOnTagCharEntryListener(OnTagCharEntryListener listener) { - this.onTagCharEntryListener = listener; - } - /** * Interface definition for a callback to be invoked when a tag group is changed. */ @@ -568,8 +566,8 @@ public interface OnTagClickListener { void onTagClick(String tag); } - public interface OnTagCharEntryListener { - void onCharEntry(String text); + public interface OnTagTextEntryListener { + void onTextEntry(AutoCompleteTextView tagView, String text); } /** @@ -769,8 +767,7 @@ public void onTextChanged(CharSequence s, int start, int before, int count) { @Override public void afterTextChanged(Editable s) { - tagView = TagView.this; - onTagCharEntryListener.onCharEntry(s.toString()); + onTagTextEntryListener.onTextEntry(TagView.this, s.toString()); } }); From 3a7c8c80f50c478fc082188c6faffd90b73f6af4 Mon Sep 17 00:00:00 2001 From: Atanas Dimitrov Date: Fri, 7 Aug 2015 11:32:49 +0300 Subject: [PATCH 3/5] getInputTagText() is reverted to be public not protected. --- library/src/main/java/me/gujun/android/taggroup/TagGroup.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/library/src/main/java/me/gujun/android/taggroup/TagGroup.java b/library/src/main/java/me/gujun/android/taggroup/TagGroup.java index b219eee..3e741ba 100644 --- a/library/src/main/java/me/gujun/android/taggroup/TagGroup.java +++ b/library/src/main/java/me/gujun/android/taggroup/TagGroup.java @@ -352,7 +352,7 @@ protected TagView getInputTag() { * * @return the INPUT state tag view or null if not exists */ - protected String getInputTagText() { + public String getInputTagText() { final TagView inputTagView = getInputTag(); if (inputTagView != null) { return inputTagView.getText().toString(); From 7db00a73ec0d73f42158bae6dbb5c5b3ce1a4f7d Mon Sep 17 00:00:00 2001 From: Atanas Dimitrov Date: Fri, 7 Aug 2015 11:47:31 +0300 Subject: [PATCH 4/5] Bug fix: when no text entry listener is attached - the app is crashing. --- .../me/gujun/android/taggroup/demo/TagEditorActivity.java | 8 ++++---- .../src/main/java/me/gujun/android/taggroup/TagGroup.java | 4 +--- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/demo/src/main/java/me/gujun/android/taggroup/demo/TagEditorActivity.java b/demo/src/main/java/me/gujun/android/taggroup/demo/TagEditorActivity.java index c59f501..b841b6c 100644 --- a/demo/src/main/java/me/gujun/android/taggroup/demo/TagEditorActivity.java +++ b/demo/src/main/java/me/gujun/android/taggroup/demo/TagEditorActivity.java @@ -28,13 +28,13 @@ protected void onCreate(Bundle savedInstanceState) { mTagGroup.setOnTagTextEntryListener(new TagGroup.OnTagTextEntryListener() { @Override public void onTextEntry(AutoCompleteTextView tagView, String text) { - if (text.equals("b")) { + if (text.equals("A")) { tagView.setAdapter(new ArrayAdapter<>(TagEditorActivity.this, android.R.layout.simple_list_item_1, new String[]{"Au", "Bu", "Cy"})); - } else if (text.equals("bl")) { + } else if (text.equals("Au")) { tagView.setAdapter(new ArrayAdapter<>(TagEditorActivity.this, android.R.layout.simple_list_item_1, new String[]{"Aus", "Bul", "Cyp"})); - } else if (text.equals("bla")) { + } else if (text.equals("Aus")) { tagView.setAdapter(new ArrayAdapter<>(TagEditorActivity.this, android.R.layout.simple_list_item_1, new String[]{"Aust", "Bulg", "Cypr"})); - } else if (text.equals("blag")) { + } else if (text.equals("Aust")) { tagView.setAdapter(new ArrayAdapter<>(TagEditorActivity.this, android.R.layout.simple_list_item_1, new String[]{"Australia", "Bulgaria", "Cyprus"})); } } diff --git a/library/src/main/java/me/gujun/android/taggroup/TagGroup.java b/library/src/main/java/me/gujun/android/taggroup/TagGroup.java index 3e741ba..a7b37bd 100644 --- a/library/src/main/java/me/gujun/android/taggroup/TagGroup.java +++ b/library/src/main/java/me/gujun/android/taggroup/TagGroup.java @@ -757,17 +757,15 @@ public boolean onLongClick(View v) { addTextChangedListener(new TextWatcher() { @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { - } @Override public void onTextChanged(CharSequence s, int start, int before, int count) { - } @Override public void afterTextChanged(Editable s) { - onTagTextEntryListener.onTextEntry(TagView.this, s.toString()); + if (onTagTextEntryListener != null) onTagTextEntryListener.onTextEntry(TagView.this, s.toString()); } }); From 0c9b1270179b778d236a79b800b100598b250e79 Mon Sep 17 00:00:00 2001 From: Atanas Dimitrov Date: Fri, 7 Aug 2015 15:50:41 +0300 Subject: [PATCH 5/5] On Enter keyboard key press - submit the new tag. --- library/build.gradle | 2 +- library/src/main/java/me/gujun/android/taggroup/TagGroup.java | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/library/build.gradle b/library/build.gradle index 87bfd43..8206344 100644 --- a/library/build.gradle +++ b/library/build.gradle @@ -13,6 +13,6 @@ android { } } // Used to push in maven -apply from: '../maven-push.gradle' +//apply from: '../maven-push.gradle' dependencies { } \ No newline at end of file diff --git a/library/src/main/java/me/gujun/android/taggroup/TagGroup.java b/library/src/main/java/me/gujun/android/taggroup/TagGroup.java index a7b37bd..b155192 100644 --- a/library/src/main/java/me/gujun/android/taggroup/TagGroup.java +++ b/library/src/main/java/me/gujun/android/taggroup/TagGroup.java @@ -13,6 +13,7 @@ import android.os.Parcel; import android.os.Parcelable; import android.text.Editable; +import android.text.InputType; import android.text.TextUtils; import android.text.TextWatcher; import android.text.method.ArrowKeyMovementMethod; @@ -734,6 +735,8 @@ public TagView(Context context, final int state, CharSequence text) { setGravity(Gravity.CENTER); setText(text); setTextSize(TypedValue.COMPLEX_UNIT_PX, textSize); + setRawInputType(InputType.TYPE_CLASS_TEXT); + setImeOptions(EditorInfo.IME_ACTION_GO); mState = state;