добавить элементы в прокрутку ниже экрана?

У меня есть макет, который мне нужен для заполнения экрана, и в зависимости от содержимого макета мне может потребоваться добавить под ним условия. Я использую прокрутку, и атрибут fillViewport позволяет мне красиво заполнить основной макет, но когда я добавляю термины, он изменяет все размеры.

Есть ли способ добавить элементы, добавленные в прокрутку, для заполнения ниже определенной точки без изменения размера всего над ней? Если нет, есть ли обходной путь, который может выполнить то же самое?

Макет и визуальный пример:

в этом макете последний элемент имеет видимость «GONE», поэтому 3 текстовых представления заполняют экран...

<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:fillViewport="true">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">

        <TextView
            android:id="@+id/sampleItem1"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1"
            android:background="@android:color/holo_red_dark"
            android:text="SAMPLE VIEW 1"
            android:gravity="center"/>

        <TextView
            android:id="@+id/sampleItem2"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1"
            android:background="@android:color/white"
            android:text="SAMPLE VIEW 2"
            android:gravity="center"/>

        <TextView
            android:id="@+id/sampleItem3"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1"
            android:background="@android:color/holo_blue_bright"
            android:text="SAMPLE VIEW 3"
            android:gravity="center"/>

        <TextView
            android:id="@+id/termsAndConditions"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="@android:color/holo_green_dark"
            android:visibility="gone"
            android:text="VIEW THAT MAY OR MAY NOT BE ADDED"
            android:gravity="center"/>

    </LinearLayout>
</ScrollView>

но если я установлю видимость «termsAndConditions» на «VISIBLE», другие 3 представления изменят размер... Могу ли я остановить это?

с параметром 'termsAndConditions', установленным на GONE:

с параметром

Моя цель состоит в том, чтобы этот зеленый вид заполнялся под нижним полем экрана, и пользователь мог прокручивать его, поскольку все заключено в прокрутку.


person Psest328    schedule 26.12.2014    source источник
comment
пожалуйста, включите свой макет в ques и как вы его заполните   -  person Muhammed Refaat    schedule 26.12.2014
comment
@MuhammedRefaat это для работы, поэтому я не могу показать фактический макет, но я соберу пример. дай мне 5 минут   -  person Psest328    schedule 26.12.2014
comment
Добавлен пример кода и изображения. Спасибо   -  person Psest328    schedule 26.12.2014
comment
Отлично, значит, вы хотите, чтобы позиция TextView была зарезервирована, даже если она не существует? или вы хотите, чтобы изображения заполнили экран навсегда? но тогда где вы будете отображать свой текст?   -  person Muhammed Refaat    schedule 26.12.2014
comment
Я хочу, чтобы первый снимок экрана выглядел так, как он выглядит, независимо от того, добавлены ли термины. если термины добавлены, они должны быть добавлены под нижним полем экрана. самое верхнее родительское представление представляет собой прокрутку, поэтому, если термины добавлены, пользователь может прокручивать их вниз.   -  person Psest328    schedule 26.12.2014
comment
фактический вид очень красивый, и условия отбрасывают его. Они существуют по договорным обязательствам, и мы бы предпочли, чтобы они не мешали работе пользователя.   -  person Psest328    schedule 26.12.2014
comment
Итак, вы хотите, чтобы термины были включены в прокрутку, и пользователь должен прокручивать их, чтобы увидеть?   -  person Muhammed Refaat    schedule 26.12.2014
comment
это именно то, что мы хотим   -  person Psest328    schedule 26.12.2014
comment
Отлично, я посмотрю код и посмотрю, смогу ли я помочь   -  person Muhammed Refaat    schedule 26.12.2014
comment
Я нашел решение здесь: stackoverflow.com/questions/17033126/   -  person soshial    schedule 21.07.2016


Ответы (2)


Во-первых, вам нужно добавить weight_sum = 3 к родительскому макету TextViews, затем сделать TextView из terms layout_height="0dp", чтобы добавить к нему вес, и добавить к нему вес, как вы хотите, скажем "0.3", то есть будет примерно так:

<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:fillViewport="true">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:weightSum="3">

        <TextView
            android:id="@+id/sampleItem1"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1"
            android:background="@android:color/holo_red_dark"
            android:text="SAMPLE VIEW 1"
            android:gravity="center"/>

        <TextView
            android:id="@+id/sampleItem2"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1"
            android:background="@android:color/white"
            android:text="SAMPLE VIEW 2"
            android:gravity="center"/>

        <TextView
            android:id="@+id/sampleItem3"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1"
            android:background="@android:color/holo_blue_bright"
            android:text="SAMPLE VIEW 3"
            android:gravity="center"/>

        <TextView
            android:id="@+id/termsAndConditions"
            android:layout_width="wrap_content"
            android:layout_height="0dp"
            android:layout_weight="0.3"
            android:background="@android:color/holo_green_dark"
            android:visibility="gone"
            android:text="VIEW THAT MAY OR MAY NOT BE ADDED"
            android:gravity="center"/>

    </LinearLayout>
</ScrollView>
person Muhammed Refaat    schedule 26.12.2014
comment
выглядит прямо на экране предварительного просмотра xml. мне понадобится минута, чтобы изменить наш фактический макет. Работаю над этим сейчас, просто нужно несколько - person Psest328; 26.12.2014
comment
не работал, к сожалению. Я предполагаю, что первый макет заполняет все доступное пространство из-за родительского веса. даже не прокручивается - person Psest328; 26.12.2014
comment
Мы только что нашли рабочее решение, но я не думаю, что это ЛУЧШЕЕ решение, поэтому я не собираюсь принимать его как ответ в надежде получить лучший. Публикуем сейчас. - person Psest328; 26.12.2014
comment
хорошо, я посмотрю, смогу ли я преодолеть это, и сообщу вам, спасибо - person Muhammed Refaat; 26.12.2014

Что мы сделали, чтобы заставить эту работу работать, так это установили видимость терминов в GONE, а затем в onCreateView фрагмента мы сделали это:

LinearLayout parent = (LinearLayout)view.findViewById(R.id.viewParent);
parent.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
                public void onGlobalLayout() {
                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
                        parent.getViewTreeObserver().removeOnGlobalLayoutListener(this);
                    } else {
                        parent.getViewTreeObserver().removeGlobalOnLayoutListener(this);
                    }

                    int height = parent.getHeight();
                    parent.setLayoutParams(new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, height));
                    termsAndConditions.setVisibility(View.VISIBLE);
                }
            } );

поэтому с терминами, установленными в GONE, мы измерили высоту родителей, затем заменили его свойство высоты MATCH_PARENT этим измерением, затем установили термины в visible, которые заполнялись ниже всего остального, потому что мы установили статическую высоту.

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

person Psest328    schedule 26.12.2014
comment
Ух ты! Оказывается, мне нужно сделать то же самое в моем приложении, но я до сих пор не знаю, как это сделать. Это решение выше является своего рода взломом. Вы нашли что-нибудь более жизнеспособное для решения проблемы? - person soshial; 21.07.2016