Android : 无法在 linearLayout 中以编程方式添加视图 android
Android : can't add view programmatically in linearLayout android
我有片段将滚动视图作为 parent 布局,在滚动视图中我有一个 LinearLayout 。当我尝试以编程方式将视图添加到该 LinearLayout 但出现错误“指定的 child 已经有一个 parent。您必须在 child 的 parent 首先。"
这是我的布局
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layoutDirection="ltr"
tools:context="ir.pnuopen5.application.fragment.LeaugeFragment">
<RelativeLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin">
<TextView
android:id="@+id/tv_LeagueFragment_title_lastNews"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/last_news"
android:textSize="17sp"
android:layout_gravity="right"
android:layout_alignParentTop="true"
android:layout_alignRight="@+id/view1"
android:layout_alignEnd="@+id/view1" />
<View
android:id="@+id/view1"
android:layout_width="match_parent"
android:layout_height="3dp"
android:layout_marginTop="10dp"
android:background="@color/line"
android:layout_below="@+id/tv_LeagueFragment_title_lastNews"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/lv_LeagueFragment_lastNews"
android:layout_below="@+id/view1"
android:orientation="horizontal"/>
...
这是我的 java 代码
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_leauge, container, false);
...
LinearLayout newsListView = (LinearLayout)view.findViewById(R.id.lv_LeagueFragment_lastNews);
View newsListRow;
TextView title,time;
for (int i = 0;i<newsList.size();i++){
newsListRow = inflater.inflate(R.layout.list_news_row0, container, false);
title = (TextView)newsListRow.findViewById(R.id.rowNewsTitle);
time = (TextView)newsListRow.findViewById(R.id.rowNewsTime);
title.setText(newsList.get(i).getTitle());
time.setText(newsList.get(i).getTime());
newsListView.addView(newsListView);
}
...
return view;
}
在代码片段 newsListView.addView(newsListView)
中,您正在向自身添加一个视图。我想你的意思是:
newsListView.addView(newsListRow);
...回到上下文...
for (int i = 0;i<newsList.size();i++){
newsListRow = inflater.inflate(R.layout.list_news_row0, container, false);
title = (TextView)newsListRow.findViewById(R.id.rowNewsTitle);
time = (TextView)newsListRow.findViewById(R.id.rowNewsTime);
title.setText(newsList.get(i).getTitle());
time.setText(newsList.get(i).getTime());
newsListView.addView(newsListRow);
}
很明显您遇到了该错误。看起来你正在膨胀一个视图,第一次当你的循环运行时它会在你的线性布局中添加该视图。下次循环运行时,它会采用您之前添加的视图的相同对象。由于这是一个静态视图,因此在您初始化它时不会创建新对象。
你应该使用动态视图。
以下是您的答案
for(int i = 0;i<newsList.size();i++) {
LinearLayout newsListRow = new LinearLayout(this);
TextView title = new TextView(this);
TextView time = new TextView(this);
title.setText(newsList.get(i).getTitle());
time.setText(newsList.get(i).getTime());
newsListRow.addView(title);
newsListRow.addView(time);
newsListView.addView(newsListView);
}
您可以添加 LayoutParameter 使其看起来像您的静态行视图。
就是这样...享受...:-)
在添加视图之前,通过调用
将其删除
newsListView.removeView(view);
我有片段将滚动视图作为 parent 布局,在滚动视图中我有一个 LinearLayout 。当我尝试以编程方式将视图添加到该 LinearLayout 但出现错误“指定的 child 已经有一个 parent。您必须在 child 的 parent 首先。"
这是我的布局
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layoutDirection="ltr"
tools:context="ir.pnuopen5.application.fragment.LeaugeFragment">
<RelativeLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin">
<TextView
android:id="@+id/tv_LeagueFragment_title_lastNews"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/last_news"
android:textSize="17sp"
android:layout_gravity="right"
android:layout_alignParentTop="true"
android:layout_alignRight="@+id/view1"
android:layout_alignEnd="@+id/view1" />
<View
android:id="@+id/view1"
android:layout_width="match_parent"
android:layout_height="3dp"
android:layout_marginTop="10dp"
android:background="@color/line"
android:layout_below="@+id/tv_LeagueFragment_title_lastNews"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/lv_LeagueFragment_lastNews"
android:layout_below="@+id/view1"
android:orientation="horizontal"/>
...
这是我的 java 代码
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_leauge, container, false);
...
LinearLayout newsListView = (LinearLayout)view.findViewById(R.id.lv_LeagueFragment_lastNews);
View newsListRow;
TextView title,time;
for (int i = 0;i<newsList.size();i++){
newsListRow = inflater.inflate(R.layout.list_news_row0, container, false);
title = (TextView)newsListRow.findViewById(R.id.rowNewsTitle);
time = (TextView)newsListRow.findViewById(R.id.rowNewsTime);
title.setText(newsList.get(i).getTitle());
time.setText(newsList.get(i).getTime());
newsListView.addView(newsListView);
}
...
return view;
}
在代码片段 newsListView.addView(newsListView)
中,您正在向自身添加一个视图。我想你的意思是:
newsListView.addView(newsListRow);
...回到上下文...
for (int i = 0;i<newsList.size();i++){
newsListRow = inflater.inflate(R.layout.list_news_row0, container, false);
title = (TextView)newsListRow.findViewById(R.id.rowNewsTitle);
time = (TextView)newsListRow.findViewById(R.id.rowNewsTime);
title.setText(newsList.get(i).getTitle());
time.setText(newsList.get(i).getTime());
newsListView.addView(newsListRow);
}
很明显您遇到了该错误。看起来你正在膨胀一个视图,第一次当你的循环运行时它会在你的线性布局中添加该视图。下次循环运行时,它会采用您之前添加的视图的相同对象。由于这是一个静态视图,因此在您初始化它时不会创建新对象。
你应该使用动态视图。
以下是您的答案
for(int i = 0;i<newsList.size();i++) {
LinearLayout newsListRow = new LinearLayout(this);
TextView title = new TextView(this);
TextView time = new TextView(this);
title.setText(newsList.get(i).getTitle());
time.setText(newsList.get(i).getTime());
newsListRow.addView(title);
newsListRow.addView(time);
newsListView.addView(newsListView);
}
您可以添加 LayoutParameter 使其看起来像您的静态行视图。
就是这样...享受...:-)
在添加视图之前,通过调用
将其删除newsListView.removeView(view);