Android - kaydırılabilir bir kısıtlama nasıl yapılır?


150

Kısıtlama düzenini kullanarak aşağı kaydırmama izin veren bir düzen yapmak istiyorum, ancak nasıl yapılacağını bilmiyorum. Böyle bir ScrollViewebeveyn olmalı mı ConstraintLayout?

<?xml version="1.0" encoding="utf-8"?>

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fillViewport="true">

<android.support.constraint.ConstraintLayout
    android:id="@+id/Constraint"
    android:layout_width="match_parent"
    android:layout_height="match_parent"/>

Yoksa tam tersi mi? Belki biri beni bu konuda iyi bir eğiticiye yönlendirebilir veya bir örnek verebilir, bir tane bulamıyorum.

Ayrıca, bu bir hata veya ben kurmak değil bazı yapılandırma olup olmadığını bilmiyorum ama bunun gibi görüntüler gördüm:

resim açıklamasını buraya girin

Burada "mavi dikdörtgen" planının dışında bazı bileşenler var, ancak bunlar görünür, "beyaz boşluk" üzerine bir bileşen yerleştirirsem yanımda göremiyorum veya herhangi bir yere taşıyamıyorum ve bileşen ağacında görünüyor .

GÜNCELLEME :

Kısıt mizanpajını tasarım aracında kaydırılabilir hale getirmenin bir yolunu buldum, kısıt mizanpaj kenarlığını aşağıya itmek ve cihazın ötesine uzatmak için yatay bir kılavuz kullanarak, bundan sonra, sınır mizanpajının yeni alt kısmı olarak kılavuzu kullanabilirsiniz. bileşenleri sabitleyin.

Yanıtlar:


85

Görünüşe göre çalışıyor, hangi bağımlılıkla çalıştığınızı bilmiyorum ama bu konuda

compile 'com.android.support.constraint:constraint-layout:1.0.2'

Çalışıyor, ben de öyle yaptım

<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <android.support.constraint.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <android.support.design.widget.TextInputLayout
            android:id="@+id/til_input"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:hint="Escriba el contenido del archivo"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toLeftOf="@+id/btn_save"
            app:layout_constraintTop_toTopOf="@id/btn_save"
            app:layout_constraintVertical_chainStyle="spread">

            <EditText
                android:layout_width="match_parent"
                android:layout_height="match_parent" />
        </android.support.design.widget.TextInputLayout>

        <Button
            android:id="@+id/btn_save"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:onClick="onClickButtonSave"
            android:text="Guardar"
            app:layout_constraintLeft_toRightOf="@+id/til_input"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toTopOf="parent" />

        <TextView
            android:id="@+id/txt_content"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_marginTop="0dp"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toBottomOf="@id/til_input"
            app:layout_constraintVertical_chainStyle="spread"
            app:layout_constraintVertical_weight="1" />

        <Button
            android:id="@+id/btn_delete"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:onClick="onClickButtonDelete"
            android:text="Eliminar"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toBottomOf="@id/txt_content"
            app:layout_constraintVertical_chainStyle="spread" />

    </android.support.constraint.ConstraintLayout>

</ScrollView>

Yukarı Kaydırresim açıklamasını buraya girin

Aşağı Kaydırmaresim açıklamasını buraya girin


3
teşekkürler, sorun önizleme kaydırma olamazdı, bu yüzden orada imkansız bir şey inşa oldu ama ben bir kılavuz kullanarak boş kaydırılabilir alan yapmak için düzen aşağı çekebilir ve daha sonra bittiğinde kaldırmak olduğunu
öğrendim

2
bu cevap en üstte olmalı!
Kostanos

60

Kaydırma işlevini bozan bir tür kısıtlama vardır:

Kaydırılabilir olmasını istediğinizde bu kısıtlamayı hiçbir görünümde kullanmadığınızdan emin olun :ConstraintLayoutScrollView

app:layout_constraintBottom_toBottomOf=“parent

Bunları kaldırırsanız, kaydırma çalışmalıdır.

