Como adicionar um TextView ao LinearLayout no Android


128

Estou tentando adicionar TextViewsao meu layout definido em xml no código. Eu tenho uma folha xml, onde muitos Viewssão definidos. Mas eu tenho que adicionar algumas visualizações no código, então crie uma LinearLayoutna folha xml:

<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:id="@+id/info"
android:layout_height="wrap_content" 
android:orientation="vertical">
</LinearLayout>

E neste layout, eu gostaria de adicionar o meu TextView:

    View linearLayout =  findViewById(R.id.info);
    //LinearLayout layout = (LinearLayout) findViewById(R.id.info);


    TextView valueTV = new TextView(this);
    valueTV.setText("hallo hallo");
    valueTV.setId(5);
    valueTV.setLayoutParams(new LayoutParams(
            LayoutParams.FILL_PARENT,
            LayoutParams.WRAP_CONTENT));

    ((LinearLayout) linearLayout).addView(valueTV);

Mas eu só recebo a seguinte mensagem de erro:

: java.lang.ClassCastException: android.widget.TextView

Como eu posso fazer isso?

Obrigado pela ajuda. Martin


Para qual linha é essa exceção? Deve ser da conversão LinearLayout. Tem certeza de que a variável linearLayout é LinearLayout e não TextView? Além disso, você não deve especificar o ID, pois não pode garantir que ele seja único.
precisa

1
Você está certo, linearLayout é um TextView, mas por quê? Defini-lo no arquivo xml como um LinearLayout ...
Martin

1
Verifique se você está realmente operando no xml mostrado acima. Está setContentView(R.layout.your_xml_layout);realmente carregando o xml certo? Você tem outros layouts de xml nos quais usa o android:id="@+id/info"TextView?
Rodja

Este problema foi resolvido? Por favor, aceite como resposta ou publique uma.
Talha

Respostas:


105

tente usar

LinearLayout linearLayout = (LinearLayout)findViewById(R.id.info);
...
linearLayout.addView(valueTV);

também verifique se os parâmetros de layout que você está criando são LinearLayout.LayoutParams ...


existe novamente uma exceção, porque findViewById retorna um TextView. Mas por que? Eu o busco com o ID LinearLayout .... como assim: também verifique se os parâmetros de layout que você está criando são LinearLayout.LayoutParams ... ???
Martin Martin

Por que isso mudaria alguma coisa? Tudo o que faz é lançado mais cedo ou mais tarde, o que deve ter o mesmo efeito.
yesennes

70

Ei, eu verifiquei seu código, não há nenhum erro grave no seu código. este é o código completo:

main.xml: -

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:id="@+id/info"
android:layout_height="wrap_content" 
android:orientation="vertical">
</LinearLayout>

este é Stackoverflow.java

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup.LayoutParams;
import android.widget.LinearLayout;
import android.widget.TextView;

public class Stackoverflow extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        View linearLayout =  findViewById(R.id.info);
        //LinearLayout layout = (LinearLayout) findViewById(R.id.info);

        TextView valueTV = new TextView(this);
        valueTV.setText("hallo hallo");
        valueTV.setId(5);
        valueTV.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.WRAP_CONTENT));

        ((LinearLayout) linearLayout).addView(valueTV);
    }
}

copie esse código e execute-o. é completamente livre de erros. cuidar...


E se eu quisesse ter o seguinte TextView:<TextView android:id="@+id/tvDInfo3" android:layout_width="0dp" android:layout_height="wrap_content" android:textStyle="bold" android:text="Release Date" android:gravity="center" android:padding="@dimen/dyk_text_pad" android:textColor="#000000" android:textSize="@dimen/info_text_size" android:layout_weight="1" />
Si8

1
+1. Essa resposta é muito melhor que a do Ben, pois contém um exemplo de LayoutParams e como o restante das propriedades do TextViewé inicializado. Isso deve ser marcado como uma resposta.
Subby

3
Nota: em 2015 const FILL_PARENT foi descontinuado, você deve usar MATCH_PARENT.
Nikita Bosik

22

Você pode adicionar um TextViewao seu layout linear programaticamente assim:

