Jared
Jared

Reputation: 2217

Android Edit Text Covered By Keyboard on Second Tap

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... enter image description here

Here is what it looks like on the second tap currently (keyboard covers edittext)... enter image description here

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

Answers (7)

SARATH V
SARATH V

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

Vygintas B
Vygintas B

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

Javanshir
Javanshir

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

AnthonyK
AnthonyK

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

Jyoti  Sharma
Jyoti Sharma

Reputation: 233

Add this in your manifest for activity. It works fine

 <activity android:name=".Views.UI.MainActivity"
        android:windowSoftInputMode="stateHidden|adjustResize">

Upvotes: 5

Jiyeh
Jiyeh

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

Farhana Naaz Ansari
Farhana Naaz Ansari

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

Related Questions