android scrollview не прокручивается

У меня есть несколько линейных макетов и несколько представлений в моем прокрутке, которые охватывают весь экран. Проблема в том, что я вижу, что один из моих виджетов находится под экраном, и он не прокручивается вниз. Это мой xml-файл

<RelativeLayout 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"
    tools:context="${relativePackage}.${activityClass}" >

    <ScrollView
        android:id="@+id/mainScrollView"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:fillViewport="true"
        android:scrollbars="vertical" >

        <LinearLayout
            android:id="@+id/mainLayout"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:orientation="vertical" >

            <RelativeLayout
                android:id="@+id/topLayout"
                android:layout_width="match_parent"
                android:layout_height="wrap_content" >

                <TextView
                    android:id="@+id/textDateTime"
                    android:layout_width="wrap_content"
                    android:text="@string/nullString"
                    android:textAppearance="?android:attr/textAppearanceLarge"
                    android:textColor="#FFCCFF99"
                    android:textSize="25sp" />

                <LinearLayout
                    android:id="@+id/buttonsLayout"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_alignParentRight="true"
                    android:layout_margin="5dp"
                    android:orientation="horizontal" >

                    <Button
                        android:id="@+id/buttonReset"
                        style="?android:attr/buttonStyleSmall"
                        android:layout_width="130sp"
                        android:layout_height="40dp"
                        android:background="@drawable/button"
                        android:text="@string/buttonResetText"
                        android:textColor="#000000"
                        android:textSize="20sp" />

                    <Button
                        android:id="@+id/buttonFreeze"
                        style="?android:attr/buttonStyleSmall"
                        android:layout_width="130sp"
                        android:layout_height="40sp"
                        android:layout_marginLeft="5dp"
                        android:background="@drawable/button"
                        android:text="@string/buttonFreezeText"
                        android:textColor="#000000"
                        android:textSize="20sp" />
                </LinearLayout>
            </RelativeLayout>

            <ProgressBar
                android:id="@+id/loadBar"
                style="?android:attr/progressBarStyleLarge"
                android:layout_width="118dp"
                android:layout_height="118dp"
                android:layout_gravity="center" />

            <GridView
                android:id="@+id/sensorsGrid"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:layout_margin="5dp"
                android:background="#FFCCFF99"
                android:gravity="center"
                android:numColumns="6"
                android:stretchMode="none" >
            </GridView>
        </LinearLayout>

    </ScrollView>

</RelativeLayout>

Я также добавляю GraphView в mainLayout в таком коде

graph = new LineGraphView(this, "GraphViewDemo");
graph.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, 300));
LinearLayout mainLayout = (LinearLayout) findViewById(R.id.mainLayout);
mainLayout.addView(graph);

Другая проблема заключается в том, что если GridView не подходит по вертикали к основному макету (потому что он больше), то gridView становится прокручиваемым (чего я не хочу), а GraphView, который ниже, не виден, и я не могу прокрутить его вниз

ОБНОВЛЕНИЕ: текущий xml

<ScrollView
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    tools:context="${relativePackage}.${activityClass}"
    android:id="@+id/mainScrollView"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:fillViewport="true"
    android:scrollbars="vertical" >

        <LinearLayout
            android:id="@+id/mainLayout"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:background="#FF023458"
            android:orientation="vertical" >

            <RelativeLayout
                android:id="@+id/topLayout"
                android:layout_width="match_parent"
                android:layout_height="wrap_content" >

                <TextView
                    android:id="@+id/textDateTime"
                    android:layout_width="wrap_content"
                    android:layout_height="40dp"
                    android:layout_margin="5dp"
                    android:text="@string/nullString"
                    android:textAppearance="?android:attr/textAppearanceLarge"
                    android:textColor="#FFCCFF99"
                    android:textSize="25sp" />

                <LinearLayout
                    android:id="@+id/buttonsLayout"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_alignParentRight="true"
                    android:layout_margin="5dp"
                    android:orientation="horizontal" >

                    <Button
                        android:id="@+id/buttonReset"
                        style="?android:attr/buttonStyleSmall"
                        android:layout_width="130sp"
                        android:layout_height="40dp"
                        android:background="@drawable/button"
                        android:text="@string/buttonResetText"
                        android:textColor="#000000"
                        android:textSize="20sp" />

                    <Button
                        android:id="@+id/buttonFreeze"
                        style="?android:attr/buttonStyleSmall"
                        android:layout_width="130sp"
                        android:layout_height="40sp"
                        android:layout_marginLeft="5dp"
                        android:background="@drawable/button"
                        android:text="@string/buttonFreezeText"
                        android:textColor="#000000"
                        android:textSize="20sp" />
                </LinearLayout>
            </RelativeLayout>

            <ProgressBar
                android:id="@+id/loadBar"
                style="?android:attr/progressBarStyleLarge"
                android:layout_width="118dp"
                android:layout_height="118dp"
                android:layout_gravity="center" />

            <GridView
                android:id="@+id/sensorsGrid"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:layout_margin="5dp"
                android:background="#FFCCFF99"
                android:gravity="center"
                android:numColumns="6"
                android:stretchMode="none" >
            </GridView>
        </LinearLayout>