LinearLayout linearLayout = (LinearLayout) findViewById(R.id.mylayout);
TextView txt1 = new TextView(MyClass.this);
linearLayout.setBackgroundColor(Color.TRANSPARENT);
linearLayout.addView(txt1);

O que é o MyClass.this? Eu sou novo no desenvolvimento do Android; devo substituir o nome da minha classe de fragmento por "MyClass"?
drusepth

1
MyClass.this é um contexto e uma exibição de texto leva em um contexto
Mihai Brătulescu

2
Apenas para esclarecimento: MyClass.thisna maioria dos casos, é o mesmo que this. Você precisa especificar, no entanto, o nome da classe, se estiver em uma classe aninhada e quiser acessar a instância da classe "externa", o que é muito comum ao definir retornos de chamada para os eventos no Android.
Drigoangelo

Eu acho que alguns desenvolvedores do Android se acostumaram a colocar o nome da classe onde é necessário e começaram a colocá-lo em qualquer lugar. Além disso, MyClass.thisé um exemplo de MyClass, e será apenas um contexto se implementa MyClass de contexto (por exemplo, se estende Actividade)
drigoangelo

20
for(int j=0;j<30;j++) {
    LinearLayout childLayout = new LinearLayout(MainActivity.this);
    LinearLayout.LayoutParams linearParams = new LinearLayout.LayoutParams(
        LayoutParams.WRAP_CONTENT,
        LayoutParams.WRAP_CONTENT);
    childLayout.setLayoutParams(linearParams);

    TextView mType = new TextView(MainActivity.this);
    TextView mValue = new TextView(MainActivity.this);

    mType.setLayoutParams(new TableLayout.LayoutParams(
        LayoutParams.WRAP_CONTENT,
        LayoutParams.WRAP_CONTENT, 1f));
    mValue.setLayoutParams(new TableLayout.LayoutParams(
        LayoutParams.WRAP_CONTENT,
        LayoutParams.WRAP_CONTENT, 1f));

    mType.setTextSize(17);
    mType.setPadding(5, 3, 0, 3);
    mType.setTypeface(Typeface.DEFAULT_BOLD);
    mType.setGravity(Gravity.LEFT | Gravity.CENTER);

    mValue.setTextSize(16);
    mValue.setPadding(5, 3, 0, 3);
    mValue.setTypeface(null, Typeface.ITALIC);
    mValue.setGravity(Gravity.LEFT | Gravity.CENTER);

    mType.setText("111");
    mValue.setText("111");

    childLayout.addView(mValue, 0);
    childLayout.addView(mType, 0);

    linear.addView(childLayout);
}

10

Você deve usar algo semelhante a isso para adicionar o TextView ao LinearLayout dinamicamente:

LinearLayout linearLayout = getActivity().findViewById(R.id.infoLayout);

TextView valueTV = new TextView(context);
valueTV.setText("hallo hallo");
valueTV.setId(Integer.parseInt("5"));
valueTV.setLayoutParams(new LinearLayout.LayoutParams(
       LinearLayout.LayoutParams.FILL_PARENT,
       LinearLayout.LayoutParams.WRAP_CONTENT));

linearLayout.addView(valueTV);

getActivity () é usado para Fragmentos internos, você pode usar o contexto ou algo semelhante para cada instância em que estiver.


3

Você precisa acessar o layout por meio do recurso de layout, não um recurso de ID que não seja garantido como exclusivo. A referência do recurso deve se parecer com R.layout.my_cool_layout, onde o layout XML acima é armazenado em res / layout / my_cool_layout.xml.


0
LinearLayout.LayoutParams layoutParams ;
layoutParams= new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT);

-2

Aqui é onde a exceção ocorre

((LinearLayout) linearLayout).addView(valueTV);

addViewO método aceita um parâmetro do tipo View, não TextView. Portanto, digite o objeto valueTv em um objeto View, explicitamente.

Portanto, o código corrigido seria:

((LinearLayout) linearLayout).addView((TextView)valueTV);

Você já testou isso?
precisa saber é

Sim, eu tenho. E funciona perfeitamente! Tentaste?
user3509153
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.