java - Android AdjustResize 无法正确调整大小

标签 java android android-layout keyboard android-softkeyboard

我正在使用这个库:https://github.com/yshrsmz/KeyboardVisibilityEvent检测键盘何时打开或关闭,这依赖于输入到 Android list 的 android:windowSoftInputMode="adjustResize"

这个库可以完美地检测软键盘的打开和关闭事件,但由于 adjustmentResize 参数,我的内容被推到了 View 之外。

  • Java:

    KeyboardVisibilityEvent.setEventListener(
            AddActivity.this,
            new KeyboardVisibilityEventListener() {
                @Override
                public void onVisibilityChanged(boolean isOpen) {
                    // some code depending on keyboard visiblity status
                    if (noteEditText.isFocused()) {
                        if (isOpen) {
                            Log.d("KB", "Keyboard is open");
                            noteEditText.setLines(12);
                            noteEditText.setCursorVisible(true);
                        } else {
                            Log.d("KB", "Keyboard is closed");
                            noteEditText.setLines(50);
                            noteEditText.setCursorVisible(false);
                        }
                    }
                }
            });
    
    noteEditText.setOnFocusChangeListener(new View.OnFocusChangeListener() {
        @Override
        public void onFocusChange(View v, boolean hasFocus) {
            Log.d("KB", "onFocusChange");
    
            if (firstStart) {
                noteEditText.setLines(12);
                noteEditText.setCursorVisible(true);
                firstStart = false;
            }
        }
    });
    
  • XML:

    <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"
    android:windowSoftInputMode="stateHidden">
    
    <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>
    
    <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:lines="50"
        android:maxLines="20"
        android:minLines="5"
        android:paddingLeft="5dp"
        android:scrollHorizontally="false"
        android:scrollbars="vertical"
        android:textColor="@color/fontPrimary"
        android:theme="@style/EditTextCustomCursor" />
    

因此,通过调整第二个 EditText 的行,效果很好,然后我在键盘上方打字,但是当我关闭键盘时,滚动到该 EditText 的底部并单击底部,EditText 光标放置在我单击了,但随后它将第一个 EditText 和支持 ActionBar 推出了 View ,并在底部留下了一个大间隙(如下图(图 2)所示,选择“F”的位置,即EditText 的底部)。

  • 想要的效果(全部在正确的位置) Desired Effect

  • 实际效果(支持ActionBar和顶部EditText移出 View ) Actual Effect

我也尝试过使用“adjustNothing”并执行以下操作,但这似乎不起作用,因为在更改行数之前,EditText 高度不会更改,并且行数仅在以下情况下更改它知道键盘是打开还是关闭。

private void setupListeners() {

    final View activityRootView = getWindow().getDecorView().findViewById(android.R.id.content);
    activityRootView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {

            View mainView = (LinearLayout) findViewById(R.id.add_record);
            int heightDiff = mainView.getHeight() - noteEditText.getHeight();
            Log.d("KB", "HeightDiff: " + heightDiff);
            if (heightDiff > 1000 || keyboardShown) { // 99% of the time the height diff will be due to a keyboard.
                Log.d("KB", "Keyboard is open");

                if (isKeyboardVisible) {
                    noteEditText.setLines(12);
                    noteEditText.setCursorVisible(true);
                    noteEditText.requestLayout();
                    isKeyboardVisible = false;
                }
            } else {
                Log.d("KB", "Keyboard is closed");

                if (!isKeyboardVisible) {
                    noteEditText.setLines(50);
                    noteEditText.setCursorVisible(false);
                    noteEditText.requestLayout();
                    isKeyboardVisible = true;
                }
            }
        }
    });

    noteEditText.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            numTimesClicked++;
            Log.d("KB", "onClick: " + numTimesClicked);

            if (clicked) {
                // Run function
                Log.d("KB", "clicked");
                InputMethodManager imm = (InputMethodManager) AddActivity.this.getSystemService(Context.INPUT_METHOD_SERVICE);

                if (imm.isAcceptingText()) {
                    Log.d("KB", "Software Keyboard was shown");
                    isKeyboardVisible = true;
                    keyboardShown = true;
                } else {
                    Log.d("KB", "Software Keyboard was not shown");
                    isKeyboardVisible = false;
                    keyboardShown = false;
                }
            } else {
                Log.d("KB", "scroll");
                clicked = true;
                new Handler().postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        clicked = false;
                    }
                }, 3 * 1000);
            }
        }
    });

    noteEditText.setOnKeyListener(new View.OnKeyListener() {
        @Override
        public boolean onKey(View v, int keyCode, KeyEvent event) {
            if (event.getKeyCode() == KeyEvent.KEYCODE_BACK) {
                Log.d("KB", "closeKeyboard");
                noteEditText.setLines(50);
                noteEditText.setCursorVisible(false);
                noteEditText.requestLayout();
                isKeyboardVisible = false;
            }
            return false;
        }
    });

因此,我将如何实现调整 EditText 行(打开和关闭键盘时)而不将其他内容推出 View 的预期效果?那么Support ActionBar和第一个EditText始终保持在同一位置,只有第二个EditText在软键盘出现时进行调整?

最佳答案

我不确定,但我相信如果您将布局内容保留在 ScrollView 下,并且每次用户输入新行或新单词时,您都会设置 scrollView.scrollTo(0 ,0)。 您也可以使用 ViewTreeObserver 来代替此库,请参阅 here

您也可以使用 onFocusChangeListener() 来管理此操作,这是更好的做法。

关于java - Android AdjustResize 无法正确调整大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42141633/

相关文章:

java - 将错误从服务层传回 View

android - 在 ActionBar 上添加 Logo(图标)和应用程序名称?

Android GridLayout - 如何增加列或行之间的间距?

android - 移动 LinearLayout 有困难

java - 清理未修剪的字符串空白

java - JMS 和 ActiveMQ

java - 具有自定义子类对象的数组适配器

java - 将编辑文本添加到自定义 View 中

android - 如何提示用户启用GPS

java - 序列化: SerialVersion UID generation process