Açıklama:

Çocuğun yüksekliğini bir ScrollViewebeveynin boyuna uyacak şekilde ayarlamak, bileşenin yapması gerekenle çelişkilidir. Çoğu zaman istediğimiz, bazı dinamik boyutlu içeriğin bir ekran / çerçeveden daha büyük olduğunda kaydırılabilir olmasıdır; yüksekliğin üst öğeyle eşleştirilmesi, ScrollViewtüm içeriğin sabit bir çerçevede (üst öğenin yüksekliği) görüntülenmesini zorlar ve böylece kaydırma işlevlerini geçersiz kılar.

Bu, düzenli doğrudan alt bileşenler olarak ayarlandığında da olur layout_height="match_parent".

Öğesinin alt ScrollViewöğesinin yeterli içerik olmadığında üst öğenin yüksekliğiyle eşleşmesini istiyorsanız, android:fillViewportiçin true değerine ayarlayın ScrollView.


1
@BasilBattikhi Bir açıklama eklendi
SuppressWarnings

3
Kahretsin bu gerçekten işe yaradı! Kaydırma görüntülerinden gerçekten nefret ediyorum.
Uday

2
Teşekkürler @SuppressWarnings, gerçekten takdir ediyorum. "App: layout_constraintBottom_toBottomOf =" ebeveyn "" çalışma% 100
kaldırılıyor

1
+1, gerçekten yararlı, kaydırma görünümümdeki öğelerin neden istediğim yere konumlanmadığını bilmiyordum.
Jesús Hagiwara

1
Evet doğru ... ama aynı şartı elde etmek için yukarıda bahsettiğim yaklaşımı takip edin.
Raghav Sharma

28

NestedScrollView'ı viewport true ile kullan benim için iyi çalışıyor

<android.support.v4.widget.NestedScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:fillViewport="true">

        <android.support.constraint.ConstraintLayout
            android:layout_width="match_parent"
            android:layout_height="700dp">

        </android.support.constraint.ConstraintLayout>

</android.support.v4.widget.NestedScrollView>

android x için bunu kullanın

 <androidx.core.widget.NestedScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:fillViewport="true">
    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">
.....other views....

</androidx.constraintlayout.widget.ConstraintLayout>
    </androidx.core.widget.NestedScrollView>

4
Teşekkürler! Aradığım şey buydu - android: fillViewport = "true" anahtarıdır.
pratt

AppBarLayout kullanıyorsanız, nestedscrollview içine eklemeyi unutmayınapp:layout_behavior="@string/appbar_scrolling_view_behavior"
majurageerthan

1
Bugüne kadar, bu doğru cevap!
madfree

11

Özetlemek için, android.support.constraint.ConstraintLayoutgörünümünüzü temel olarak mizanpajınızla ilişkilendirilmiş dosyanın ScrollViewiçindeki bir metnin içine *.xmlkaydırırsınız.

Etkinlik_sign_in.xml örneği

<?xml version="1.0" encoding="utf-8"?>

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".SignInActivity"> <!-- usually the name of the Java file associated with this activity -->

    <android.support.constraint.ConstraintLayout 
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@drawable/gradient"
        tools:context="app.android.SignInActivity">

        <!-- all the layout details of your page -->

    </android.support.constraint.ConstraintLayout>
</ScrollView>

Not 1: Kaydırma çubukları, yalnızca klavye açılırsa da dahil olmak üzere herhangi bir şekilde sarma gerekiyorsa görünür.

Not 2: ConstraintLayout'unuzun, özellikle arka planınız varsa, belirli bir ekranın altına ve kenarlarına ulaşacak kadar büyük olduğundan emin olmak da kötü bir fikir olmaz, çünkü bu, garip boşluk olmadığından emin olur . Başka bir şey yoksa bunu boşluklarla yapabilirsiniz.


9

Sadece NestedScrollViewveya içinde kısıtlama düzeni kullanın ScrollView.

<android.support.v4.widget.NestedScrollView
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

    <android.support.constraint.ConstraintLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="@color/white">

 </android.support.constraint.ConstraintLayout>

