edittext - settext android
Cómo evitar que se llame a ambos: onItemClicked y onTextChanged en AutoCompleteTextView (2)
No hay una solución particular para este problema. Le sugeriré que coloque el código que está dentro de onclicklistener () al principio de textchangedlistener () para que el código que desea ejecutar primero se ejecute primero y luego el código que quieres ejecutar el último ejecutará el último. Espero que esto te ayude.
Tengo este codigo Cuando elijo un elemento de la lista de sugerencias, onTextChanged sucede primero, luego oItemClicked aparece después de eso. Ahora quiero elegir una palabra, primero aparece "onItemClicked", luego "onTextChanged". Eché un vistazo al documento de Android pero no menciona este tema.
package com.autocompletetest;
import java.util.Arrays;
import java.util.List;
import android.app.Activity;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.AutoCompleteTextView;
public class OnItemClickAndOnTextChangedActivity extends Activity implements TextWatcher, OnItemClickListener {
private AutoCompleteTextView textView;
private static final String[] TEMP = new String[] {
"Beep", "Belgium", "Best", "Bubble", "Bye"
};
@Override
protected void onCreate(final Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.main);
textView = (AutoCompleteTextView)findViewById(R.id.autoCompleteTextView1);
textView.setOnItemClickListener(this);
textView.addTextChangedListener(this);
textView.setThreshold(1);
final List<String> list = Arrays.asList(TEMP);
final ArrayAdapter<String> adapter = new ArrayAdapter<String>(
OnItemClickAndOnTextChangedActivity.this,
android.R.layout.simple_dropdown_item_1line, list);
textView.setAdapter(adapter);
}
@Override
public void onTextChanged(final CharSequence s, final int start, final int before, final int count) {
System.out.println("OnTextChanged.");
}
@Override
public void onItemClick(final AdapterView<?> parent, final View view, final int position, final long id) {
System.out.println("OnItemClick.");
}
@Override
public void beforeTextChanged(final CharSequence s, final int start, final int count, final int after) {
}
@Override
public void afterTextChanged(final Editable s) {
}
}
Actualización: En detalle, esto es algo real que quiero hacer. Algo no está relacionado con el título de la pregunta.
package com.autocompletetest;
import java.util.Arrays;
import java.util.List;
import android.app.Activity;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.AutoCompleteTextView;
public class OnItemClickAndOnTextChangedActivity extends Activity implements TextWatcher, OnItemClickListener {
private AutoCompleteTextView textView;
private boolean itemClicked;
private static final String[] TEMP = new String[] {
"Beep", "Belgium", "Best", "Bubble", "Bye"
};
@Override
protected void onCreate(final Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.main);
textView = (AutoCompleteTextView)findViewById(R.id.autoCompleteTextView1);
textView.setOnItemClickListener(this);
textView.addTextChangedListener(this);
textView.setThreshold(1);
final List<String> list = Arrays.asList(TEMP);
final ArrayAdapter<String> adapter = new ArrayAdapter<String>(
OnItemClickAndOnTextChangedActivity.this,
android.R.layout.simple_dropdown_item_1line, list);
textView.setAdapter(adapter);
}
@Override
public void onTextChanged(final CharSequence s, final int start, final int before, final int count) {
System.out.println("OnTextChanged.");
// The below code block does:
// When type a word, make a new ArrayAdapter and set it for textView
// If any of word in suggestion list is clicked, nothing changes, dropdown list not shown.
if(itemClicked) {
itemClicked = false;
} else {
// Create new ArrayAdapter.
// textView is set to new ArrayAdapter.
// textView.showDropDown()
}
}
@Override
public void onItemClick(final AdapterView<?> parent, final View view, final int position, final long id) {
System.out.println("OnItemClick.");
itemClicked = true;
}
@Override
public void beforeTextChanged(final CharSequence s, final int start, final int count, final int after) {
}
@Override
public void afterTextChanged(final Editable s) {
}
}
isPerformingCompletion () se agregó en el nivel 3 de la API. Devuelve true después de que se haya seleccionado un elemento de la lista desplegable y los oyentes de TextWatcher están a punto de activarse . En definitiva, para evitar el comportamiento descrito:
public void onTextChanged(CharSequence s, int start, int before, int count) {
if (autoCompleteView.isPerformingCompletion()) {
// An item has been selected from the list. Ignore.
return;
}
// Your code for a general case
}