Android'de LinearLayout'a bir TextView nasıl eklenir


129

TextViewsKodda xml tanımlı düzenime eklemeye çalışıyorum . Bir çok şeyin Viewstanımlandığı bir xml sayfam var . Ancak koda bazı görünümler eklemem gerekiyor, bu nedenle LinearLayoutxml sayfasında bir oluşturun :

<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>

Ve bu düzende TextViewşunları eklemeyi seviyorum :

    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);

Ancak yalnızca aşağıdaki hata mesajını alıyorum:

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

Nasıl yapabilirim?

Yardımın için teşekkürler. kırlangıç


Bu istisna hangi satır için? LinearLayout dökümünden olmalı, linearLayout değişkeninin bir LinearLayout olduğundan ve TextView olmadığından emin misiniz? Ayrıca, benzersiz olacağını garanti edemeyeceğiniz için kimliği belirtmemelisiniz.
Robby Pond

1
Haklısın, linearLayout bir TextView, ama neden? Bunu xml dosyasında bir LinearLayout olarak tanımladım ...
Martin

1
Yukarıda gösterilen xml üzerinde gerçekten çalıştığınızdan emin olun. Is setContentView(R.layout.your_xml_layout);gerçekten doğru xml yükleniyor? android:id="@+id/info"TextView olmak üzere kullandığınız başka xml düzenleriniz var mı?
Rodja

Bu sorun çözüldü mü? Lütfen cevap olarak kabul edin veya bir tane gönderin.
Talha

Yanıtlar:


106

kullanmayı dene

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

ayrıca oluşturduğunuz düzen parametrelerinin LinearLayout.LayoutParams olduğundan emin olun ...


yine bir istisna vardır, çünkü findViewById bir TextView döndürür. Ama neden? LinearLayout kimliğiyle getiriyorum .... ile ne demek istiyorsun: ayrıca oluşturduğunuz düzen parametrelerinin LinearLayout.LayoutParams olduğundan emin olun ... ???
Martin

Bu neden herhangi bir şeyi değiştirsin? Yaptığı tek şey, aynı etkiye sahip olması gereken, daha sonra değil, daha erken döküm.
yesennes

70

Hey kodunuzu kontrol ettim, kodunuzda ciddi bir hata yok. bu tam kod:

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>

bu 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);
    }
}

bu kodu kopyalayın ve çalıştırın. tamamen hatasızdır. Kendine iyi bak...


Aşağıdaki TextView'a sahip olmak istersem ne olur:<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. Bu yanıt, LayoutParams'in bir örneğini ve geri kalan özelliklerin nasıl TextViewbaşlatıldığını içerdiğinden @ Ben'in yanıtından çok daha iyidir . Bu bir cevap olarak işaretlenmelidir.
2014

3
Not: 2015'te FILL_PARENT sabiti kullanımdan kaldırıldı, bunun yerine MATCH_PARENT kullanmalısınız.
Nikita Bosik

22

TextViewDoğrusal mizanpajınıza aşağıdaki gibi programlı bir şekilde bir ekleyebilirsiniz :

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

MyClass.this nedir? Android geliştirmede yeniyim; "Sınıfım" yerine parça sınıfımın adını mı yazmam gerekiyor?
drusepth

1
MyClass.this bir bağlamdır ve bağlam içinde bir metin görünümü alır
Mihai Bratulescu

2
Sadece açıklığa kavuşturmak için: MyClass.thisçoğu durumda aynıdır this. Bununla birlikte, iç içe geçmiş bir sınıftaysanız ve android'deki olaylar için geri aramaları tanımlarken çok yaygın olan "dış" sınıfın örneğine erişmek istiyorsanız, sınıfın adını belirtmeniz gerekir.
drigoangelo

Sanırım bazı android geliştiricileri sınıfın adını ihtiyaç duyulan yere koymaya alıştı ve her yere koymaya başladı. Ayrıca, MyClass.thisbunun bir örneğidir MyClassve yalnızca Sınıfım İçeriği uygularsa (örneğin Etkinliği genişletir) bir bağlam olacaktır
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

LinearLayout'a dinamik olarak TextView eklemek için buna benzer bir şey kullanmalısınız:

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 () Parçaların içinde kullanılır, içinde bulunduğunuz her örnek için bağlam veya benzer herhangi bir şey kullanabilirsiniz.


3

Düzene, benzersiz olması garanti edilmeyen bir kimlik kaynağı üzerinden değil, düzen kaynağı aracılığıyla erişmeniz gerekir. Kaynak referansı, yukarıdaki XML düzeninizin res / layout / my_cool_layout.xml'de depolandığı R.layout.my_cool_layout gibi görünmelidir.


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

-2

İstisnanın meydana geldiği yer burasıdır

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

addViewyöntem bir tür parametresi alır View, değil TextView. Bu nedenle, valueTv nesnesini açıkça bir View nesnesine yazın.

Bu nedenle, düzeltilen kod şöyle olacaktır:

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

Bunu test ettin mi?
mrres1

Evet bende var. Ve mükemmel çalışıyor! Bunu denediniz mi?
user3509153
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.