我正在使用此库: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?
我现在已经设法解决了这个问题(不是最好的解决方案),但它确实有效。顶部的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>
我不确定,但我相信如果您将布局内容保留在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都会增长,这仍然是可以的。但是每当我