web-dev-qa-db-ja.com

Android ScrollViewは1つの直接の子のみをホストできます

ギャラリーのonclickリスナーがあり、テーブルビュー内のすべての行をクリアしてから、スクロールビュー内のテーブルビューに行を追加する必要があります。フラグメントは、ボタンがクリックされるたびに変化するはずです。

ただし、次のようになります。Java.lang.IllegalStateException:ScrollViewは1つの直接の子のみをホストできます。

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>

誰かが何が悪いのか知っていますか?テーブルビューではなくスクロールビューにテーブル行を追加していると思いますが、コードのどこで間違っているのかわかりません。

7
Raptrex

実際、次のようなことはできません。

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

この助けを願っています。

5
Dax

この質問はかなり古いことは知っていますが、同じ問題が発生し、レイアウトのベースビューとしてScrollViewを使用できないという結果になりました。

Scrollviewをtracker.xmlレイアウトでRelativeLayoutでラップするだけで、準備が整います。

4
tyczj

LinearLayoutをScrollViewに追加する必要があります。これは機能します。

3
nobjta_9x_tq

もう1つの可能性は、終了要素が一致していないことです。つまり。

<ScrollView xmlns:Android="http://schemas.Android.com/apk/res/Android"
   Android:layout_width="match_parent"
   Android:layout_height="wrap_content">
    <LinearLayout ...>
        ...
    </LinearLayout>
</LinearLayout>

エラーは最後の行にあります。

2
MovGP0

ええと...スクロールビュー内に複数のビューを配置しないでください。 TableLayout、FrameLayoutなど、複数のビューに必要な種類のレイアウトである単一のビューをその中に配置します。

1
hackbod

私は先週この問題に苦しんでいて、それからその問題の可能な限り最良の答えを見つけます。

Scrollviewは直接の子を1つだけホストできます

0
Sohaib Aslam

幅と高さの両方、および垂直方向のwrap_contentを使用して、すべての子を別のLinearLayout内にラップします。

お気に入り :

<LinearLayout
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:orientation="vertical">

お役に立てば幸いです..!

0
Viral Patel

main.xml<FrameLayout>の代わりに<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"
/>

これにより、アクティビティのフラグメントを次のように置き換えていたScrollViewの同様の問題が解決されました。

getSupportFragmentManager().beginTransaction()
    .replace(R.id.details_container, new DetailsFragment(), DETAILFRAGMENT_TAG)
    .commit();
0
Devenias

編集(2番目の回答):

私はコードで遊んでいますが、なぜこれが発生するのかまだわかりません。フラグメントを交換するときにフラグメントマネージャーに何か問題があることは間違いありません(replace(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、およびその中にいくつかの他のViewGroupがある空のキャンバスです。これは、1回目のロード(アイテムがnull)で空のキャンバスをロードし、2回目は、ユーザー入力を介して、実際のデータを表示するためのものです。

logcatに見られるように、私の知識を超えた何らかの理由で、FragmentManagerImpl.moveToStateがScrollView.AddChildを呼び出していたため、エラーが発生しました。

ここで、CreateViewのフラグメントを次のように変更しました。

    if (item == null)
        return inflater.inflate(R.layout.empty, null, false);

    View view = inflater.inflate(R.layout.post_fragment, null, false);
    return BuildView(view);

そのため、「空の」キャンバスは何も表示されていないFrameLayoutであり、すべてが正常に機能しています。これは実際のフラグメントフレームワークで奇妙なエラーのように聞こえると思いますが、これは回避策です。

最初の答え:

私が見る限り、Raptrex。はい、そのテーブルレイアウトはあなたのscrowviewが持っている唯一の子です。私はまったく同じ問題を抱えており、それを解決しようとすると非常にイライラします。

LogCat/Debugから、Fragments managerに何かを呼び出しているようで、ScrollViewの.AddView(view)(ログを確認)は、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)
0
Budius