gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 08:54:29 28 4
gpt4 key购买 nike

我正在使用这个库: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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com