Eu tenho uma horizontal LinearLayout
contendo um TextView
seguido por um Spinner
próximo a ele. Isso LinearLayout
é dinamicamente inflado várias vezes em uma vertical fixa LinearLayout
contida em um RelativeLayout
.
O problema é que, como mudei de Theme.light
para Theme.holo.light
, a última linha do TextView
é cortada pela metade. Isso acontece quando o texto dinâmico é longo e se estende por mais de uma linha.
Consegui corrigir isso adicionando preenchimento inferior à horizontal que LinearLayout
contém o TextView
e Spinner
.
Isso não parece uma solução, mas sim um hack. Alguém pode me dar alguns conselhos sobre como corrigir isso corretamente?
Também li algumas outras perguntas, mas nenhuma parece ajudar.
Layout linear horizontal:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:id="@+id/textView1"
android:layout_width="150dp"
android:layout_height="wrap_content"
android:layout_marginRight="20dp"
android:text="TextView"/>
<Spinner
android:id="@+id/spinner1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>
Layout relativo onde o layout acima é dinamicamente inflado no Layout linear com id ll2_7:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<ScrollView
android:id="@+id/scrollView"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_above="@+id/relLayoutButtonNext"
android:layout_below="@id/textView1" >
<RelativeLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:paddingBottom="20dp"
android:paddingLeft="10dp"
android:paddingRight="10dp"
android:paddingTop="10dp" >
<TextView
android:id="@+id/textView10"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingRight="30dp"
android:text="2.7" />
<TextView
android:id="@+id/textView11"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="10dp"
android:layout_toRightOf="@id/textView10"
android:text="@string/question2_7" />
<LinearLayout
android:id="@+id/ll2_7"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/textView11"
android:layout_below="@+id/textView11"
android:orientation="vertical" android:layout_marginBottom="20dp">
</LinearLayout>
</RelativeLayout>
</ScrollView>
</RelativeLayout>
EDITAR: Aqui está o layout xml completo para acima:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<TextView
android:id="@+id/textView1"
style="@style/question_section_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:text="@string/question2_header" />
<RelativeLayout
android:id="@+id/relLayoutButtonNext"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:background="@color/bottomBar"
android:paddingBottom="3dp"
android:paddingLeft="50dp"
android:paddingRight="50dp"
android:paddingTop="3dp" >
<Button
android:id="@+id/buttonNext"
android:layout_width="180dp"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:onClick="nextStep"
android:text="Next Section"
android:textSize="20sp" />
<Button
android:id="@+id/buttonPrevious"
android:layout_width="180dp"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:onClick="previousStep"
android:text="Previous Section"
android:textSize="20sp" />
</RelativeLayout>
<ScrollView
android:id="@+id/scrollView"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_above="@+id/relLayoutButtonNext"
android:layout_below="@id/textView1" >
<RelativeLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:paddingBottom="20dp"
android:paddingLeft="10dp"
android:paddingRight="10dp"
android:paddingTop="10dp" >
<TextView
android:id="@+id/textView10"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingRight="30dp"
android:text="2.7" />
<TextView
android:id="@+id/textView11"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="10dp"
android:layout_toRightOf="@id/textView10"
android:text="@string/question2_7" />
<LinearLayout
android:id="@+id/ll2_7"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/textView11"
android:layout_below="@+id/textView11"
android:orientation="vertical" android:layout_marginBottom="20dp">
</LinearLayout>
<TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/textView10"
android:layout_below="@+id/ll2_7"
android:text="2.8" />
<TextView
android:id="@+id/textView3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/ll2_7"
android:layout_toRightOf="@+id/textView10"
android:text="@string/question2_8" android:layout_marginBottom="10dp"/>
<LinearLayout
android:id="@+id/ll2_8"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/textView3"
android:layout_below="@+id/textView3"
android:layout_marginBottom="20dp"
android:orientation="vertical" >
</LinearLayout>
<TextView
android:id="@+id/textView4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/textView2"
android:layout_below="@+id/ll2_8"
android:text="2.9" />
<TextView
android:id="@+id/textView5"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/ll2_8"
android:layout_toRightOf="@+id/textView10"
android:text="@string/question2_9" android:layout_marginBottom="10dp"/>
<LinearLayout
android:id="@+id/ll2_9"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/textView5"
android:layout_toRightOf="@+id/textView10"
android:orientation="vertical" android:layout_marginBottom="20dp">
</LinearLayout>
<TextView
android:id="@+id/textView6"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/textView4"
android:layout_below="@+id/ll2_9"
android:text="2.10" />
<TextView
android:id="@+id/textView7"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/ll2_9"
android:layout_toRightOf="@+id/textView10"
android:text="@string/question2_10" android:layout_marginBottom="10dp"/>
<LinearLayout
android:id="@+id/ll2_10"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/textView7"
android:layout_marginBottom="20dp"
android:layout_toRightOf="@+id/textView10"
android:orientation="vertical" >
</LinearLayout>
<TextView
android:id="@+id/textView8"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/textView6"
android:layout_below="@+id/ll2_10"
android:text="2.11" />
<TextView
android:id="@+id/textView9"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/ll2_10"
android:layout_toRightOf="@+id/textView10"
android:text="@string/quesiton2_11" android:layout_marginBottom="10dp"/>
<LinearLayout
android:id="@+id/ll2_11"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/textView9"
android:layout_below="@+id/textView9"
android:orientation="vertical" android:layout_marginBottom="20dp">
</LinearLayout>
<TextView
android:id="@+id/textView12"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/textView8"
android:layout_below="@+id/ll2_11"
android:text="2.11.1" />
<TextView
android:id="@+id/textView13"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/ll2_11"
android:layout_toRightOf="@+id/textView10"
android:text="@string/question2_11_1" android:layout_marginBottom="10dp"/>
<LinearLayout
android:id="@+id/ll2_11_1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/textView13"
android:layout_toRightOf="@+id/textView10"
android:orientation="vertical" android:layout_marginBottom="20dp">
</LinearLayout>
</RelativeLayout>
</ScrollView>
</RelativeLayout>
fonte
Respostas:
Encontrei o mesmo problema de corte mostrado na captura de tela. É causado pelo alinhamento da linha de base na horizontal
LinearLayout
.TextView
eSpinner
têm diferentes linhas de base devido à diferença de tamanho da fonte. Para corrigir o problema, é necessário desativar o alinhamento da linha de base para o layout configurando:ou no código:
fonte
Depois de tentar um milhão de coisas diferentes, acho que tenho a resposta.
Eu apliquei um
LayoutGravity
ao item TextView:Parece resolver todos os problemas de recorte que tive. Espero que isso ajude alguém com o mesmo problema.
fonte
@android:style/Widget.TextView
e adiciono as seguintes linhas:<item name="android:gravity">fill</item>
<item name="android:padding">1sp</item>
android:baselineAligned="false"
ao seuLinearLayout
Eu tive o mesmo problema e descobri que simplesmente adicionar
a linha final do texto não teve mais seus descendentes cortados.
fonte
Eu adicionei algum espaço fictício após o texto, adicionando
Tentei todas as outras soluções. Mas essa foi a única solução que funcionou para mim
fonte
Coloque o textview problemático dentro de um framelayout. Acho que a visualização de texto não é calculada corretamente por causa da visualização irmã, Spinner.
fonte
CheckBox
na mesmaLinearLayout
. Isso resolveu o problema.Quando isso ocorrer, você deve se certificar de que o
TextView
não está ficando maior do que o contêiner -Se a
TextView
for definido comowrap_content
e seu contêiner (ou um contêiner ancestral) não deixar espaço paraTextView
que cresça, ele poderá ser obstruído.Se isso não for o caso, também é possível a
onMeasure()
daTextView
às vezes não medir corretamente as caudas de letras, caracteres não-latinos ou os efeitos de texto que está sendo itálico. Você pode corrigir isso definindo um estilo global para o seu, deTextView
modo que seja escolhido sem a necessidade de alterar toda a sua base de código:Certifique-se de que seu aplicativo / atividades usam um tema personalizado como:
A resposta de @Rynadt foi muito útil para chegar ao estágio acima. Definir a gravidade do texto dentro da visualização garante em alguns dispositivos que a oclusão nunca ocorre (o texto está corretamente ajustado dentro da visualização), em outros uma ajuda com o preenchimento de um valor sp, garante que as caudas e outros sejam levadas em consideração com um valor específico TextSize.
fonte
Minha solução estava próxima da aceita, mas tive que mudá-la para
em vez de. Caso contrário, as outras linhas teriam sido esticadas também com quebras de linha adicionadas em locais aleatórios. Por exemplo, a maior linha tinha 4 linhas, então outra linha foi alterada de
this is a testphrase
para
fonte
Eu encontrei uma solução diferente estendendo TextView e adicionando uma classe personalizada como esta:
fonte
this.setEllipsize(TextUtils.TruncateAt.END);
a instrução if acima e removaandroid:ellipsize="end"
do XML que, por algum motivo, o quebra.tente remover android: paddingBottom = "20dp"
de
fonte
getViewTreeObserver().addOnGlobalLayoutListener
não funciona em uma exibição de reciclador. Se você estiver usando um reciclador, useView.addOnLayoutChangeListener
:Descobri que a elipsização que defini para
textView
em xml nem sempre foi refletida, então eu a defini programaticamente antes de reatribuir a propriedade text. Isso funcionou para mim.fonte
Se você tiver esse problema e
TextView
estiver dentro de aRelativeLayout
, tente trocarRelativeLayout
por aLinearLayout
.Isso resolveu o problema para mim
fonte
Você pode usar um ouvinte de layout global para um TextView em qualquer tipo de ViewGroup.
Você pode ler mais sobre isso aqui
fonte
Acho que há muito pouco que você possa fazer para fazer isso funcionar alterando os layouts. Como descobri que alguns métodos funcionam apenas em alguns casos. Acho que depende de toda a hierarquia de layout e não é uma solução única para todos. Também notei que isso acontece especialmente quando você tem uma fonte diferente que deseja definir para TextView.
Um método de tiro certeiro que experimentei e testei é que você pode definir os atributos de fonte no código depois que a visualização for inflada. Presumo que você tenha uma fonte na pasta de recursos / fontes que deseja para você.
Por exemplo, em um fragmento:
E em uma atividade:
fonte
Eu tenho esse mesmo problema, e é muito chato.
Isso só acontece com texto em árabe.
Se você fizer o rótulo de várias linhas e adicionar um
\n
no final de sua string, isso resolverá, mas o problema é que haveria uma grande lacuna entre este rótulo e o objeto abaixo dele, devido ao fato de que este campo agora tem uma nova linha vazia abaixo dela.Um controle personalizado pode ser feito para contornar isso. Mas, no geral, esse é um bug irritante.
fonte
A melhor solução para isso é adicionar uma vista fictícia da altura desejada (ou seja, isso adicionará preenchimento) na parte inferior da sua vista.
Como no meu caso, adicionei mais uma linha da tabela na parte inferior da visualização. Espero que isso possa ajudar alguém.
fonte
Eu sei que é tão tarde, mas isso é um trabalho como charme para mim. adicione este código ao seu
textview
fonte
Adicione preenchimento à parte inferior da visualização do texto:
fonte
Eu finalmente consertei!
Eu tento adicionar String ao TextView in Service e então chamar scrollTo (), a última linha é cortada!
O scrollTo () deve ser chamado em "Runnable", como:
Acho que porque no momento da chamada scrollTo () em serviço, a atualização do TextView não está pronta.
fonte