Android:如何滚动滚动视图以在出现键盘时显示下一个字段

问题描述 投票:2回答:5

我使用scrollview并设置WindowSoftInputMode = SoftInput.AdjustResize,但是当出现键盘时我的scrollview不会滚动。

当键盘出现时,隐藏我的编辑文本。下面是我的带有滚动视图的代码。

   <ScrollView
        android:id="@+id/scrollView"    
        android:clipToPadding="false"   
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:layout_behavior="@string/appbar_scrolling_view_behavior"
        android:isScrollContainer="true"
        android:fillViewport="true">
        <RelativeLayout
            android:layout_width="match_parent"
            android:paddingLeft="@dimen/padding_30"
            android:paddingRight="@dimen/padding_30"
            android:paddingBottom="@dimen/padding_30"
            android:layout_height="wrap_content" >
            <RelativeLayout 
                android:layout_width="match_parent"                 
                android:id="@+id/TopWelcomeLayout"
                android:layout_height="wrap_content">
                <ImageView
                    android:id="@+id/signupImg"
                    android:layout_marginTop="25dp"
                    android:scaleType="fitCenter"
                    android:layout_height="wrap_content"
                    android:layout_width="match_parent"
                    android:src="@drawable/splitssignuplogo"  />
                <TextView
                    android:layout_width="match_parent"
                    android:id="@+id/welcomeText"
                    android:layout_below="@id/signupImg"
                    android:layout_marginTop="22dp"
                    android:layout_height="wrap_content"
                    android:textColor="@color/colorGray"
                    android:lines="3"
                    android:textSize="@dimen/textSize_16"
                    android:gravity="center"
                    android:layout_marginLeft="10dp"
                    android:layout_marginRight="10dp"
                    android:text="When it comes to owning your songs importan"/>
            </RelativeLayout>
            <RelativeLayout
                android:layout_width="match_parent"
                android:layout_marginTop="20dp"
                android:layout_below="@id/TopWelcomeLayout"
                android:id="@+id/avtarLayout"
                android:layout_height="wrap_content"
                android:layout_centerHorizontal="true"
                android:gravity="center">
                <refractored.controls.CircleImageView
                    android:id="@+id/avtar"
                    android:layout_height="110dp"
                    android:layout_width="110dp"
                    android:transitionName="EXTRA_IMAGE"
                    android:src="@drawable/signupuser"/>
                <ImageView
                    android:id="@+id/cameraIcon"
                    android:layout_height="40dp"
                    android:layout_width="40dp"
                    android:src="@drawable/CameraSignUp"
                    android:tint="#9195aa"
                    android:layout_marginLeft="35dp"
                    android:layout_marginTop="35dp"  />


            </RelativeLayout>
            <RelativeLayout 
                android:layout_width="match_parent"
                android:id="@+id/emailUpdateLayout"
                android:layout_below="@id/avtarLayout"
                android:layout_height="wrap_content">                       
                    <TextView 
                        android:layout_width="match_parent"
                        android:gravity="center"
                       android:id="@+id/emailTextForUpdateAccount"
                        android:layout_marginTop="13dp"
                        android:layout_marginBottom="40dp"
                        android:text="[email protected]"
                        android:textColor="#9195AA"
                        android:layout_below="@+id/avtar"
                        android:textSize="@dimen/textSize_14"
                        android:layout_height="wrap_content"/>
            </RelativeLayout>
            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_below="@id/emailUpdateLayout"
                android:id="@+id/nameLayout"
                android:layout_marginTop="@dimen/margin_17"
                android:weightSum="100">
                <android.support.design.widget.TextInputLayout
                    android:layout_width="match_parent"
                    android:layout_marginRight="@dimen/margin_10"
                    android:layout_height="wrap_content"
                    android:id="@+id/FirstNameWrapper"
                    app:errorTextAppearance="@style/ErrorText"
                    android:layout_marginTop="@dimen/margin_10"
                    android:theme="@style/CommonTextStyleTheme"
                    android:layout_weight="50">
                    <EditText
                        android:id="@+id/efirstname"
                        android:nextFocusDown="@+id/elastname"
                        android:textColor="@color/colorLightBlue"
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:inputType="textCapWords"
                        android:textSize="@dimen/textSize_14"
                        android:paddingBottom="@dimen/padding_20"
                        android:hint="FIRST NAME *" />
                </android.support.design.widget.TextInputLayout>
                <android.support.design.widget.TextInputLayout
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_weight="50"
                    app:errorTextAppearance="@style/ErrorText"
                    android:id="@+id/LastNameWrapper"
                    android:theme="@style/CommonTextStyleTheme"
                    android:layout_marginLeft="@dimen/margin_10"
                    android:layout_marginTop="@dimen/margin_10">
                    <EditText
                        android:id="@+id/elastname"
                        android:nextFocusDown="@+id/eemail"
                        android:textColor="@color/colorLightBlue"
                        android:textSize="@dimen/textSize_14"
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:inputType="textCapWords"
                        android:paddingBottom="@dimen/padding_20"
                        android:hint="LAST NAME *" />
                </android.support.design.widget.TextInputLayout>
            </LinearLayout>
            <android.support.design.widget.TextInputLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_below="@id/nameLayout"
                app:errorTextAppearance="@style/ErrorText"
                android:id="@+id/emailLayout"
                android:theme="@style/CommonTextStyleTheme"
                android:layout_marginTop="@dimen/margin_15">
                <EditText
                    android:id="@+id/eemail"
                    android:nextFocusDown="@+id/epassword"
                    android:textColor="@color/colorLightBlue"
                    android:layout_width="match_parent"
                    android:textSize="@dimen/textSize_14"
                    android:paddingBottom="@dimen/padding_20"
                    android:layout_height="wrap_content"
                    android:inputType="textEmailAddress"
                    android:hint="EMAIL *" />
            </android.support.design.widget.TextInputLayout>
            <android.support.design.widget.TextInputLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_below="@id/emailLayout"
                app:errorTextAppearance="@style/ErrorText"
                android:id="@+id/confirmemailLayout"
                android:theme="@style/CommonTextStyleTheme"
                android:layout_marginTop="@dimen/margin_15">
                <EditText
                    android:id="@+id/econfirmemail"
                    android:nextFocusDown="@+id/epassword"
                    android:textColor="@color/colorLightBlue"
                    android:layout_width="match_parent"
                    android:textSize="@dimen/textSize_14"
                    android:paddingBottom="@dimen/padding_20"
                    android:layout_height="wrap_content"
                    android:inputType="textEmailAddress"
                    android:hint="CONFIRM EMAIL *" />
            </android.support.design.widget.TextInputLayout>


            <RelativeLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:id="@+id/phoneLayout"
                android:layout_below="@id/confirmemailLayout"
                android:layout_marginTop="@dimen/margin_15"
                android:paddingBottom="5sp">

                    <TextView
            android:id="@+id/lblphonenumber"    
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="3dp"
            android:textColor="#9195aa"
            app:fontFamily="@font/lato_regular"
            android:textSize="@dimen/textSize_12"   
            android:text="PHONE NUMBER *" />

            <RelativeLayout
                android:layout_width="wrap_content"
                android:layout_height="40dp"
                android:layout_marginLeft="3dp"
                android:layout_centerVertical="true"
                android:layout_below="@+id/lblphonenumber"
                android:id="@+id/CountryDropLayout">

                   <TextView
                         android:id="@+id/countrySpinner"
                         android:layout_width="wrap_content"
                         android:layout_height="match_parent"
                         android:paddingRight="15dp"
                         android:textColor="#4C5375"
                         android:layout_centerVertical="true"
                         android:textSize="@dimen/textSize_14"
                         android:gravity="center_vertical"
                         android:maxLines="1"
                         android:text="US"
                         android:singleLine="true"
                         android:background="@null"
                         android:textCursorDrawable="@null"
                         android:inputType="textPhonetic" />

                    <ImageButton
                          android:layout_width="10dp"
                          android:layout_height="10dp"
                          android:src="@drawable/downarrow"
                          android:background="@null"
                          android:layout_toRightOf="@+id/countrySpinner"
                          android:id="@+id/btnDropDown"
                          android:layout_centerVertical="true"
                           />

                    <TextView
                        android:id="@+id/lblcountrycode"    
                        android:layout_width="wrap_content"
                        android:layout_height="40dp"
                        android:layout_centerVertical="true"
                        android:paddingLeft="@dimen/margin_15"  
                        android:layout_toRightOf="@+id/countrySpinner"
                        android:layout_marginLeft="8dp"
                        android:paddingTop="11sp"   
                        android:textColor="#9195aa"
                        android:textSize="@dimen/textSize_14"   
                        android:text="+1" />
            </RelativeLayout>

            <EditText
                android:id="@+id/ephone"
                android:layout_width="match_parent"
                android:nextFocusDown="@+id/einstagram"
                android:textSize="@dimen/textSize_14"
                android:layout_height="40dp"
                android:background="@null"
                android:paddingLeft="@dimen/margin_10"  
                android:gravity="center_vertical"
                android:layout_below="@+id/lblphonenumber"
                android:layout_toRightOf="@+id/CountryDropLayout"
                android:textColor="@color/colorLightBlue"
                android:inputType="number"
                android:hint="PHONE NUMBER *" />

            <TextView
            android:id="@+id/lbldivider"
            android:layout_width="match_parent"
            android:layout_marginLeft="3dp"
            android:layout_marginTop="2sp"
            android:layout_below="@+id/CountryDropLayout"
            android:layout_height="1dp"
            android:background="#efeff2"/>

            <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Phone Number is required."
            android:id="@+id/textViewError"
            android:layout_below="@+id/lbldivider"
            android:textSize="10sp"
            android:paddingTop="5dp"            
            android:visibility="gone"
            android:textColor="#f81353"
             />
            </RelativeLayout>


            <android.support.design.widget.TextInputLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_below="@id/phoneLayout"
                android:id="@+id/passwordLayout"
                app:errorTextAppearance="@style/ErrorText"
                android:theme="@style/CommonTextStyleTheme"
                android:layout_marginTop="@dimen/margin_15">
                <EditText
                    android:id="@+id/epassword"
                    android:imeOptions="actionDone"
                    android:textColor="@color/colorLightBlue"
                    android:layout_width="match_parent"
                    android:textSize="@dimen/textSize_14"
                    android:layout_height="wrap_content"
                    android:inputType="textPassword"
                    android:paddingBottom="@dimen/padding_20"
                    android:hint="CREATE PASSWORD *" />
            </android.support.design.widget.TextInputLayout>    

            <TextView 
                android:layout_width="match_parent"
                android:visibility="invisible"
                android:layout_below="@id/passwordLayout"
                android:layout_marginTop="@dimen/margin_30"
                android:id="@+id/errorText"
                android:textColor="#f81353"
                android:text="swgdsfwgdfwfdgwfdfdf"
                android:textSize="@dimen/textSize_13"
                android:layout_height="wrap_content"/>
            <RelativeLayout
                android:layout_width="match_parent"
                 android:layout_below="@id/errorText"
                android:id="@+id/btnLayout"
                android:layout_height="wrap_content">

                <Button
                    android:text="SIGN UP"
                    android:visibility="visible"
                    android:alpha="0.5"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:background="@drawable/rounded_greenbutton"
                    android:layout_marginTop="@dimen/margin_20"
                    android:textColor="@color/colorWhite"
                    android:padding="@dimen/padding_20"
                    android:textSize="@dimen/textSize_16"
                    android:textStyle="bold"
                    android:id="@+id/btnSignUp" />
            </RelativeLayout>



        </RelativeLayout>
    </ScrollView>

