Tengo un database search query que la búsqueda en la base de datos para una palabra introducida por el usuario y devolver un Cursor.

En mi ListActivity, tengo un ListView que será la titular de los elementos (el Cursor de elementos). El ListView elementos de diseño es básicamente un TextView. Quiero decir, el ListView será una lista de TextView‘s.

Lo que quiero es resaltar la search term donde quiera que aparezca en la TextView. Me refiero al destacar: diferente color o un color de fondo diferente o algo que la hace diferente al resto del texto.

Es esto posible? y cómo?

Actualización:

cursor = myDbHelper.search(term);  //term: a word entered by the user.
cursor.moveToFirst();
String[] columns = {cursor.getColumnName(1)}; 
int[] columnsLayouts = {R.id.item_title}; //item_title: the TextView holding the one raw
ca = new SimpleCursorAdapter(this.getBaseContext(), R.layout.items_layout, cursor,columns , columnsLayouts);
lv = getListView();
lv.setAdapter(ca);

Para @Shailendra: El search() método devolverá algunos de los títulos. Quiero resaltar las palabras en los títulos que coincide con el term palabra. Espero que esto está claro ahora.

InformationsquelleAutor iTurki | 2011-07-27

8 Comentarios

  1. 38

    insertar código HTML de color alrededor de la palabra y la puso a su textView .

    como

    String newString = oldString.replaceAll(textToHighlight, "<font color='red'>"+textToHighlight+"</font>");
    textView.setText(Html.fromHtml(newString));
    • El problema es que no es un simple un TextView que tiene un texto. Se trata de un ListView que contiene los resultados de la consulta (puede ser 1 o más resultados. Así, puede ser un TextView o más). Así, dudo que me puede cambiar el texto en esta lista, de esta manera, puedo?
    • así ?? no veo ningún problema con respecto a un texto dentro de listview …… usted puede elaborar su problema un poco más ???
    • Ver la actualización por favor
    • aquí usted está usando SimpleCursorAdapter el que va a fijar el Texto de la respectiva columna a TextView R. id.item_title . así que customAdapter que se extienden SimpleCursorAdapter . pase la Cadena de plazo y escribir sobre replaceAll código en getView método reemplazado
    • Voy a intentarlo y volver a aquí 🙂
    • Si el tipo de usuario en la etiqueta html, no iban a ser capaces de hacer cosas graciosas para el texto?

  2. 21
    TextView textView = (TextView)findViewById(R.id.mytextview01);
    
    //use a loop to change text color
    Spannable WordtoSpan = new SpannableString("partial colored text");        
    WordtoSpan.setSpan(new ForegroundColorSpan(Color.BLUE), 2, 4, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
    textView.setText(WordtoSpan);

    Los números 2 y 4 son de inicio/parada de los índices para el color del texto, en este ejemplo «rti» sería de color.

    Así que, básicamente, sólo tienes que encontrar el índice inicial de la búsqueda de palabras en el título:

    int startIndex = titleText.indexOf(term);
    int stopIndex = startIndex + term.length();

    y, a continuación, reemplazar los números 2 y 4 con los índices y «parcial color de texto» con su cadena de título.

    fuente: https://stackoverflow.com/a/10279703/2160827

    • lol, WordtoSpan.setSpan(...) agradable nombres de las variables
  3. 4

    Sé que es vieja pregunta, pero he creado un método para resaltar la repetición de una palabra en la cadena\párrafo.

    private Spannable highlight(int color, Spannable original, String word) {
        String normalized = Normalizer.normalize(original, Normalizer.Form.NFD)
                .replaceAll("\p{InCombiningDiacriticalMarks}+", "");
    
        int start = normalized.indexOf(word);
        if (start < 0) {
            return original;
        } else {
            Spannable highlighted = new SpannableString(original);
            while (start >= 0) {
                int spanStart = Math.min(start, original.length());
                int spanEnd = Math.min(start+word.length(), original.length());
    
                highlighted.setSpan(new ForegroundColorSpan(color), spanStart,
                        spanEnd, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
    
                start = normalizedText.indexOf(word, spanEnd);
            }
            return highlighted;
        }
    }

    uso:

    textView.setText(highlight(primaryColor, textAll, wordToHighlight));
    • Si debo añadir a esto, no convertir la extendió palabra toString persona pierde todo el resalte
  4. 2

    Todavía no he hecho, pero esto se ve prometedor:

    http://developer.android.com/reference/android/text/SpannableString.html
    http://developer.android.com/guide/topics/resources/string-resource.html

    public final void setText (CharSequence de texto)

    Desde: API de Nivel 1 Establece la cadena de valor de la TextView. TextView
    no acepta HTML como el formato, lo que puede hacer con el texto
    cadenas en archivos de recursos XML. El estilo de sus cadenas, adjuntar
    android.texto.de estilo.* los objetos a un SpannableString, o ver la
    Tipos de Recursos disponibles de la documentación para un ejemplo de configuración
    con formato de texto en el archivo de recursos XML.

    http://developer.android.com/reference/android/widget/TextView.html

  5. 1

    Probar esta biblioteca Android TextHighlighter.

    Implementaciones

    TextView.setText() recibe un parámetro, como se Spannable no sólo CharacterSequence. SpannableString tiene un método setSpan() que permite la aplicación de estilos.

    Ver la lista de subclase directa formulario CharacterStyle https://developer.android.com/reference/android/text/style/CharacterStyle.html

    • ejemplo de dar color de fondo y color de primer plano para la palabra «Hola», «Hola, Mundo»
    Spannable spannable = new SpannableString("Hello, World");
    //setting red foreground color
    ForegroundSpan fgSpan = new ForegroundColorSpan(Color.red);
    //setting blue background color
    BackgroundSpan bgSpan = new BackgroundColorSPan(Color.blue);
    
    //setSpan requires start and end index
    //in our case, it's 0 and 5
    //You can directly set fgSpan or bgSpan, however,
    //to reuse defined CharacterStyle, use CharacterStyle.wrap()
    spannable.setSpan(CharacterStyle.wrap(fgSpan), 0, 5, 0);
    spannable.setSpan(CharacterStyle.wrap(bgSpan), 0, 5, 0);
    
    //apply spannableString on textview
    textView.setText(spannable);
    • El uso de la biblioteca, añadir a gradle: compile 'com.xeoh.android:text-highlighter:1.0.1' (pero tu ejemplo de código no es para la biblioteca)
  6. 1

    Hacerlo en xml strings si las cadenas son estáticas

    <string name="my_text">This text is <font color='red'>red here</font></string>
  7. 1

    Manera Más Fácil

    Puede utilizar Spannable clase para destacar/formateo parte del Texto.

    textView.setText("Hello, I am Awesome, Most Awesome"); //set text first
    setHighLightedText(textView, "a"); //highlight all `a` in TextView

    Android - Resaltar una Palabra En un TextView?

    Aquí es el método.

     /**
         * use this method to highlight a text in TextView
         *
         * @param tv              TextView or Edittext or Button (or derived from TextView)
         * @param textToHighlight Text to highlight
         */
        public void setHighLightedText(TextView tv, String textToHighlight) {
            String tvt = tv.getText().toString();
            int ofe = tvt.indexOf(textToHighlight, 0);
            Spannable wordToSpan = new SpannableString(tv.getText());
            for (int ofs = 0; ofs < tvt.length() && ofe != -1; ofs = ofe + 1) {
                ofe = tvt.indexOf(textToHighlight, ofs);
                if (ofe == -1)
                    break;
                else {
                    //set color here
                    wordToSpan.setSpan(new BackgroundColorSpan(0xFFFFFF00), ofe, ofe + textToHighlight.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
                    tv.setText(wordToSpan, TextView.BufferType.SPANNABLE);
                }
            }
        }

    Puede comprobar esta respuesta para hacer clic texto resaltado.

  8. 0

    Sé que este hilo es viejo, pero en caso de que nadie está mirando para resaltar las cadenas en un textview, he creado una biblioteca que hace exactamente esto. Esta es mi primera respuesta a una pregunta sobre el desbordamiento de la pila, como acabo de unió, esperamos que sea el formato adecuado y pertinente. Utiliza SpannableString y localizar todas las apariciones de una cadena especificada. Además, una costumbre ClickableSpan está construido en dar la opción para configurar los oyentes de texto para hacer clic, si se desea.

    Enlazador

    Ligero android biblioteca para destacar las Cadenas dentro de un textview (ignorando mayúsculas y minúsculas), con la opción de devoluciones de llamada.

    Lenguaje: Java

    MinSDK: 17

    Una imagen de su funcionalidad y todo el código se puede encontrar
    aquí.

    JavaDocs

    A traer en su proyecto android implementar el artefacto:

    En el nivel de Proyecto a construir.gradle

        allprojects {
            repositories {
                ...
                maven { url 'https://jitpack.io' }
            }
        }

    En la Aplicación a nivel de generación.gradle

           dependencies {
                implementation 'com.github.Gaineyj0349:Linker:1.2'
        }

    Cómo utilizar:

    1 – Construir un Enlazador objeto con un textview:

            Linker linker = new Linker(textView);

    2 – Agregar una matriz o una lista de cadenas a destacar dentro de los textview del texto:

            ArrayList<String> list = new ArrayList<>();
            list.add("hello");
            list.add("world");
            linker.addStrings(list);

    Y/O

            String[] words = new String[]{"One", "Two", "Three"};
            linker.addStrings(words);

    3 – Agregar una devolución de llamada: (esto es opcional):

           linker.setListener(new LinkerListener() {
                @Override
                public void onLinkClick(String charSequenceClicked) {
    
                    //charSequenceClicked is the word that was clicked
    
                    Toast.makeText(MainActivity.this, charSequenceClicked, Toast.LENGTH_SHORT).show();
                }
            });

    4 – la Llamada del vinculador método de actualización para cometer la personalización y la implementación del programa de instalación.:

            linker.update();

    Usted siempre tiene la opción de agregar Cadenas para el enlazador objeto, sólo asegúrese de llamar al método update después de actualizar la abarca.

        linker.addStrings("yoda");
        linker.update();

    Si usted necesita un fresco de la pizarra con el mismo enlazador objeto acaba de llamar

           linker.clearLinksList()

    Puede personalizar los enlaces también:

    1 de Personalizar todos los colores de los enlaces:

          linker.setAllLinkColors(Color.BLUE);

    2 – Personalizar enlace subraya:

          linker.setAllLinkUnderline(false);

    3 – Si usted desea personalizar un color o subrayado la configuración de una determinada cadena (nota de la cadena ya debe ser añadido a la linker):

          linker.setLinkColorForCharSequence("world", Color.MAGENTA);
          linker.setUnderlineModeForCharSequence("world", true);

    4 – Si usted desea utilizar diferentes configuraciones para cada palabra, a continuación, también se puede dar el enlazador de objetos de una lista o una matriz de LinkProfiles:

            ArrayList<LinkProfile> profiles = new ArrayList<>();
            profiles.add(new LinkProfile("hello world",
                    Color.GREEN, false));
            profiles.add(new LinkProfile("goodbye cruel world",
                    Color.RED, false));
            profiles.add(new LinkProfile("Whoa awesome!",
                    Color.CYAN, true));
    
    
            linker.addProfiles(profiles);

    Sólo recuerda a la llamada .update() después de cualquier adiciones a la utilidad del objeto.

    Tenga en cuenta que la biblioteca se encargará de sutilezas como la adición de dos de las mismas palabras, o las mismas partes de una palabra. Por ejemplo, si «helloworld» y «hola» son dos de las palabras agregadas a la enlazador, «helloworld» tendrán preferencia sobre el «hola», cuando ellos están en el mismo lapso de caracteres. El vinculador ordenar de acuerdo a las grandes palabras de la primera y de seguimiento de todos los espacios como los liga – evitar el problema de la duplicación, así como de intersección se extiende.

    Licenciado bajo la licencia MIT .

Dejar respuesta

Please enter your comment!
Please enter your name here