我有一个来自库的onclick监听器,它应该清除tableview中的所有行,然后将行/行添加到scrollview内的tableview。每次点击按钮都会更改片段。
但是我得到了:java.lang.IllegalStateException:ScrollView只能托管一个直接子项。
myactivity按钮监听器
TrackerFragment tf = (TrackerFragment) getFragmentManager().findFragmentById(R.id.tracker1);
tf = TrackerFragment.newInstance(listOfList.get(id).get(position));
fragmentTransaction.add(R.id.tracker1, tf);
fragmentTransaction.commit();
t1 = true; //being used
getFragmentManager().executePendingTransactions();
跟踪器片段
public class TrackerFragment extends Fragment
{
private Dish dish;
public static TrackerFragment newInstance(Serializable dish)
{
TrackerFragment tf = new TrackerFragment();
Bundle args = new Bundle();
args.putSerializable("dish", dish);
tf.setArguments(args);
return tf;
}
public static TrackerFragment newInstance(Bundle bundle)
{
Dish dish = (Dish) bundle.getSerializable("dish");
return newInstance(dish);
}
@Override
public void onCreate(Bundle myBundle)
{
super.onCreate(myBundle);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState)
{
View v = inflater.inflate(R.layout.tracker, container, false);
TableLayout tableLayout = (TableLayout) v.findViewById(R.id.tracker_layout);
tableLayout.removeAllViews();
if (dish != null)
{
//display others
//display subsystem stuff
for (int i = 0; i < dish.getSubsystems().size(); i++)
{
TableRow tableRow = new TableRow(v.getContext());
tableRow.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.WRAP_CONTENT));
TextView tv = new TextView(v.getContext());
tv.setText(dish.getSubsystems().get(i).getConnFuncAddr());
tableRow.addView(tv);
tableLayout.addView(tableRow);
}
}
else
{
TableRow tableRow = new TableRow(v.getContext());
tableRow.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.WRAP_CONTENT));
TextView tv = new TextView(v.getContext());
tv.setText("Click on image to view more data");
tableRow.addView(tv);
tableLayout.addView(tableRow);
}
return v;
}
}
main.xml中
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="horizontal"
xmlns:android="http://schemas.android.com/apk/res/android">
<!-- Trackers -->
<LinearLayout
android:layout_height="fill_parent"
android:layout_width="300dp"
android:layout_weight="1"
android:orientation="vertical">
<fragment
android:name="android.gallery.TrackerFragment"
android:id="@+id/tracker1"
android:layout_height="500dp"
android:layout_width="300dp"
android:layout_weight="1">
</fragment>
</LinearLayout>
<!-- Gallery -->
<LinearLayout
android:layout_height="fill_parent"
android:layout_width="600dp"
android:layout_weight="1"
android:orientation="vertical">
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="245dp">
<Gallery
android:id="@+id/galleryid0"
android:layout_width="fill_parent"
android:layout_height="match_parent"/>
</LinearLayout>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="245dp">
<Gallery
android:id="@+id/galleryid1"
android:layout_width="fill_parent"
android:layout_height="match_parent"/>
</LinearLayout>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="245dp">
<Gallery
android:id="@+id/galleryid2"
android:layout_width="fill_parent"
android:layout_height="match_parent"/>
</LinearLayout>
</LinearLayout>
</LinearLayout>
tracker.xml
<?xml version="1.0" encoding="utf-8"?>
<ScrollView
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TableLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/tracker_layout">
</TableLayout>
</ScrollView>
有谁知道什么是错的?我猜我在滚动视图中添加了一个表行而不是tableview,但是,我在代码中没有看到我在做错的地方。
答案 0 :(得分:5)
事实上,你不能有这样的事情:
<?xml version="1.0" encoding="utf-8"?>
<ScrollView
android:id="@+id/widget27"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="#ffffffff"
xmlns:android="http://schemas.android.com/apk/res/android"
>
<TableLayout
android:id="@+id/layoutOption"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="#ffffffff"
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
>
<ImageView
android:id="@+id/logoImmoweb"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/logoimmoweb"
android:layout_gravity="top"
/>
...
</TableLayout>
</ScrollView>
但如果表格外有额外的元素,则会因java.lang.IllegalStateException: ScrollView can host only one direct child
示例
<ScrollView
android:id="@+id/widget27"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="#ffffffff"
xmlns:android="http://schemas.android.com/apk/res/android"
>
<ImageView
android:id="@+id/logoImmoweb"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/logoimmoweb"
android:layout_gravity="top"
/>
<TableLayout
android:id="@+id/layoutOption"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="#ffffffff"
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
>
...
</TableLayout>
</ScrollView>
希望得到这个帮助。
答案 1 :(得分:4)
我知道这个问题已经很老了,但我遇到了同样的问题,最终导致您无法在布局的基础视图中找到ScrollView
。
使用RelativeLayout
将Scrollview包装在tracker.xml布局中,你应该很高兴
答案 2 :(得分:3)
你应该将LinearLayout添加到ScrollView中,它会起作用。
答案 3 :(得分:2)
另一种可能性是关闭元素不匹配。 IE浏览器。
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<LinearLayout ...>
...
</LinearLayout>
</LinearLayout>
错误在最后一行。
答案 4 :(得分:1)
嗯...不要在滚动视图中放置多个视图。在其中放置一个视图,这是您想要多个视图的布局类型 - TableLayout,FrameLayout等。
答案 5 :(得分:0)
我一直在玩代码而且我仍然不确定为什么会发生这种情况,片段管理器交换片段时肯定会出现问题(替换(resId,fragment))
在我的片段onCreateView中是这段代码:
View view = inflater.inflate(R.layout.post_fragment, null, false);
if (item == null)
return view;
return BuildView(view);
post_fragment是一个空白画布,里面有1个ScrollView,1个LinearLayout,以及其中的一些其他ViewGroups。这是在第一次加载时加载一个空画布(item为null),第二次通过用户输入,它将获得要显示的实际数据。
由于我所知的某些原因,如logcat中所见,FragmentManagerImpl.moveToState正在调用ScrollView.AddChild导致错误。
现在我将onCreateView上的片段更改为:
if (item == null)
return inflater.inflate(R.layout.empty, null, false);
View view = inflater.inflate(R.layout.post_fragment, null, false);
return BuildView(view);
所以'empty'画布是一个没有任何内容的FrameLayout,现在一切都很愉快。 我确信这听起来像实际的片段框架上的一些奇怪的错误,但它是一个围绕它的工作。
Raptrex,据我所见。是的,表格布局是您的scrowview唯一的孩子。我遇到了完全相同的问题,并且非常沮丧地试图解决它。
在LogCat / Debug中,似乎Fragments管理器中的东西在我的ScrollView中调用和.AddView(视图)(检查日志)它取决于我如何更改我的XML布局我是否收到此错误,这让我们说听起来很荒谬!
任何想法如何?为什么?什么?我在听......
FATAL EXCEPTION: main
java.lang.IllegalStateException: ScrollView can host only one direct child
at android.widget.ScrollView.addView(ScrollView.java:219)
at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:787)
at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:977)
at android.app.BackStackRecord.run(BackStackRecord.java:638)
at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1309)
at android.app.FragmentManagerImpl$1.run(FragmentManager.java:398)
at android.os.Handler.handleCallback(Handler.java:587)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:132)
at android.app.ActivityThread.main(ActivityThread.java:4123)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:491)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599)
at dalvik.system.NativeStart.main(Native Method)
答案 6 :(得分:0)
尝试在 main.xml
中使用<fragment>
代替<fragment
android:name="android.gallery.TrackerFragment"
android:id="@+id/tracker1"
android:layout_height="500dp"
android:layout_width="300dp"
android:layout_weight="1">
</fragment>
所以而不是
<FrameLayout
android:id="@+id/tracker1"
android:layout_height="500dp"
android:layout_width="300dp"
android:layout_weight="1"
/>
使用
getSupportFragmentManager().beginTransaction()
.replace(R.id.details_container, new DetailsFragment(), DETAILFRAGMENT_TAG)
.commit();
它解决了ScrollView的类似问题,我在那里用以下代码替换活动中的片段:
getLineAtCaret()
答案 7 :(得分:0)
我上周遇到了这个问题,然后找到了该问题的最佳答案。