当前位置: 首页 > 知识库问答 >
问题:

Android AdjustResize未正确调整大小

郏瀚
2023-03-14

我正在使用此库:https://github.com/yshrsmz/KeyboardVisibilityEvent检测键盘何时打开或关闭,这取决于android清单的输入。

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

>

  • 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和支持操作栏推到视图之外,并在底部留下一个很大的间隙(如下图(图2)所示,在选择“F”的位置,即EditText的底部)。

    我也尝试过使用“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行(当键盘打开和关闭时)的预期效果,而不将其他内容推到视图之外?那么,当软键盘出现时,支持操作栏和first EditText始终保持在相同的位置,并且只调整第二个EditText?

  • 共有2个答案

    谷梁凌
    2023-03-14

    我现在已经设法解决了这个问题(不是最好的解决方案),但它确实有效。顶部的EditText和Support ActionBar现在永远不会被推到视图之外,并且无论选择哪一行,第二个EditText都会自行调整大小。

    显示:

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

    Java:

    private void setupListeners() {
    
        final LinearLayout linearLayout = (LinearLayout) findViewById(R.id.add_record);
        if (linearLayout != null) {
            linearLayout.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Log.d(TAG, "Clicking ll");
                    noteEditText.requestFocus();
    
                    InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
                    inputMethodManager.toggleSoftInputFromWindow(linearLayout.getApplicationWindowToken(),
                            InputMethodManager.SHOW_FORCED, 0);
                }
            });
        }
    
        KeyboardVisibilityEvent.setEventListener(
                AddActivity.this,
                new KeyboardVisibilityEventListener() {
                    @Override
                    public void onVisibilityChanged(boolean isOpen) {
                        // some code depending on keyboard visiblity status
                        Log.d(TAG, "Keyboard visibility changed");
    
                        int currentLine = getCurrentCursorLine(noteEditText);
    
                        lineCount = noteEditText.getLineCount();
    
                        if (isOpen && keyboardActuallyOpen) {
                            Log.d(TAG, "Keyboard is open");
                            //keyboardActuallyClosed = false;
    
                                /*
                                scrollView.fullScroll(View.FOCUS_UP);
                                noteEditText.requestFocus();
                                */
    
                            if (currentLine < 25) {
    
                                getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_NOTHING);
    
                                scrollView.scrollTo(0, 0);
    
                                noteEditText.setMinLines(12);
                                noteEditText.setLines(12);
                                noteEditText.setMaxLines(12);
                                scrollView.scrollTo(0, 0);
    
                                noteEditText.setVerticalScrollBarEnabled(true);
                                scrollView.setVerticalScrollBarEnabled(false);
                                noteEditText.setCursorVisible(true);
    
                                scrollView.requestLayout();
                                noteEditText.requestLayout();
                            } else {
    
                                getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
    
                                scrollView.scrollTo(0, 0);
                                noteEditText.setMinLines(12);
                                noteEditText.setLines(12);
                                noteEditText.setMaxLines(12);
                                scrollView.scrollTo(0, 0);
    
                                noteEditText.setVerticalScrollBarEnabled(true);
                                scrollView.setVerticalScrollBarEnabled(false);
                                noteEditText.setCursorVisible(true);
                            }
                        } else {
    
                            if (!keyboardActuallyOpen) {
    
    
                                lineCount = noteEditText.getLineCount();
    
                                Log.d(TAG, "Keyboard is closed: " + lineCount);
                                noteEditText.setVerticalScrollBarEnabled(false);
                                scrollView.setVerticalScrollBarEnabled(true);
                                noteEditText.setCursorVisible(false);
    
                                noteEditText.setMinLines(lineCount);
                                noteEditText.setLines(lineCount);
                                noteEditText.setMaxLines(lineCount);
                                scrollView.scrollTo(0, 0);
    
                                keyboardActuallyOpen = false;
    
                                //scrollView.requestFocus();
                                //setAdjustResize(1);
    
                                LinearLayout mainLayout = (LinearLayout) findViewById(R.id.add_record);
                                if (mainLayout != null) {
                                    mainLayout.requestFocus();
                                }
                            }
    
                        }
                    }
                });
    
        noteEditText.setOnFocusChangeListener(new View.OnFocusChangeListener() {
            @Override
            public void onFocusChange(View v, boolean hasFocus) {
                Log.d(TAG, "onFocusChange");
    
                if (firstStart) {
                    scrollView.scrollTo(0, 0);
                    noteEditText.setLines(12);
                    noteEditText.setCursorVisible(true);
                    firstStart = false;
                }
    
                if (hasFocus) {
                    Log.d(TAG, "Has Focus");
                    keyboardActuallyOpen = true;
                } else {
                    Log.d(TAG, "Lost focus");
                    keyboardActuallyOpen = false;
                    setAdjustResize(2);
                }
            }
        });
        noteEditText.setOnKeyListener(new View.OnKeyListener() {
            @Override
            public boolean onKey(View v, int keyCode, KeyEvent event) {
                if (event.getKeyCode() == KeyEvent.KEYCODE_BACK) {
                    Log.d(TAG, "closeKeyboard");
    
                    keyboardActuallyOpen = false;
    
                    noteEditText.setMinLines(lineCount);
                    noteEditText.setLines(lineCount);
                    noteEditText.setMaxLines(lineCount);
    
                    noteEditText.setVerticalScrollBarEnabled(false);
                    noteEditText.setCursorVisible(false);
                    noteEditText.requestLayout();
    
                    scrollView.scrollTo(0, 0);
                    scrollView.setVerticalScrollBarEnabled(true);
                    scrollView.requestLayout();
    
                    noteEditText.clearFocus();
                }
                return false;
            }
        });
    
    
    }
    

    Java(子类EditText键盘关闭按钮按下):

    public class ExtendedEditText extends EditText {
    
    public ExtendedEditText(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    
    }
    
    public ExtendedEditText(Context context, AttributeSet attrs) {
        super(context, attrs);
    
    }
    
    public ExtendedEditText(Context context) {
        super(context);
    
    }
    
    @Override
    public boolean onKeyPreIme(int keyCode, KeyEvent event) {
        if (event.getKeyCode() == KeyEvent.KEYCODE_BACK) {
            dispatchKeyEvent(event);
            return false;
        }
        return super.onKeyPreIme(keyCode, event);
    }
    

    }

    XML

        <?xml version="1.0" encoding="utf-8"?>
    <ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/add_scrollView"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:descendantFocusability="beforeDescendants"
        android:focusableInTouchMode="true"
        android:fillViewport="true">
    
        <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
            android:id="@+id/add_record"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical"
            android:padding="20dp"
            android:focusable="true"
            android:focusableInTouchMode="true">
    
            <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">
            </EditText>
    
            <com.securenotes.utils.ExtendedEditText
                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" />
    
        </LinearLayout>
    </ScrollView>
    
    宋俊艾
    2023-03-14

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

    您也可以使用onFocus usChangeListener()来管理它,这是一个更好的做法。

     类似资料:
    • 编辑:它现在可以工作了,我用画布扩展了这个类,将它的大小设置为宽度和高度,然后将它添加到JFrame,然后打包。这管用!但我认为造成这种情况的原因不是尺寸大小,而是我呈现它的方式,我从JFrame中获得了bufferStrategy,而不是画布,这不是应该的方式。

    • 问题内容: 我在Java中使用Apache POI创建一个Excel文件。我填写了数据,然后尝试自动调整每列的大小,但是大小总是错误的(我 认为是 一致的)。前两行始终(?)完全折叠。当我在excel中自动调整列的大小时,它可以完美运行。 (我相信)没有空白单元被写入,并且调整大小是我要做的 最后一 件事。 这是相关的代码: 这是一个精简的版本,没有错误处理等。 我知道那里有一些类似的问题,但是其

    • 你好,谢谢你花时间处理我的问题。首先让我向你介绍我的虚拟/培训项目。下面列出的类应该代表MVC模型(模型、视图、控制器)之后的程序。运行主类时,会打开FileChooser,从中可以选择. csv-File,其中包含保存为String[][]的信息。这个String[][]然后在视图类中可视化为JTable。这个JTable是带有BorderLayout的JFrame中的JPanel的一部分。中心

    • 我有一个matplotlib图,嵌入了一个wxpython框架中,带有一些尺寸标注器。在我加入一个传奇之前,一切都很好,但随后施胶器似乎没有与传奇一起工作。 即使通过在拐角处拖动来调整窗口的大小,主图形也会改变大小,但只会显示图例的边缘。 也就是说,请注意,图例在wxFrame中不可见。 编辑: 对于对我有用的解决方案,我希望它在程序自动绘制图形时看起来很好,这样调整参数可以在程序中硬编码,或者,

    • 下面是和,我试图使它尽可能简单。 黑色是名为的,其内部是名为的。我要做的是将中的的大小调整为的大小减去4。但当您调整窗口大小时,一切都失败了。 你要尝试的... 2)增加窗口的大小,然后慢慢减小。 为什么会这样?我有这个问题三个月了,但我找不到解决办法... 我也看过javafx-resize Canvas,当屏幕调整大小时,但这里的问题似乎是不同的... 如果我不手动设置画布的宽度和高度,它甚至

    • 问题内容: 我想要实现以下目标: 我能获得的最接近的是以下(伪)代码: 每当我想添加组件时,就将它们添加到内部容器中: ....等 我面临以下问题: 我让布局管理器负责所有UI元素的大小。所以最好不要使用任何.setxxSize()方法。一个JTextArea,包含大量文本,将使用所有需要的空间(垂直和水平)。完全没问题。每当调整框架的大小时,JTextArea都会增长,这仍然是可以的。但是每当我