/* * Copyright 2015 Mike Penz All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.pan.materialdrawer.util; import android.app.Activity; import android.graphics.Rect; import android.os.Build; import android.view.View; import android.view.ViewTreeObserver; import android.view.inputmethod.InputMethodManager; import com.mikepenz.materialize.util.UIUtils; /** * Created by mikepenz on 14.03.15. * This class implements a hack to change the layout padding on bottom if the keyboard is shown * to allow long lists with editTextViews * Basic idea for this solution found here: http://stackoverflow.com/a/9108219/325479 */ public class KeyboardUtil { private View decorView; private View contentView; private float initialDpDiff = -1; public KeyboardUtil(Activity act, View contentView) { this.decorView = act.getWindow().getDecorView(); this.contentView = contentView; //only required on newer android versions. it was working on API level 19 if (Build.VERSION.SDK_INT >= 19) { decorView.getViewTreeObserver().addOnGlobalLayoutListener(onGlobalLayoutListener); } } public void enable() { if (Build.VERSION.SDK_INT >= 19) { decorView.getViewTreeObserver().addOnGlobalLayoutListener(onGlobalLayoutListener); } } public void disable() { if (Build.VERSION.SDK_INT >= 19) { decorView.getViewTreeObserver().removeOnGlobalLayoutListener(onGlobalLayoutListener); } } //a small helper to allow showing the editText focus ViewTreeObserver.OnGlobalLayoutListener onGlobalLayoutListener = new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { Rect r = new Rect(); //r will be populated with the coordinates of your view that area still visible. decorView.getWindowVisibleDisplayFrame(r); //get the height diff as dp float heightDiffDp = UIUtils.convertPixelsToDp(decorView.getRootView().getHeight() - (r.bottom - r.top), decorView.getContext()); //set the initialDpDiff at the beginning. (on my phone this was 73dp) if (initialDpDiff == -1) { initialDpDiff = heightDiffDp; } //if it could be a keyboard add the padding to the view if (heightDiffDp - initialDpDiff > 100) { // if more than 100 pixels, its probably a keyboard... //check if the padding is 0 (if yes set the padding for the keyboard) if (contentView.getPaddingBottom() == 0) { //set the padding of the contentView for the keyboard contentView.setPadding(0, 0, 0, (int) UIUtils.convertDpToPixel((heightDiffDp - initialDpDiff), decorView.getContext())); } } else { //check if the padding is != 0 (if yes reset the padding) if (contentView.getPaddingBottom() != 0) { //reset the padding of the contentView contentView.setPadding(0, 0, 0, 0); } } } }; /** * Helper to hide the keyboard * * @param act */ public static void hideKeyboard(Activity act) { if (act != null && act.getCurrentFocus() != null) { InputMethodManager inputMethodManager = (InputMethodManager) act.getSystemService(Activity.INPUT_METHOD_SERVICE); inputMethodManager.hideSoftInputFromWindow(act.getCurrentFocus().getWindowToken(), 0); } } }