java - EditText AdjustResize 强制内容不可见

标签 java android android-layout android-edittext android-softkeyboard

我目前正在开发一个简单的笔记应用程序,用户可以在其中输入标题和笔记内容。我想要实现的是,当用户单击注释内容 (EditText) 时,软键盘出现,只有注释内容 EditText 的大小减小(调整大小),而其他所有内容都保持在同一位置。

我当前的实现如下所示:

list :

<activity android:theme="@style/AppTheme"
        android:name=".AddActivity"
        android:label="@string/add_record"
        android:windowSoftInputMode="adjustResize"
        android:parentActivityName=".MainActivity"
        android:excludeFromRecents="true"/>

XML - 添加 Activity

    <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/add_record"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:padding="20dp">

    <EditText
        android:id="@+id/title_edittext"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:ems="10"
        android:hint="@string/enter_title"
        android:inputType="textCapSentences"
        android:textColor="@color/fontPrimary"
        android:theme="@style/EditTextCustomCursor">

        <requestFocus />
    </EditText>

    <ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/modify_scrollview"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:fitsSystemWindows="false"
        android:isScrollContainer="false"
        android:fillViewport="true">

        <EditText
            android:id="@+id/note_edittext"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="@null"
            android:ellipsize="end"
            android:gravity="top|left"
            android:hint="@string/enter_note"
            android:inputType="textCapSentences|textMultiLine"
            android:paddingLeft="5dp"
            android:scrollHorizontally="false"
            android:textColor="@color/fontPrimary"
            android:theme="@style/EditTextCustomCursor" />
    </ScrollView>

</LinearLayout>

Java - 添加 Activity

private int screenHeight;
private int actionBarHeight = 350;
private int keyboardHeight;

...

private void setupListeners() {

    final LinearLayout layout = (LinearLayout) findViewById(R.id.add_record);
    layout.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {

        @Override
        public void onGlobalLayout() {
            Rect r = new Rect();
            layout.getWindowVisibleDisplayFrame(r);

            screenHeight = layout.getRootView().getHeight();
            keyboardHeight = screenHeight - (r.bottom - r.top);
            Log.d("Keyboard Size", "Size: " + keyboardHeight);

        }
    });

    KeyboardVisibilityEvent.setEventListener(
            AddActivity.this,
            new KeyboardVisibilityEventListener() {
                @Override
                public void onVisibilityChanged(boolean isOpen) {

                    if (isOpen) {
                        Log.d("KB", "openKeyboard");
                        scrollView.setLayoutParams(new LinearLayout.LayoutParams(
                                LinearLayout.LayoutParams.FILL_PARENT, screenHeight - actionBarHeight - keyboardHeight));
                    } else {
                        Log.d("KB", "closeKeyboard");
                        scrollView.setLayoutParams(new LinearLayout.LayoutParams(
                                LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.FILL_PARENT));
                    }
                }
            });
}

这是使用键盘库 ( https://github.com/yshrsmz/KeyboardVisibilityEvent ) 来检测键盘何时打开或关闭。这非常有效,并且高度/布局调整到我想要的样子,但前提是用户单击 EditText 的顶部。如果用户单击 EditText 的底部(如果他们输入了一个长注释),那么整个布局将被向上推,在页面底部留下一个大间隙。

因此,有什么方法可以让用户在 EditText/ScrollView 中的任何地方点击,因为它只调整一个 EditText 的高度,而将另一个 EditText 留在屏幕顶部,而不用将它和 SupportActionBar 推出看法?此外,ScrollView 用于实现屏幕右侧的垂直滚动条 - 如果仅使用 EditText 可以实现相同的行为,那么我将完全删除 ScrollView。

编辑 - 添加照片

图1:长笔记内容(笔记内容的底部在scrollView的底部(无法看到,直到滚动)

Clicking top half of note EditText

图片 2:相同的注释,但单击底部,迫使顶部的 EditText 和 Support ActionBar 离开 View ,同时在底部留下一个间隙。

Clicking bottom half of note EditText

说明:F 突出显示的地方(在图 2 中)是 EditText/ScrollView 的底部,因此您可以看到软键盘顶部和 EditText/ScrollView 底部之间形成的大间隙

期望的行为:单击底部 EditText 中的任意位置应该只调整特定 EditText 的大小以为软键盘腾出空间,并确保此 EditText 位于软键盘上方,以便用户可以看到他们正在键入的内容,而顶部 EditText 保留在整个位置相同。

最佳答案

这是因为您要在 ScrollView 中添加编辑文本。为什么你甚至需要 ScrollView ? ScrollView 具有在导致此行为的键盘弹出时转到特定行的属性。如果你真的想使用 ScrollView ,然后添加主布局作为 ScrollView 。在其中添加一个直接子项 aka 线性布局,并在该线性布局中添加所有内容。

关于java - EditText AdjustResize 强制内容不可见,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42109487/

相关文章:

android - 长 Android TextView 将其他 View 推离屏幕

android - 在 Android View 上更改 LayoutParams 没有任何效果,即使在调用 requestLayout 之后也是如此

java - 顶点数组的问题

java - 尝试使用 thymeleaf 进行 Spring Boot 表单验证,但出现我无法弄清楚的错误

java - BufferedImage 缓冲区大小错误

java - TYPE_ROTATION_VECTOR 不适用于某些设备

android - 如何在android中更改holder对象的 View

Java 可视化虚拟机分析器在关闭时显示类共享已启用

java - Activity 和布局之间的联系?如何更改布局?如何启动和销毁一个 Activity ?

android - 我可以更改 Android 应用程序的语言吗?