2012-10-02 24 views
29

Tengo un AutoCompleteTextView en mi aplicación. La aplicación hace uso del SDK de Facebook. Seguí el código de esta pregunta en SO: https://stackoverflow.com/a/12363961/450534 hasta el punto y tengo una actividad de búsqueda (filtrado) en funcionamiento.Android: Autocompletar TextView similar a la aplicación de Facebook

Ahora, ¿cómo obtengo un autocompletado en línea como la aplicación de Facebook después de escribir el @ símbolo y todavía tengo el otro texto escrito por el usuario? La actividad en cuestión es para un Actualización de estado y puede contener los Amigos del usuario junto con otro texto. El AutoCompleteTextView o el EditText serán, naturalmente, de varias líneas. Para una actualización de estado, verá.

Sé por la falta de cualquier código en esta publicación, corro el riesgo de obtener downvoted o tal vez incluso tener la pregunta cerrada. Pero es realmente un código de filtro de lista de placas de caldera estándar.

EDITAR: La aplicación FriendCaster para Android también hace lo mismo.

+0

http://techdroid.kbeanie.com/2010/04/custom-autocomplete-for-android.html Algo como esto puede que le ayude a conseguir la idea ??? – Omarj

+0

No hay una solución lista para usar, una de las formas es que puede descompilar la aplicación de Facebook y ver el código. Hay muchos decompiladores disponibles. Pero lo que básicamente hacen es ampliar la vista de texto y personalizarla de acuerdo con sus necesidades. Creo que Twitter hace lo mismo. – Nitin

+0

@Nitin: no estoy del todo seguro de que me gustaría compilar el trabajo de otra persona. Además, incluso si tuviera que hacerlo, en el mejor de los casos, solo obtendría sus XML. No es su JAVA que creo que es lo que es necesario. –

Respuesta

34

Primero, convierta su EditText en un MultiAutoCompleteTextView. Un MultiAutoCompleteTextView le permite reemplazar ciertas partes del texto, por ejemplo, texto después de '@'.

El que puede hacer algo como esto:

final MultiAutoCompleteTextView inputEditText = (MultiAutoCompleteTextView) dialog.findViewById(R.id.MyEditText); 

String[] COUNTRIES = new String[] { "Belgium", "France", "Italy", "Germany", "Spain" }; 
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_dropdown_item_1line, COUNTRIES); 
inputEditText.setAdapter(adapter); 
inputEditText.setThreshold(1); //Set number of characters before the dropdown should be shown 

//Create a new Tokenizer which will get text after '@' and terminate on ' ' 
inputEditText.setTokenizer(new Tokenizer() { 

    @Override 
    public CharSequence terminateToken(CharSequence text) { 
    int i = text.length(); 

    while (i > 0 && text.charAt(i - 1) == ' ') { 
     i--; 
    } 

    if (i > 0 && text.charAt(i - 1) == ' ') { 
     return text; 
    } else { 
     if (text instanceof Spanned) { 
     SpannableString sp = new SpannableString(text + " "); 
     TextUtils.copySpansFrom((Spanned) text, 0, text.length(), Object.class, sp, 0); 
     return sp; 
     } else { 
     return text + " "; 
     } 
    } 
    } 

    @Override 
    public int findTokenStart(CharSequence text, int cursor) { 
    int i = cursor; 

    while (i > 0 && text.charAt(i - 1) != '@') { 
     i--; 
    } 

    //Check if token really started with @, else we don't have a valid token 
    if (i < 1 || text.charAt(i - 1) != '@') { 
     return cursor; 
    } 

    return i; 
    } 

    @Override 
    public int findTokenEnd(CharSequence text, int cursor) { 
    int i = cursor; 
    int len = text.length(); 

    while (i < len) { 
     if (text.charAt(i) == ' ') { 
     return i; 
     } else { 
     i++; 
     } 
    } 

    return len; 
    } 
}); 

Un "problema" con esto es que la ventana emergente aparecerá bajo el punto de vista EditarTexto. Para moverlo hacia arriba y colocarlo bajo el texto que actualmente está escrito que puede hacer algo como esto:

inputEditText.addTextChangedListener(new TextWatcher() { 

    @Override 
    public void onTextChanged(CharSequence s, int start, int before, int count) { 
    Layout layout = inputEditText.getLayout(); 
    int pos = inputEditText.getSelectionStart(); 
    int line = layout.getLineForOffset(pos); 
    int baseline = layout.getLineBaseline(line); 

    int bottom = inputEditText.getHeight(); 

    inputEditText.setDropDownVerticalOffset(baseline - bottom); 

    } 

    @Override 
    public void beforeTextChanged(CharSequence s, int start, int count, int after) { 
    } 

    @Override 
    public void afterTextChanged(Editable s) { 
    } 
}); 

Nota: Esto no tiene actualmente cuidar de la posición desplegable en el caso de que hay más líneas en el edittext que el edittext puede mostrar.

+1

¡Exactamente lo que necesitaba! Trabajado como un encanto. :-) –

+0

¿Puedo hacer una pregunta más? Independientemente de si lo respondes o no, la recompensa es tuya. –

+0

Preguntar, no puedo prometer que puedo responder :) – Heinrisch

0

https://github.com/dhaval001/linkable_text_view.git

forma sencilla de crear enlaces de texto, como el nombre de usuario @ o # hashtag, en Android TextView y EditarTexto con TextView multiautocomplete. enlace de Facebook e Instagram

Características

partido cuerdas sueltas o patrón de expresión regular para establecer enlaces Cambiar el color del texto vinculado Establecer el estilo del texto vinculado: negrita, cursiva, o BOLD_ITALIC establecer el subrayado de el texto vinculado Especificar clic acciones de una palabra específica OnTextChangedListener oyente para LinkableEditText

Cuestiones relacionadas