</ScrollView>

person Julius ShadowAspect Flimmel    schedule 15.07.2014    source источник
comment
почему бы вам просто не удалить родительский RelativeLayout и вместо этого сделать свой ScrollView родителем?   -  person waqaslam    schedule 15.07.2014
comment
о да, хороший момент, я удалил его сейчас, но все тот же результат :/   -  person Julius ShadowAspect Flimmel    schedule 15.07.2014


Ответы (2)


Вы не должны добавлять GridView внутрь ScrollView, потому что GridView сам по себе является прокручиваемым представлением. Прокручиваемый контейнер внутри другого будет передан родительскому контейнеру (или наоборот), что приведет к неправильной прокрутке/отображению на экране.

Совет: вы должны разделить ScrollView и GridView. Или замените GridView на TableLayout.

person waqaslam    schedule 15.07.2014
comment
спасибо, я попробую это немедленно, но нет ли способа удалить возможность прокрутки из gridView? потому что будет лучше, когда весь экран будет прокручиваться - person Julius ShadowAspect Flimmel; 15.07.2014
comment
удаление возможности прокрутки из gridview сделает его бесполезным, потому что это повторное представление. Вместо этого вы должны использовать TableLayout, который может действовать как вид сетки, но без собственного сроллера. - person waqaslam; 15.07.2014
comment
@JuliusShadowAspectFlimmel: это хак, чтобы переопределить поведение прокрутки «Просмотр списка внутри прокрутки не прокручивается на Android»> stackoverflow.com/questions/6210895/ - person Arash GM; 15.07.2014
comment
Я полагаю, мне придется вернуть относительный макет, который был сверху, и поместить в него scrollView и gridView? - person Julius ShadowAspect Flimmel; 15.07.2014
comment
Вам нужно показать довольно много элементов в GridView? если нет, то я думаю, что будет достаточно придерживаться TableLayout. - person waqaslam; 15.07.2014
comment
нет, мне не нужно, я почитаю кое-что о TableLayout, а затем решу, какой из них использовать, так как у меня немного мало времени, и теперь он работает с вашим решением и gridview, так что большое спасибо за ответ :) - person Julius ShadowAspect Flimmel; 15.07.2014

измените тег просмотра прокрутки на что-то вроде этого, это сработает для вас.

<ScrollView
        android:id="@+id/mainScrollView"
        android:layout_width="fill_parent"
        android:layout_height="500dp"
        android:fillViewport="true"
        android:scrollbars="vertical" >
person Pravinsingh Waghela    schedule 15.07.2014
comment
спасибо, это помогло, но вы знаете, что каждое устройство имеет разную высоту, поэтому прокрутка не будет охватывать весь экран на каждом устройстве, не так ли? - person Julius ShadowAspect Flimmel; 15.07.2014
comment
@JuliusShadowAspectFlimmel: вы не должны использовать фиксированную высоту для ScrollView - person Arash GM; 15.07.2014
comment
Нет, он не будет создавать ваш пользовательский интерфейс или XML так, как для самого маленького экрана, на который нацелено ваше приложение. Тогда на больших устройствах оставшаяся часть останется пустой. или используйте несколько видов прокрутки. Но помните, каждое представление прокрутки должно иметь только один корневой элемент. - person Pravinsingh Waghela; 15.07.2014
comment
вы знаете... но это проблема, если у меня будет пустое место... gridView может иметь много строк, и пользователю будет раздражать прокрутку вниз, когда есть пустое место, где строки могли бы быть - person Julius ShadowAspect Flimmel; 15.07.2014
comment
вы также можете сделать свой вид прокрутки родительским, удалив относительный макет. затем он будет работать на устройствах с любым размером экрана. - person Pravinsingh Waghela; 15.07.2014
comment
да, я уже удалил относительный макет, но безрезультатно :/ Я обновлю код - person Julius ShadowAspect Flimmel; 15.07.2014