</android.support.v4.widget.NestedScrollView>

bu kadar. kodlama keyfini çıkarın.


4

Kaydırılabilir bir düzen yapmak için düzen doğrudur. Kaydırma nedeni olana kadar kaydırılamaz (diğer tüm düzenlerde olduğu gibi). Bu yüzden yeterli içerik ekleyin ve herhangi bir düzende olduğu gibi kaydırılabilir olacaktır (Doğrusal, Göreli vb.). Ancak, ConstraintLayout ve ScrollView ile tasarım yaparken Blueprint veya tasarım modunda düzgün kaydırma yapamazsınız .

Anlamı:

Kaydırılabilir bir ConstraintLayout yapabilirsiniz, ancak dikkate alınmayan bir hata / senaryo nedeniyle düzenleyicide düzgün kaydırılmaz. Ancak, kaydırma düzenleyicide çalışmıyor olsa da, cihazlarda çalışır. (Birkaç kaydırma COnstraintLayouts yaptım, bu yüzden test ettim)

Not

Kodunuzla ilgili. ScrollView bir kapatma etiketi eksik, dosyada durum olup olmadığını veya bir kopyala yapıştır özledim olup olmadığını bilmiyorum, ama bakmak isteyebilirsiniz.


1
Kaydırılabilir bir kısıtlama tasarlamak için, CL'nin şu anki durumunda, aygıtın yüksekliğini artırabilir ve özelleştirebilirsiniz. Düzenlerin yüksekliğini (ScrollView ve CL) yüksek bir sayıya ayarlayın (örn. 2000DP) ve sadece normal tasarımı yapın. Gerçekten büyük özel cihazlar bilgisayardan çok şey talep ettiğinden, genişlemeyi işlemek için iyi bir bilgisayara ihtiyacınız olduğunu unutmayın. Bu CLrollViews ile tasarım desteklemiyor utanç verici, ancak geçici çözümler var. cihazın yüksekliğini artırmak gibi.
Zoe

3

Önceki cevapları tamamlamak için AppBar'ın kullanımını da dikkate alan aşağıdaki örneği ekliyorum. Bu kodla, Android Studio tasarım düzenleyicisi ConstraintLayout ile iyi çalışıyor gibi görünüyor.

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
    android:background="@drawable/bg"
    android:orientation="vertical">

<android.support.design.widget.AppBarLayout
    android:id="@+id/app_bar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:theme="@style/AppTheme.ActionBar.AppOverlayTheme">
    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        app:popupTheme="@style/AppTheme.PopupOverlay"/>
</android.support.design.widget.AppBarLayout>

<ScrollView
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <android.support.constraint.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <ImageView
            android:id="@+id/image_id"
            android:layout_width="match_parent"
            android:layout_height="@dimen/app_bar_height"
            android:fitsSystemWindows="true"
            android:scaleType="centerCrop"
            android:src="@drawable/intro"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="parent" />

        <TextView
            android:id="@+id/desc_id"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_margin="@dimen/text_margin"
            android:text="@string/intro_desc"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/image_id" />

        <Button
            android:id="@+id/button_scan"
            style="?android:textAppearanceSmall"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="8dp"
            android:backgroundTint="@color/colorAccent"
            android:padding="8dp"
            android:text="@string/intro_button_scan"
            android:textStyle="bold"
            app:layout_constraintTop_toBottomOf="@+id/desc_id" />

        <Button
            android:id="@+id/button_return"
            style="?android:textAppearanceSmall"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginBottom="8dp"
            android:layout_marginTop="8dp"
            android:backgroundTint="@color/colorAccent"
            android:padding="8dp"
            android:text="@string/intro_button_return"
            android:textStyle="bold"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/button_recycle" />

        <Button
            android:id="@+id/button_recycle"
            style="?android:textAppearanceSmall"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="8dp"
            android:backgroundTint="@color/colorAccent"
            android:padding="8dp"
            android:text="@string/intro_button_recycle"
            android:textStyle="bold"
            app:layout_constraintTop_toBottomOf="@+id/button_scan" />
    </android.support.constraint.ConstraintLayout>
