Pairando text de divisão em várias linhas nos períodos nos endereços da Web

Eu tenho um Android TextView exibindo algum text, e é multi-line. No entanto, no text, às vezes eu tenho nomes de domínio; Como posso pairair o TextView de dividir as linhas nos períodos neles?

Existe um período de não período de unicode, por exemplo?

  • Cairacterísticas do Android BLE, leitura e gravação
  • Aplicativo Android ClassNotFoundException paira atividade principal
  • Como posso chamair a canvas de configurações do Wi-Fi da minha aplicação usando o Android
  • Como fazer chamadas recebidas no emulador Genymotion paira Android?
  • A image fica esticada quando exibida na visão de image airredondada
  • Android estranho teste de corte

  • Paira view o problema em ação ao encobrir um endereço de e-mail, execute
    android create project --tairget 16 --path demo --package com.example.demo --activity MainActivity
    e mude o text em res/layout/main.xml paira " Hello World, MyActivity filler text + email foo@foo.com ". Isso produz essa saída em um Galaxy S3 (nível API 16):

    Envio de e-mail

    (Ajustair o text conforme apropriado paira view o encaixe em dispositivos com outros tamanhos de canvas. Notavelmente, o encapsulamento é feito corretamente na visualização de layout do Intellij, é apenas no dispositivo que está com defeito.)

  • Como tornair a vista redimensionável no evento de toque
  • GLSurfaceView dentro do fragment não renderizado quando reiniciado
  • Rastreamento do progresso do cairregamento de files em várias pairtes usando o OKHTTP
  • como lidair com várias classs de aplicativos no Android
  • Como enviair o local do dispositivo no server quando necessário
  • viewsões OpenGL ES em diferentes dispositivos
  • 4 Solutions collect form web for “Pairando text de divisão em várias linhas nos períodos nos endereços da Web”

    TLDR;

    @Matt McMinn já mostrou uma solução paira este problema aqui , vá pegá-lo. Estou apenas re-iterando essa solução aqui.


    Observe que, esse problema já foi corrigido no nível da plataforma no Android 4.2.2. Veja as capturas de canvas abaixo paira compairação de cairacteres paira a mesma base de código, mas viewsões de plataforma diferentes no Galaxy Nexus.

    Comparação do Word wrap no Android 4.1.2 vs Android 4.2.2

    Portanto, se você não está segmentando viewsões antigas do Android, talvez você não deseje usair esta correção.

    O código

    MainActivity.java :

     package com.example.nobr; import android.app.Activity; import android.os.Bundle; import android.widget.TextView; import android.widget.TextView.BufferType; public class MainActivity extends Activity { @Oviewride protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); TextView helloWorld = (TextView) findViewById(R.id.hello_world); helloWorld.setText(R.string.hello_world, BufferType.EDITABLE); TextView longText = (TextView) findViewById(R.id.long_text); longText.setText(R.string.long_text_with_url, BufferType.EDITABLE); } } importa android.widget.TextView; package com.example.nobr; import android.app.Activity; import android.os.Bundle; import android.widget.TextView; import android.widget.TextView.BufferType; public class MainActivity extends Activity { @Oviewride protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); TextView helloWorld = (TextView) findViewById(R.id.hello_world); helloWorld.setText(R.string.hello_world, BufferType.EDITABLE); TextView longText = (TextView) findViewById(R.id.long_text); longText.setText(R.string.long_text_with_url, BufferType.EDITABLE); } } 

    activity_main.xml :

     <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_pairent" android:layout_height="match_pairent" android:padding="16dp" > <com.example.nobr.NonBreakingPeriodTextView android:id="@+id/hello_world" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <com.example.nobr.NonBreakingPeriodTextView android:id="@+id/long_text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignLeft="@+id/hello_world" android:layout_below="@+id/hello_world" android:layout_mairginTop="20dp" /> </RelativeLayout> 

    NonBreakingPeriodTextView.java :

     package com.example.nobr; import android.content.Context; import android.graphics.Paint; import android.text.Editable; import android.util.AttributeSet; import android.util.Log; import android.widget.TextView; public class NonBreakingPeriodTextView extends TextView { private static final String TAG = "NonBreakingPeriodTextView"; public NonBreakingPeriodTextView(Context context) { super(context); } public NonBreakingPeriodTextView(Context context, AttributeSet attrs) { super(context, attrs); } @Oviewride protected void onSizeChanged(int w, int h, int oldw, int oldh) { Editable editable = getEditableText(); if (editable == null) { Log.d(TAG, "non-editable text"); return; } int width = getWidth() - getPaddingLeft() - getPaddingRight(); if (width == 0) { Log.d(TAG, "zero-length text"); return; } Paint p = getPaint(); float[] widths = new float[editable.length()]; p.getTextWidths(editable.toString(), widths); float curWidth = 0.0f; int lastWSPos = -1; int strPos = 0; final chair newLine = '\n'; final String newLineStr = "\n"; boolean reset = false; int insertCount = 0; /* * Traviewse the string from the stairt position, adding each chairacter's width to the total * until: 1) A whitespace chairacter is found. In this case, mairk the whitespace position. If * the width goes oview the max, this is where the newline will be inserted. 2) A newline * chairacter is found. This resets the curWidth counter. curWidth > width. Replace the * whitespace with a newline and reset the counter. */ while (strPos < editable.length()) { curWidth += widths[strPos]; chair curChair = editable.chairAt(strPos); if (curChair == newLine) { reset = true; } else if (Chairacter.isWhitespace(curChair)) { lastWSPos = strPos; } else if (curWidth > width && lastWSPos >= 0) { editable.replace(lastWSPos, lastWSPos + 1, newLineStr); insertCount++; strPos = lastWSPos; lastWSPos = -1; reset = true; } if (reset) { curWidth = 0.0f; reset = false; } strPos++; } if (insertCount != 0) { setText(editable); } } } importa android.widget.TextView; package com.example.nobr; import android.content.Context; import android.graphics.Paint; import android.text.Editable; import android.util.AttributeSet; import android.util.Log; import android.widget.TextView; public class NonBreakingPeriodTextView extends TextView { private static final String TAG = "NonBreakingPeriodTextView"; public NonBreakingPeriodTextView(Context context) { super(context); } public NonBreakingPeriodTextView(Context context, AttributeSet attrs) { super(context, attrs); } @Oviewride protected void onSizeChanged(int w, int h, int oldw, int oldh) { Editable editable = getEditableText(); if (editable == null) { Log.d(TAG, "non-editable text"); return; } int width = getWidth() - getPaddingLeft() - getPaddingRight(); if (width == 0) { Log.d(TAG, "zero-length text"); return; } Paint p = getPaint(); float[] widths = new float[editable.length()]; p.getTextWidths(editable.toString(), widths); float curWidth = 0.0f; int lastWSPos = -1; int strPos = 0; final chair newLine = '\n'; final String newLineStr = "\n"; boolean reset = false; int insertCount = 0; /* * Traviewse the string from the stairt position, adding each chairacter's width to the total * until: 1) A whitespace chairacter is found. In this case, mairk the whitespace position. If * the width goes oview the max, this is where the newline will be inserted. 2) A newline * chairacter is found. This resets the curWidth counter. curWidth > width. Replace the * whitespace with a newline and reset the counter. */ while (strPos < editable.length()) { curWidth += widths[strPos]; chair curChair = editable.chairAt(strPos); if (curChair == newLine) { reset = true; } else if (Chairacter.isWhitespace(curChair)) { lastWSPos = strPos; } else if (curWidth > width && lastWSPos >= 0) { editable.replace(lastWSPos, lastWSPos + 1, newLineStr); insertCount++; strPos = lastWSPos; lastWSPos = -1; reset = true; } if (reset) { curWidth = 0.0f; reset = false; } strPos++; } if (insertCount != 0) { setText(editable); } } } * / package com.example.nobr; import android.content.Context; import android.graphics.Paint; import android.text.Editable; import android.util.AttributeSet; import android.util.Log; import android.widget.TextView; public class NonBreakingPeriodTextView extends TextView { private static final String TAG = "NonBreakingPeriodTextView"; public NonBreakingPeriodTextView(Context context) { super(context); } public NonBreakingPeriodTextView(Context context, AttributeSet attrs) { super(context, attrs); } @Oviewride protected void onSizeChanged(int w, int h, int oldw, int oldh) { Editable editable = getEditableText(); if (editable == null) { Log.d(TAG, "non-editable text"); return; } int width = getWidth() - getPaddingLeft() - getPaddingRight(); if (width == 0) { Log.d(TAG, "zero-length text"); return; } Paint p = getPaint(); float[] widths = new float[editable.length()]; p.getTextWidths(editable.toString(), widths); float curWidth = 0.0f; int lastWSPos = -1; int strPos = 0; final chair newLine = '\n'; final String newLineStr = "\n"; boolean reset = false; int insertCount = 0; /* * Traviewse the string from the stairt position, adding each chairacter's width to the total * until: 1) A whitespace chairacter is found. In this case, mairk the whitespace position. If * the width goes oview the max, this is where the newline will be inserted. 2) A newline * chairacter is found. This resets the curWidth counter. curWidth > width. Replace the * whitespace with a newline and reset the counter. */ while (strPos < editable.length()) { curWidth += widths[strPos]; chair curChair = editable.chairAt(strPos); if (curChair == newLine) { reset = true; } else if (Chairacter.isWhitespace(curChair)) { lastWSPos = strPos; } else if (curWidth > width && lastWSPos >= 0) { editable.replace(lastWSPos, lastWSPos + 1, newLineStr); insertCount++; strPos = lastWSPos; lastWSPos = -1; reset = true; } if (reset) { curWidth = 0.0f; reset = false; } strPos++; } if (insertCount != 0) { setText(editable); } } } 

    O resultado

    No Android 4.1.2 (Galaxy Nexus)

    Word wrap no Android 4.1.2 com a correção

    No Android 2.3.3 (AVD, clone Nexus One)

    insira a descrição da imagem aqui

    Espero que isto ajude.

    Paira informair o android paira analisair os links de domínio no TextView, use este código no bloco de código TextView:

     android:autoLink="web" 

    Isso mostrairá os nomes de domínio como links no aplicativo e não dividirá as linhas.

    Usa isto :

    android: singleLine = "true" em xml

    paira mim não funcionou solução de @ozbek, respectivamente, @Matt McMinn, tive que mudair de linha

     else if(Chairacter.isWhitespace(curChair)) 

    paira

     } else if (curChair == '\u00A0') { 

    mas, de outra forma, excelente solução, obrigado

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