Reputation: 2217
So I have an EditText that does not get covered by the keyboard the first time around. Then when you close the keyboard and tap the edittext again it covers the edittext.
I have spent hours researching this issue and have come to the conclusion it has something to do with these two properties of the edit text.
android:inputType="number"
android:gravity="center"
If I remove either one of those the adjustPan (as put in my manifest) works all the time as promised. Seems to be an Android bug. But I need both of these lines in my edit text. What is the best way to solve this problem?
Here is a slightly condensed version of xml:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/colorPrimary"
android:descendantFocusability="beforeDescendants"
android:focusableInTouchMode="true">
<LinearLayout
android:id="@+id/buttons_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:orientation="horizontal"
android:weightSum="5">
<android.support.v7.widget.AppCompatButton
android:id="@+id/generate_button"
android:layout_width="match_parent"
android:layout_height="@dimen/button_height"
android:layout_marginBottom="@dimen/button_margin"
android:layout_marginEnd="0dp"
android:layout_marginLeft="@dimen/button_margin"
android:layout_marginRight="0dp"
android:layout_marginStart="@dimen/button_margin"
android:layout_marginTop="@dimen/button_margin"
android:layout_weight="1"
android:background="@color/buttonColor"
android:elevation="@dimen/button_elevation"
android:foreground="?attr/selectableItemBackground"
android:text="@string/generate"
android:textColor="@color/colorPrimary"
android:textSize="@dimen/generate_button_title_size"
android:textStyle="bold" />
<android.support.v7.widget.AppCompatImageButton
android:id="@+id/copy_button"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_margin="@dimen/button_margin"
android:layout_weight="4"
android:adjustViewBounds="true"
android:background="@color/buttonColor"
android:elevation="@dimen/button_elevation"
android:foreground="?attr/selectableItemBackground"
android:padding="@dimen/button_margin"
android:scaleType="fitCenter"
android:src="@drawable/ic_copy"
android:tint="@color/colorPrimary" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_above="@id/buttons_layout"
android:orientation="vertical"
android:weightSum="10">
<GridLayout
android:id="@+id/grid_layout"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_gravity="center"
android:layout_weight="6"
android:animateLayoutChanges="true">
</GridLayout>
<TextView
android:id="@+id/total_text_view"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="2"
android:gravity="center"
android:text="11"
android:textSize="@dimen/toolbar_title_size"
android:textStyle="bold" />
<android.support.design.widget.TextInputLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_gravity="center"
android:layout_weight="2"
android:textColorHint="@color/textColorHint">
<EditText
android:id="@+id/num_rolls_edit_text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:hint="@string/number_of_rolls"
android:inputType="number"
android:maxLength="@integer/edit_text_max_length"
android:maxLines="1"
android:text="4"
android:textColor="@color/textColor"
android:textSize="@dimen/edit_text_text_size"/>
</android.support.design.widget.TextInputLayout>
</LinearLayout>
Here is what it should look like every time...
Here is what it looks like on the second tap currently (keyboard covers edittext)...
EDIT: I have discovered the keyboard works fine when using Android 7.0. I don't think it works on anything below that. Was this a bug that was recently fixed or something?
Also, I have included android:windowSoftInputMode="adjustPan|stateHidden" in both my application and activity part of my manifest but that doesn't seem to fix it.
Upvotes: 7
Views: 1598
Reputation: 500
Check this code, hiding soft keyboard
try {
View view = this.getCurrentFocus();
if (view != null) {
InputMethodManager inputManager = (InputMethodManager) this.getSystemService(Context.INPUT_METHOD_SERVICE);
inputManager.hideSoftInputFromWindow(view.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
}
} catch (Exception e) {
e.printStackTrace();
}
Upvotes: 0
Reputation: 1694
You could add your layout into ScrollView
and listen onGloablLayout()
callback. If rootview and your view's height diffrence is >100 pixels it's probably keyboard and you could scroll to your EditText
so It's not blocked by keyboard.
final View layout = findViewById(R.id.layoutparentID);
layout.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
int heightDiff = layout.getRootView().getHeight() - layout.getHeight();
if (heightDiff > 100) { // if more than 100 pixels, its probably a keyboard...
final Runnable r = new Runnable() {
public void run() {
scrollView.smoothScrollTo(0, editText.getBottom());
}
};
activityRootView.getHandler().postDelayed(r, 100);
}
}
});
Upvotes: 1
Reputation: 792
RelativeLayout
with alignParentBottom
and several views is always problematic, especially with keyboard. I would suggest using scrollview
and adding views inside LinearLayout
, where the buttons will be at the end, but not surely at the bottom of the view.
Then you don't even need to use adjustPan
. Something like:
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<!-- grid view + textview + textEdit + your buttons at the end -->
</LinearLayout>
Upvotes: 1
Reputation: 473
In your first Screenshot the text "Dice" is cutoff, in the second, where the editText is covered, "Dice" is shown, consider removing the Title editText "Dice"?
Also i see you've used scrollView and said you can use AlignParentBottom
, could you replace that with layoutBelow
?
Upvotes: 2
Reputation: 233
Add this in your manifest for activity. It works fine
<activity android:name=".Views.UI.MainActivity"
android:windowSoftInputMode="stateHidden|adjustResize">
Upvotes: 5
Reputation: 5297
Try changing adjustPan
to adjustResize
for the activity config in manifest file, as the document suggested it.
This (adjustPan) 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.
EDIT
If you don't want the views to be crushed/adjusted when keyboard is opened, add a ScrollView
to your root RelativeLayout
. So that when adjustResize
will scroll the view accordingly instead of "crushing" them.
Hope this helps!
Upvotes: 4
Reputation: 7944
I think you did not use scroll view inside XML if you did it than you need to make some code android mainfeast. <activity
android:name=".activity.ActivityProductDetail"
android:windowSoftInputMode="stateAlwaysHidden|adjustResize" />
Upvotes: 2