尝试通过循环动态添加多个文本视图时应用程序崩溃。添加单个文本视图时效果很好
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));
【讨论】:
以上是关于尝试通过循环动态添加多个文本视图时应用程序崩溃。添加单个文本视图时效果很好的主要内容,如果未能解决你的问题,请参考以下文章