</ScrollView>
</LinearLayout>

2

benim kısıtlama düzeni bir ScrollView etiketi ile çevrili ve android özelliği verdi: isScrollContainer = "true".



1

Constraintlayout yeni bir uygulama için Varsayılan değerdir. Ben şimdi "Android öğrenme" ve bir klavye varken kaydırmak için varsayılan "örnek" kodunu işlemek için nasıl anlamaya çok zor zaman geçirdim. "Gönder" düğmesine tıklamak için klavyeyi kapatmam gereken birçok uygulama gördüm ve bazen gitmiyor. Bu [ScrollView / ContraintLayout / Fields] hiyerarşisini kullanarak şimdi iyi çalışıyor. Bu şekilde kaydırılabilir bir görünümde ConstraintLayout'un avantajlarına ve kullanım kolaylığına sahip olabiliriz.


1

Alt düğmeyi iç içe kaydırma görünümünden çıkarın ve doğrusal öğeyi üst öğe olarak alın. Alt ve iç içe kaydırma görünümünü çocuk olarak ekleyin. Kesinlikle iyi çalışacaktır. Etkinlik için manifestoda bunu kullanın - bu, klavye açıldığında düğmeyi yükseltir

android:windowSoftInputMode="adjustResize|stateVisible"

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <androidx.core.widget.NestedScrollView xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:fillViewport="true">

        <androidx.constraintlayout.widget.ConstraintLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical">

            <com.google.android.material.textfield.TextInputLayout
                android:id="@+id/input_city_name"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginStart="20dp"
                android:layout_marginTop="32dp"
                android:layout_marginEnd="20dp"
                android:hint="@string/city_name"
                app:layout_constraintLeft_toLeftOf="parent"
                app:layout_constraintTop_toTopOf="parent">

                <com.google.android.material.textfield.TextInputEditText
                    android:id="@+id/city_name"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:digits="abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ"
                    android:lines="1"
                    android:maxLength="100"
                    android:textSize="16sp" />

            </com.google.android.material.textfield.TextInputLayout>

        </androidx.constraintlayout.widget.ConstraintLayout>

    </androidx.core.widget.NestedScrollView>

    <Button
        android:id="@+id/submit"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@color/colorPrimary"
        android:onClick="onSubmit"
        android:padding="12dp"
        android:text="@string/string_continue"
        android:textColor="#FFFFFF"
        app:layout_constraintBottom_toBottomOf="parent" />

</LinearLayout>


0

Bunu nasıl
çözdüm : Eğer bir ConstraintLayout içinde Nested ScrollView yani ScrollView kullanıyorsanız, ScrollView için "WRAP_CONTENT" veya "MATCH_PARENT" yerine aşağıdaki yapılandırmayı kullanın:


<ScrollView
    android:layout_width="0dp"
    android:layout_height="0dp"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintBottom_toTopOf="@+id/someOtherWidget"
    app:layout_constraintTop_toTopOf="parent">

0

scrollview içinde height ve width 0 yap Top_toBottomOfand Bottom_toTopOf kısıtlamaları bu kadar.


Lütfen uygulanacak kod örneği gibi bu yanıtı daha fazla açıklayın.
Jake

0

Benim için, alt kısıtlamaları kaldırma veya kaydırma kabını true değerine ayarlama ile ilgili önerilerin hiçbiri işe yaramadı. Ne işe yaradı: Aşağıda gösterildiği gibi Kısıt Düzeni Düzenleyicisi'nin "Dikey Olarak Genişlet" seçeneğini kullanarak mizanpajımdaki tek tek / iç içe görünümlerin yüksekliğini artırın.

Herhangi bir yaklaşım için noktalı önizleme çizgilerinin üst öğenin üst veya alt boyutlarının ötesine dikey olarak uzanması önemlidir

Dikey Olarak Genişlet

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.