如果单击名字,如何显示我的下一个字段,例如电子邮件。

enter image description here

android android-edittext keyboard scrollview android-softkeyboard
5个回答
1
投票

在我的设备中,它工作正常,我未在清单中添加任何内容,也未添加此WindowSoftInputMode = SoftInput.AdjustResize

我在主布局中只有android:fitsSystemWindows =“ true”

enter image description here


1
投票

Ankit有部分答案。他的答案的问题是,即使当前在屏幕上可见,您的视图也会滚动。使用此代码,您将摆脱错误的视图滚动带来的不良用户体验。

import android.content.res.Resources;
import android.graphics.Rect;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.view.ViewTreeObserver;
import android.widget.EditText;
import android.widget.ScrollView;

public class MainActivity extends AppCompatActivity {

    private ScrollView sView;
    private int heightDiff;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);


        sView = findViewById(R.id.scrollView);
        //Here we get the height of soft keyboard by observing changes of the scrollView's height.
        sView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
            public void onGlobalLayout() {
                heightDiff = sView.getRootView().getHeight() - sView.getHeight();
            }
        });


        final EditText email = findViewById(R.id.eemail);
        EditText firstName = findViewById(R.id.efirstname);
        firstName.setOnFocusChangeListener(new View.OnFocusChangeListener() {
            @Override
            public void onFocusChange(View v, boolean hasFocus) {
                if (!isVisibleWhileSoftKeyboardShowing(email) && hasFocus) {
                    sView.postDelayed(new Runnable() {
                        @Override
                        public void run() {
                            sView.smoothScrollBy(0, 200);
                        }
                    }, 500);
                }

            }
        });
    }

    /**
     * check if a view is currently visible in the screen or not
     *
     * @param view
     * @return
     */
    public boolean isVisibleWhileSoftKeyboardShowing(final View view) {
        if (view == null) {
            return false;
        }
        if (!view.isShown()) {
            return false;
        }
        final Rect actualPosition = new Rect();
        view.getGlobalVisibleRect(actualPosition);
        final Rect screen = new Rect(0, 0, getScreenWidth(), getScreenHeight() - heightDiff);
        return actualPosition.intersect(screen);
    }


    /**
     * to get screen width
     *
     * @return
     */
    public static int getScreenWidth() {
        return Resources.getSystem().getDisplayMetrics().widthPixels;
    }

    /**
     * to get screen height
     *
     * @return
     */
    public static int getScreenHeight() {
        return Resources.getSystem().getDisplayMetrics().heightPixels;
    }
} 

