java - 打开键盘时滚动整个布局
问题描述
我创建了一个简单的登录活动,如下所示:
我曾希望,一旦 E-mail EditText 获得焦点,整个布局将向上移动到 Sign In 按钮的底部。
我写了这段代码:
public class SignInActivity extends AppCompatActivity {
private EditText Et_Email, Et_Password;
private Button Btn_Login;
private ScrollView Sv_Layout;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_sign_in);
initUI();
}
private void initUI() {
getSupportActionBar().hide();
Sv_Layout = findViewById( R.id.sv_SignInLayout );
Et_Email = findViewById(R.id.et_SignInEmail);
Et_Password = findViewById(R.id.et_SignInPassword);
Btn_Login = findViewById(R.id.btn_SignIn );
Et_Email.setOnFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View arg0, boolean hasfocus) {
if (hasfocus) {
focusOnView();
} else {
Log.e("TAG", "e1 not focused");
}
}
});
}
private final void focusOnView(){
Sv_Layout.post(new Runnable() {
@Override
public void run() {
Sv_Layout.scrollTo(0, Btn_Login.getBottom());
}
});
}
}
XML 是:
<?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:id="@+id/sv_SignInLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/colorWhite"
android:fillViewport="true"
tools:context=".SignInActivity">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:id="@+id/iv_SignIn"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_marginStart="8dp"
android:layout_marginTop="48dp"
android:layout_marginEnd="8dp"
android:adjustViewBounds="true"
android:scaleType="fitXY"
android:src="@drawable/img_signin"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHeight_percent="0.2"
app:layout_constraintHorizontal_bias="0.55"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintWidth_percent="0.48" />
<TextView
android:id="@+id/tv_SignIn"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="40dp"
android:layout_marginTop="40dp"
android:text="@string/ActivitySignIn_SignIn"
android:textColor="@color/colorLightPurple"
android:textSize="24sp"
app:layout_constraintHeight_percent="0.05"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/iv_SignIn"
app:layout_constraintWidth_percent="0.3" />
<EditText
android:id="@+id/et_SignInEmail"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_marginStart="40dp"
android:layout_marginTop="36dp"
android:layout_marginEnd="40dp"
android:background="@drawable/btn_underline"
android:drawableStart="@drawable/ic_signin_email"
android:drawablePadding="10dp"
android:hint="@string/ActivitySignIn_EmailHint"
android:textColor="@color/colorBlackText"
android:inputType="textEmailAddress"
app:layout_constraintHeight_percent="0.06"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/tv_SignIn" />
<EditText
android:id="@+id/et_SignInPassword"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_marginStart="40dp"
android:layout_marginEnd="40dp"
android:layout_marginTop="16dp"
android:background="@drawable/btn_underline"
android:drawableStart="@drawable/ic_login_lock"
android:drawablePadding="10dp"
android:hint="@string/ActivitySignIn_PasswordHint"
android:inputType="textPassword"
android:textColor="@color/colorBlackText"
app:layout_constraintHeight_percent="0.06"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/et_SignInEmail" />
<Button
android:id="@+id/btn_SignIn"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_marginStart="40dp"
android:layout_marginBottom="80dp"
android:layout_marginEnd="40dp"
android:background="@drawable/btn_rounded_purple"
android:text="@string/ActivitySignIn_SignIn"
android:textAllCaps="false"
android:textColor="@color/colorWhite"
android:textSize="20sp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHeight_percent="0.08"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintBottom_toBottomOf="parent"/>
</androidx.constraintlayout.widget.ConstraintLayout>
</ScrollView>
有什么理由什么都没发生吗?我调试了该应用程序以检查它是否捕捉到焦点并且它确实捕捉到了焦点,但由于某种原因,它仍然没有移动滚动视图。
我的清单android:windowSoftInputMode="adjustPan"
现在有了,因为如果我删除它,整个布局就会缩小。
谢谢!
解决方案
以编程方式在片段/活动的 onCreate 中设置 softInputLayout。
或者
试试这些,
android:windowSoftInputMode=["stateUnspecified",
"stateUnchanged", "stateHidden",
"stateAlwaysHidden", "stateVisible",
"stateAlwaysVisible", "adjustUnspecified",
"adjustResize", "adjustPan"]
推荐阅读
- java - 在 VSCode 中启动 2 个或更多 Java Spring Boot 项目
- gstreamer - 无法使用 nvh265enc gstreamer 插件的无损预设
- excel - 如何在 Excel VBA 中进行顶级过滤
- localization - Blazor WebAssembly - 使用 .resx 进行本地化,无需重新加载应用程序的语言更改可能吗?
- python - 我该如何解决 KeyError:“[Index(['lymphoid_neoplasm'], dtype='object')] 都在 [index] 中”
- outlook - 带有 Outlook 客户端和 Google 日历的 Zimbra IMAP 服务器:接受团队邀请
- reactjs - react-final-form 中的自定义输入验证
- angular - “HTMLFormElement”类型的参数不能分配给“ElementRef”类型的参数
' - javascript - 使用外键保存序列化程序(django rest 框架)
- dockerfile - Dockerfile:添加和复制失败且没有错误