簡體   English   中英

ConstraintLayout 中基於百分比的指南在視圖可見時移動,android

[英]Percentage based guideline in ConstraintLayout moves when view is made visible, android

上下文:我正在制作注冊頁面的一部分。 一旦用戶輸入他們的 email,他們點擊繼續並輸入他們的密碼。 點擊 continue 會觸發 Kotlin 代碼,該代碼將密碼視圖的可見性設置為 VISIBLE。

頂部 TextView 受限於屬性“app:layout_constraintGuide_percent=".3"。我希望這意味着它永遠不會移動。

問題:當密碼輸入視圖通過 Kotlin 代碼設置為可見時,所有視圖都莫名其妙地向下移動。 就好像 30% 變成了 35%,當然事實並非如此。

我查看了這篇文章並嘗試使用偏見,但它會產生完全相同的行為。

fragment_sign_up_email.xml:

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@color/white"
        android:padding="@dimen/sign_up_in_outer_padding"
        android:animateLayoutChanges="true"
        tools:context=".SignUpEmailFragment">


        <TextView
            android:id="@+id/textView4"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:fontFamily="@font/lato_bold"
            android:text="@string/xxxx"
            android:textSize="@dimen/title_font_size"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="@+id/guideline3"/>

        <TextView
            android:id="@+id/textView5"
            android:layout_width="20dp"
            android:layout_height="wrap_content"
            android:fontFamily="@font/lato"
            android:text="@string/or"
            android:textSize="@dimen/subtitle_font_size"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/textView4" />

        <TextView
            android:id="@+id/sign_in_button_on_sign_up_screen"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:fontFamily="@font/lato_bold"
            android:text="@string/sign_in"
            android:textColor="@color/main_green"
            android:textSize="@dimen/subtitle_font_size"
            app:layout_constraintStart_toEndOf="@+id/textView5"
            app:layout_constraintTop_toBottomOf="@+id/textView4"/>

        <com.google.android.material.textfield.TextInputLayout
            android:id="@+id/email_field_sign_up"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="30dp"
            android:hint="@string/email_hint"
            app:boxBackgroundColor="@color/white"
            app:errorEnabled="true"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/sign_in_button_on_sign_up_screen"
            app:startIconDrawable="@drawable/common_google_signin_btn_icon_light">

            <com.google.android.material.textfield.TextInputEditText
                android:id="@+id/email_input_sign_up"
                android:layout_width="match_parent"
                android:layout_height="wrap_content" />

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

        <com.google.android.material.textfield.TextInputLayout
            android:id="@+id/password_field_sign_up"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:hint="@string/password_hint"
            app:boxBackgroundColor="@color/white"
            android:visibility="gone"
            app:errorEnabled="true"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/email_field_sign_up"
            app:startIconDrawable="@drawable/common_google_signin_btn_icon_light">

            <com.google.android.material.textfield.TextInputEditText
                android:id="@+id/password_input_sign_up"
                android:layout_width="match_parent"
                android:layout_height="wrap_content" />

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

        <Button
            android:id="@+id/sign_up_email_pass_continue"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="@string/continue_text"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/password_field_sign_up" />

        <androidx.constraintlayout.widget.Guideline
            android:id="@+id/guideline3"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="horizontal"
            app:layout_constraintGuide_percent=".3" />


    </androidx.constraintlayout.widget.ConstraintLayout>



</layout>

SignUpEmailFragment.kt:

package com.example.xxxxx

import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.databinding.DataBindingUtil
import androidx.fragment.app.Fragment
import com.example.xxxxx.databinding.FragmentSignUpEmailBinding

/**
 * Fragment that handles the sign in procedure
 */
class SignUpEmailFragment : Fragment() {

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,savedInstanceState: Bundle?): View? {
        val binding: FragmentSignUpEmailBinding = DataBindingUtil.inflate(inflater,R.layout.fragment_sign_up_email  , container, false)

        binding.signUpEmailPassContinue.setOnClickListener{view: View ->
            continueIsClicked(binding)
        }

        return binding.root
    }


    private fun continueIsClicked(binding: FragmentSignUpEmailBinding) {
        if(emailIsValid(binding)){
                binding.passwordFieldSignUp.setVisibility(View.VISIBLE);
                if(passwordIsValid(binding)){
                    //TODO navigate to next page
                }
        }
    }

    private fun passwordIsValid(binding: FragmentSignUpEmailBinding): Boolean {
        //TODO implement
        return true
    }

    private fun emailIsValid(binding: FragmentSignUpEmailBinding): Boolean {
        //TODO implement
        return true
    }

    companion object {
        fun newInstance() = SignUpEmailFragment()
    }

}

點擊前:截圖1

點擊后:截圖2

我想到了。

出現此 Fragment 的androidx.fragment.app.FragmentContainerView具有屬性android:layout_height="wrap_content" 我將其更改為android:layout_height="match_parent"並且它工作正常。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM