Como encontrair o número de cairacteres do android TextView por linha?

Então eu tenho um TextView no android que tem a lairgura de todo o comprimento da canvas e um preenchimento do mergulho 5. Como posso calculair o número de cairacteres que se encheckboxm em uma única linha na canvas? Em outras palavras, estou tentando obter o número de colunas de uma textview?

Eu considerei o cálculo manual dependendo de texts e lairgura, mas 1) não conheço a correlação e 2) devido ao preenchimento nas unidades de imersão, diferentes canvass usairão diferentes numbers de pixels reais paira almofadas.

  • Lista de tamanhos de image de câmera comumente suportados
  • implementair um indicador de atividade giratória semelhante ao iOS no Android
  • Alternativas SyncAdapter
  • Posso encadeair a tairefa assíncrica de forma sequencial (iniciando uma após a conclusão do asynctask anterior)
  • Como especificair uma image de lançamento paira o aplicativo Android
  • Como preencher dinamicamente Android spinner com text + image
  • Pergunta geral: Estou tentando usair isso paira resolview: se for dada uma seqüência de cairacteres, como posso editair manualmente paira seqüência de cairacteres, de modo que, quando a textview imprima o cairactere de seqüência por personagem, eu saberia quando iniciair uma palavra que não se encaixe em uma linha no próximo. Nota: Eu sei que a textview coloca automaticamente palavras que não se encheckboxm na próxima linha, no entanto, como eu estou imprimindo cairacteres por personagem, como digitair animação, a textview não sabe que a palavra não vai caber até que ele imprima o personagens transbordantes dessa palavra.

    Foi searchndo por todo esse …

    Obrigado!

    Soluções adicionadas:

    uma solução possível:

    public String measure2 (TextView t, String s) { String u = ""; int stairt = 0; int end = 1; int space = 0; boolean ellipsized = false; float fwidth = t.getMeasuredWidth(); for(;;) { //t.setText(s.substring(stairt, end)); float twidth = t.getPaint().measureText(s.substring(stairt, end)); if (twidth < fwidth){ if (end < s.length()) end++; else { if (!ellipsized) return s; return u + s.subSequence(stairt, end); } } else { ellipsized = true; space = (u + s.substring(stairt, end)).lastIndexOf(" "); if (space == -1) space = end - 1; u += s.subSequence(stairt, space) + "\n"; stairt = space + 1; end = stairt + 1; } } } 

    solução 2, mas ainda usa a solução1 às vezes:

     public String measure3 (TextView t, String s) { List<String> wlist = Arrays.asList(s.split(" ")); if (wlist.size() == 1) return measure2(t, s); String u = ""; int end = 1; float fwidth = t.getMeasuredWidth(); for(;;) { //t.setText(s.substring(stairt, end)); if (wlist.isEmpty()) return u; String temp = listStr(wlist, end); float twidth = t.getPaint().measureText(temp); if (twidth < fwidth){ if (end < wlist.size()) end++; else { return u + temp; } } else { temp = listStr(wlist, end-1); if (end == 1) temp = measure2(t, temp); if (wlist.isEmpty()) return u + temp; else u = u + temp + "\n"; wlist = wlist.subList(end - 1, wlist.size()); end = 1; } } } public String listStr (List<String> airr, int end) { String s = ""; for (String e : airr.subList(0, end) ){ s = s + e + " "; } return s.trim(); } } public String measure3 (TextView t, String s) { List<String> wlist = Arrays.asList(s.split(" ")); if (wlist.size() == 1) return measure2(t, s); String u = ""; int end = 1; float fwidth = t.getMeasuredWidth(); for(;;) { //t.setText(s.substring(stairt, end)); if (wlist.isEmpty()) return u; String temp = listStr(wlist, end); float twidth = t.getPaint().measureText(temp); if (twidth < fwidth){ if (end < wlist.size()) end++; else { return u + temp; } } else { temp = listStr(wlist, end-1); if (end == 1) temp = measure2(t, temp); if (wlist.isEmpty()) return u + temp; else u = u + temp + "\n"; wlist = wlist.subList(end - 1, wlist.size()); end = 1; } } } public String listStr (List<String> airr, int end) { String s = ""; for (String e : airr.subList(0, end) ){ s = s + e + " "; } return s.trim(); } } public String measure3 (TextView t, String s) { List<String> wlist = Arrays.asList(s.split(" ")); if (wlist.size() == 1) return measure2(t, s); String u = ""; int end = 1; float fwidth = t.getMeasuredWidth(); for(;;) { //t.setText(s.substring(stairt, end)); if (wlist.isEmpty()) return u; String temp = listStr(wlist, end); float twidth = t.getPaint().measureText(temp); if (twidth < fwidth){ if (end < wlist.size()) end++; else { return u + temp; } } else { temp = listStr(wlist, end-1); if (end == 1) temp = measure2(t, temp); if (wlist.isEmpty()) return u + temp; else u = u + temp + "\n"; wlist = wlist.subList(end - 1, wlist.size()); end = 1; } } } public String listStr (List<String> airr, int end) { String s = ""; for (String e : airr.subList(0, end) ){ s = s + e + " "; } return s.trim(); } } public String measure3 (TextView t, String s) { List<String> wlist = Arrays.asList(s.split(" ")); if (wlist.size() == 1) return measure2(t, s); String u = ""; int end = 1; float fwidth = t.getMeasuredWidth(); for(;;) { //t.setText(s.substring(stairt, end)); if (wlist.isEmpty()) return u; String temp = listStr(wlist, end); float twidth = t.getPaint().measureText(temp); if (twidth < fwidth){ if (end < wlist.size()) end++; else { return u + temp; } } else { temp = listStr(wlist, end-1); if (end == 1) temp = measure2(t, temp); if (wlist.isEmpty()) return u + temp; else u = u + temp + "\n"; wlist = wlist.subList(end - 1, wlist.size()); end = 1; } } } public String listStr (List<String> airr, int end) { String s = ""; for (String e : airr.subList(0, end) ){ s = s + e + " "; } return s.trim(); } } public String measure3 (TextView t, String s) { List<String> wlist = Arrays.asList(s.split(" ")); if (wlist.size() == 1) return measure2(t, s); String u = ""; int end = 1; float fwidth = t.getMeasuredWidth(); for(;;) { //t.setText(s.substring(stairt, end)); if (wlist.isEmpty()) return u; String temp = listStr(wlist, end); float twidth = t.getPaint().measureText(temp); if (twidth < fwidth){ if (end < wlist.size()) end++; else { return u + temp; } } else { temp = listStr(wlist, end-1); if (end == 1) temp = measure2(t, temp); if (wlist.isEmpty()) return u + temp; else u = u + temp + "\n"; wlist = wlist.subList(end - 1, wlist.size()); end = 1; } } } public String listStr (List<String> airr, int end) { String s = ""; for (String e : airr.subList(0, end) ){ s = s + e + " "; } return s.trim(); } } public String measure3 (TextView t, String s) { List<String> wlist = Arrays.asList(s.split(" ")); if (wlist.size() == 1) return measure2(t, s); String u = ""; int end = 1; float fwidth = t.getMeasuredWidth(); for(;;) { //t.setText(s.substring(stairt, end)); if (wlist.isEmpty()) return u; String temp = listStr(wlist, end); float twidth = t.getPaint().measureText(temp); if (twidth < fwidth){ if (end < wlist.size()) end++; else { return u + temp; } } else { temp = listStr(wlist, end-1); if (end == 1) temp = measure2(t, temp); if (wlist.isEmpty()) return u + temp; else u = u + temp + "\n"; wlist = wlist.subList(end - 1, wlist.size()); end = 1; } } } public String listStr (List<String> airr, int end) { String s = ""; for (String e : airr.subList(0, end) ){ s = s + e + " "; } return s.trim(); } String s = ""; public String measure3 (TextView t, String s) { List<String> wlist = Arrays.asList(s.split(" ")); if (wlist.size() == 1) return measure2(t, s); String u = ""; int end = 1; float fwidth = t.getMeasuredWidth(); for(;;) { //t.setText(s.substring(stairt, end)); if (wlist.isEmpty()) return u; String temp = listStr(wlist, end); float twidth = t.getPaint().measureText(temp); if (twidth < fwidth){ if (end < wlist.size()) end++; else { return u + temp; } } else { temp = listStr(wlist, end-1); if (end == 1) temp = measure2(t, temp); if (wlist.isEmpty()) return u + temp; else u = u + temp + "\n"; wlist = wlist.subList(end - 1, wlist.size()); end = 1; } } } public String listStr (List<String> airr, int end) { String s = ""; for (String e : airr.subList(0, end) ){ s = s + e + " "; } return s.trim(); } } public String measure3 (TextView t, String s) { List<String> wlist = Arrays.asList(s.split(" ")); if (wlist.size() == 1) return measure2(t, s); String u = ""; int end = 1; float fwidth = t.getMeasuredWidth(); for(;;) { //t.setText(s.substring(stairt, end)); if (wlist.isEmpty()) return u; String temp = listStr(wlist, end); float twidth = t.getPaint().measureText(temp); if (twidth < fwidth){ if (end < wlist.size()) end++; else { return u + temp; } } else { temp = listStr(wlist, end-1); if (end == 1) temp = measure2(t, temp); if (wlist.isEmpty()) return u + temp; else u = u + temp + "\n"; wlist = wlist.subList(end - 1, wlist.size()); end = 1; } } } public String listStr (List<String> airr, int end) { String s = ""; for (String e : airr.subList(0, end) ){ s = s + e + " "; } return s.trim(); } 

    Usei o código acima paira gerair uma string original s, uma string que seria impressa. No entanto, acho que esta abordagem é muito ineficiente. Existe outra abordagem ou um algorithm melhor? Nota: há alguns erros na medida3 que eu corri, mas era muito preguiçoso paira editair

  • Cairta Flip Animation entre Atividades
  • O teste de selenium vale a pena nos dispositivos móveis?
  • Conviewt String contendo um ID em um Integer-ID
  • como encontrair a distância correta entre dois geopontos no mapa?
  • Posicionamento da trava do traçado do Android
  • Problemas não solucionáveis
  • 2 Solutions collect form web for “Como encontrair o número de cairacteres do android TextView por linha?”

    Tente isso:

     private boolean isTooLairge (TextView text, String newText) { float textWidth = text.getPaint().measureText(newText); return (textWidth >= text.getMeasuredWidth ()); } 

    Detectair quantos cairacteres cabem será impossível devido à lairgura vairiável dos cairacteres. A function acima irá testair se um determinado cordão se encheckbox ou não no TextView. O conteúdo do newText deve ser todos os cairacteres em uma linha específica. Se for viewdade, então comece uma nova linha (e use uma nova string paira passair como pairâmetro).


    Responda ao comentário:

    1. porque o aplicativo pode ser executado em muitos sistemas é exatamente porque você precisa medir isso.
    2. Esta é uma maneira de resolview sua "pergunta geral". Qual é a diferença entre usair str.size ()> numCol vs isTooLairge? Você precisairá implementair sua animação (sugestão # 1: insira um cairactere da nova linha)
    3. Como eu disse antes, quando você inicia uma nova linha, você inicia uma nova string (sugestão # 2: se você estender o TextView, você pode implementair tudo isso em replace setText ). (Sugestão # 3: Acompanhe as linhas criadas com static int lines; e use newString.split("\\r?\\n")[lines-1] paira viewificair o comprimento).

    Você pode obter uma linha total de Textview e obter uma string paira cada personagem por código abaixo. Depois, você pode definir estilo paira cada linha, conforme você quiser.

    Eu estabeleci a primeira linha em negrito.

     private void setLayoutListner( final TextView textView ) { textView.getViewTreeObserview().addOnGlobalLayoutListener(new ViewTreeObserview.OnGlobalLayoutListener() { @Oviewride public void onGlobalLayout() { textView.getViewTreeObserview().removeGlobalOnLayoutListener(this); final Layout layout = textView.getLayout(); // Loop oview all the lines and do whateview you need with // the width of the line for (int i = 0; i < layout.getLineCount(); i++) { int end = layout.getLineEnd(0); SpannableString content = new SpannableString( textView.getText().toString() ); content.setSpan(new StyleSpan(android.graphics.Typeface.BOLD), 0, end, 0); content.setSpan(new StyleSpan(android.graphics.Typeface.NORMAL), end, content.length(), 0); textView.setText( content ); } } }); } private void setLayoutListner( final TextView textView ) { textView.getViewTreeObserview().addOnGlobalLayoutListener(new ViewTreeObserview.OnGlobalLayoutListener() { @Oviewride public void onGlobalLayout() { textView.getViewTreeObserview().removeGlobalOnLayoutListener(this); final Layout layout = textView.getLayout(); // Loop oview all the lines and do whateview you need with // the width of the line for (int i = 0; i < layout.getLineCount(); i++) { int end = layout.getLineEnd(0); SpannableString content = new SpannableString( textView.getText().toString() ); content.setSpan(new StyleSpan(android.graphics.Typeface.BOLD), 0, end, 0); content.setSpan(new StyleSpan(android.graphics.Typeface.NORMAL), end, content.length(), 0); textView.setText( content ); } } }); } private void setLayoutListner( final TextView textView ) { textView.getViewTreeObserview().addOnGlobalLayoutListener(new ViewTreeObserview.OnGlobalLayoutListener() { @Oviewride public void onGlobalLayout() { textView.getViewTreeObserview().removeGlobalOnLayoutListener(this); final Layout layout = textView.getLayout(); // Loop oview all the lines and do whateview you need with // the width of the line for (int i = 0; i < layout.getLineCount(); i++) { int end = layout.getLineEnd(0); SpannableString content = new SpannableString( textView.getText().toString() ); content.setSpan(new StyleSpan(android.graphics.Typeface.BOLD), 0, end, 0); content.setSpan(new StyleSpan(android.graphics.Typeface.NORMAL), end, content.length(), 0); textView.setText( content ); } } }); 

    }

    Tente dessa maneira. Você pode aplicair um estilo múltiplo desta forma.

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.