我希望这是您要查找的确切内容。


0
投票

您可以通过使用setOnFocusChangeListener函数在视图对象上调用OnFocusChange()来实现类似的功能。

 sView = findViewById(R.id.scrollView);
    email = findViewById(R.id.eemail);
    fname = findViewById(R.id.efirstname);
    fname.setOnFocusChangeListener(new View.OnFocusChangeListener() {
        @Override
        public void onFocusChange(View v, boolean hasFocus) {
            boolean b =  sView.postDelayed(new Runnable() {
                @Override
                public void run() {
                    sView.smoothScrollBy(0,300);
                }
            },800) ;


        }
    });

    email.setOnFocusChangeListener(new View.OnFocusChangeListener() {
        @Override
        public void onFocusChange(View v, boolean hasFocus) {
            boolean b =  sView.postDelayed(new Runnable() {
                @Override
                public void run() {
                    sView.smoothScrollBy(0,300);
                }
            },800) ;
        }
    });

我注意到的另一件事是您将EditTextTextInputLayout一起使用。您可以使用TextInputEditText


0
投票

在Android清单中放入:

 <activity
                android:name=".YourActivity"
                android:windowSoftInputMode="stateAlwaysHidden|adjustResize" />

在ScrollView中,如下设置layout_heightfillViewport

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

0
投票

您不能增加软键盘和Edittext之间的距离,但是可以通过滚动页面来手动完成此操作,这是肮脏的方式

efirstname.setOnFocusChangeListener(new OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
    if (hasFocus) {
            Handler(Looper.getMainLooper()).postDelayed({
                scrollView.scrollBy(0, 200)
            }, 100)
        }
    });
}

并且您需要在ScrollView中添加以下几行:

android:paddingBottom="200dp"
android:clipToPadding="false"
© www.soinside.com 2019 - 2024. All rights reserved.