尝试通过循环动态添加多个文本视图时应用程序崩溃。添加单个文本视图时效果很好

Posted

技术标签:

【中文标题】尝试通过循环动态添加多个文本视图时应用程序崩溃。添加单个文本视图时效果很好【英文标题】:App crashes when trying to add multiple textviews dynamically through loop. It works fine when adding a single text view 【发布时间】:2018-12-14 05:21:45 【问题描述】:

当我尝试通过以下代码动态添加多个文本视图时,Numbers Activity 崩溃。但是当我不使用循环而只添加文本视图时它工作正常。

Numbers Activity.java

    public class NumbersActivity extends AppCompatActivity

    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_numbers);

        ArrayList<String> words = new ArrayList<String>();
        words.add("one");
        words.add("two");
        words.add("three");
        words.add("four");
        words.add("five");
        words.add("six");
        words.add("seven");
        words.add("eight");
        words.add("nine");
        words.add("ten");

        LinearLayout rootView = (LinearLayout) findViewById(R.id.rootView);
        rootView.removeAllViews();
        TextView  wordView = new TextView((this));
        int index;
        for(index=0; index<words.size(); index++ )
            wordView.setText(words.get(index));
            rootView.addView(wordView);

        
    

activity_numbers.xml

    <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/rootView"
    android:layout_
    android:layout_
    android:layout_marginLeft="16dp"
    android:orientation="vertical"
    tools:context=".NumbersActivity"
</LinearLayout>

我得到的错误是在应用程序崩溃之后

E/AndroidRuntime: 致命异常: main 进程:com.example.yusuf.miwok,PID:12226 java.lang.RuntimeException:无法启动活动 ComponentInfocom.example.yusuf.miwok/com.example.yusuf.miwok.NumbersActivity: java.lang.IllegalStateException:指定的孩子已经有一个 父母。您必须首先在孩子的父母上调用 removeView()。 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3194) 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3302) 在 android.app.ActivityThread.-wrap12(未知来源:0) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1891) 在 android.os.Handler.dispatchMessage(Handler.java:108) 在 android.os.Looper.loop(Looper.java:166) 在 android.app.ActivityThread.main(ActivityThread.java:7425) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:245) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:921) 引起:java.lang.IllegalStateException:指定的孩子已经有一个父母。您必须调用 removeView() 首先是孩子的父母。 在 android.view.ViewGroup.addViewInner(ViewGroup.java:4976) 在 android.view.ViewGroup.addView(ViewGroup.java:4807) 在 android.view.ViewGroup.addView(ViewGroup.java:4747) 在 android.view.ViewGroup.addView(ViewGroup.java:4720) 在 com.example.yusuf.miwok.NumbersActivity.onCreate(NumbersActivity.java:40) 在 android.app.Activity.performCreate(Activity.java:7372) 在 android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1218) 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3147) 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3302) 在 android.app.ActivityThread.-wrap12(未知来源:0) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1891) 在 android.os.Handler.dispatchMessage(Handler.java:108) 在 android.os.Looper.loop(Looper.java:166) 在 android.app.ActivityThread.main(ActivityThread.java:7425) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:245) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:921) I/Process:发送信号。 PID:12226 SIG:9 应用程序终止。

【问题讨论】:

【参考方案1】:

正确的代码如下

 public class NumbersActivity extends AppCompatActivity

    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_numbers);

        ArrayList<String> words = new ArrayList<String>();
        words.add("one");
        words.add("two");
        words.add("three");
        words.add("four");
        words.add("five");
        words.add("six");
        words.add("seven");
        words.add("eight");
        words.add("nine");
        words.add("ten");

        LinearLayout rootView = (LinearLayout) findViewById(R.id.rootView);
        rootView.removeAllViews();

        int index;
        for(index=0; index<words.size(); index++ )
            TextView  wordView = new TextView((this));
            wordView.setText(words.get(index));
            rootView.addView(wordView);

        
    

请注意,我只是将这一行移到 for 循环内

TextView  wordView = new TextView((this));

【讨论】:

以上是关于尝试通过循环动态添加多个文本视图时应用程序崩溃。添加单个文本视图时效果很好的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI - 在按钮单击时添加一行多个文本字段/视图

当我尝试按标签获取文本字段的值时应用程序崩溃

快速在表格视图中插入新行时应用程序崩溃?

如何向我的 HTML 表格添加分页?我的表是通过使用 php 的 while 循环动态填充的

尝试以编程方式添加视图时应用程序崩溃

[执行textView命令时应用程序崩溃