Reputation: 433
I have an activity with an editText in the middle. When I click on the editText the keyboard appears, and the screen moves so that the editText is just above the keyboard, covering the other stuff that is below.
I don't want to resize or add padding to the layout. I need that the screen scrolls to the top the amount of space that I need to see also the other stuff below. In other words, I'd like to select the position of the editText when the keyboard appears. It would be enough also if the screen scrolls up completely, showing me the bottom of the layout.
I tried to put the layout in a scrollView adding this code on the editText
editText.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
//make the view scroll down to the bottom
scrollView.scrollTo(0, scrollView.getBottom());
}
});
but it doesn't work. Does anyone have an idea? Thank you in advance!
Upvotes: 42
Views: 74446
Reputation: 1
This code works for me, no need to add clickListener() or focusChanhgeListener() in your activity override onUserInteraction() function
@Override
public void onUserInteraction() {
super.onUserInteraction();
if (editText.hasFocus() ) { // to check if user is clicked on edit text
if (scroll.getVerticalScrollbarPosition() != scroll.getBottom()) // if scrollview is not already on the bottom
scroll.post(() -> scroll.scrollTo(0, scroll.getBottom()));
}
}
Upvotes: 0
Reputation: 2990
The simple way to do it in Kotlin (reused from user user6581344 's answer), and i used it to perform a manual scroll to EditText when focus is set and keyboard is shown, as need it with extra bottom padding between keypad and the EditText:
binding.scrollView.postDelayed(object:Runnable {
override fun run() {
val extraBottomPadding = 100
val manualScroll = txtFullName.y + extraBottomPadding
scrollView.smoothScrollBy(0, manualScroll.toInt())
}
}, 200)
Upvotes: 1
Reputation: 11
just add
android:screenReaderFocusable="true"
to your XML file, it will work like a charm
Upvotes: 1
Reputation: 33
It only worked for me after I changed from Constraint Layout to Linear Layout and added
android:windowSoftInputMode="adjustResize"
.
and removed
<item name="android:windowFullscreen">true</item>
from the Activity style
Upvotes: 1
Reputation: 51
This works: -
There is an issue with the scroll up when Keyboard opens up in Constraint Layout. Don't use that.
To achieve "Scroll the screen up when keyboard appears" Try this
Use Linear layout and ScrollView
and fill_parent in Scroll view. and any Text field in the scroll view.
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:gravity="center">
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:fillViewport="true">
</ScrollView>
</LinearLayout>
Upvotes: 5
Reputation: 2833
Add this library to your gradle dependencies:
dependencies {
compile 'net.yslibrary.keyboardvisibilityevent:keyboardvisibilityevent:2.1.0'
}
and use this code:
KeyboardVisibilityEvent.setEventListener(getActivity(), new KeyboardVisibilityEventListener() {
@Override
public void onVisibilityChanged(boolean isOpen) {
if (isOpen && MY_EDIT_TEXT.hasFocus()) {
//scroll to last view
View lastChild = scrollLayout.getChildAt(scrollLayout.getChildCount() - 1);
int bottom = lastChild.getBottom() + scrollLayout.getPaddingBottom();
int sy = scrollLayout.getScrollY();
int sh = scrollLayout.getHeight();
int delta = bottom - (sy + sh);
scrollLayout.smoothScrollBy(0, delta);
}
}
});
Upvotes: 4
Reputation: 1035
I had a similar problem once, I resolved using:
android:windowSoftInputMode="adjustResize"
in the AndroidManifest.xml.
If you use a RelativeLayout start with the bottom element that must be hooked to the parent bottom and then hook the other element above the previous.
If you use LinearLayout wrap it in a RelativeLayout and hook the LinearLayout to parentBottom.
In this way when the keyboard pops up you will see the bottom of your layout.
Hope this helps.
Upvotes: 27
Reputation: 111
I had a this problem , I resolved by this code :
myEdittext.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
myscrollview.postDelayed(new Runnable() {
@Override
public void run() {
View lastChild = myscrollview.getChildAt(myscrollview.getChildCount() - 1);
int bottom = lastChild.getBottom() + myscrollview.getPaddingBottom();
int sy = myscrollview.getScrollY();
int sh = myscrollview.getHeight();
int delta = bottom - (sy + sh);
myscrollview.smoothScrollBy(0, delta);
}
}, 200);
}
});
Upvotes: 11
Reputation: 18356
use android:windowSoftInputMode="adjustPan"
"adjustResize"
The activity's main window is always resized to make room for the soft keyboard on screen.
"adjustPan"
The activity's main window is not resized to make room for the soft keyboard. Rather, the contents of the window are automatically panned so that the current focus is never obscured by the keyboard and users can always see what they are typing. This is generally less desirable than resizing, because the user may need to close the soft keyboard to get at and interact with obscured parts of the window.
For example inn your manifest file:-
<activity
android:windowSoftInputMode="adjustPan"
android:name=".MainActivity"></activity>
Late answer.But surely it helps anyone.
Upvotes: 47
Reputation: 105
This works for me
android:windowSoftInputMode="stateVisible|adjustResize"
in androidmanifest for the activity
Upvotes: 7