Android EditText, мягкая клавиатура показать / скрыть событие? - PullRequest
44 голосов
/ 25 сентября 2010

Можно ли поймать событие, когда Soft Keyboard была показана или скрыта для EditText?

Ответы [ 7 ]

29 голосов
/ 13 июня 2011

Привет, я использовал следующий обходной путь:

Поскольку мое представление контента является подклассом LinearLayout (может быть любым другим представлением или группой представлений), я бы переопределил метод onMeasure следующим образом:

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    final int proposedheight = MeasureSpec.getSize(heightMeasureSpec);
    final int actualHeight = getHeight();

    if (actualHeight > proposedheight){
        // Keyboard is shown
    } else {
        // Keyboard is hidden
    }

    super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}

Этот обходной путь помог мне скрыть некоторые элементы управления при отображении клавиатуры и вернуть их в противном случае.

Надеюсь, это будет полезно.

18 голосов
/ 25 сентября 2010

Там на самом деле нет такого события, чтобы поймать. IME просто показывает и скрывает свое окно; обратная связь, которую вы получаете от этого - оконный менеджер, вызывающий изменение размера содержимого вашего собственного окна, если вы перевели его в режим изменения размера.

4 голосов
/ 11 августа 2015

Я решил эту проблему с помощью onGlobalLayoutListener:

 final View activityRootView = findViewById(R.id.top_root);
        activityRootView.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
            public void onGlobalLayout() {
                int heightDiff = activityRootView.getRootView().getHeight() - activityRootView.getHeight();

                if (heightDiff > 100) {
                    // keyboard is up
                } else {
                    // keyboard is down
                }
            }
        });

Здесь activityRootView - это корневой вид вашей активности.

2 голосов
/ 23 ноября 2014

В моем случае я хотел скрыть нижнюю панель, когда отображалась программная клавиша.Я считал, что лучше всего просто скрыть панель, когда размер макета составляет менее процента от нормального размера макета.Поэтому я использовал это решение, которое отлично работает, учитывая, что программная клавиатура обычно занимает 20% и более высоту экрана.Просто измените процентную константу на любое значение, которое вы считаете нормальным.Ему необходим атрибут android: windowSoftInputMode = "AdjustResize" в манифесте, и макет должен быть корневым для работы.

Расширение из любого макета, который может потребоваться вместо RelativeLayout.

public class SoftKeyboardLsnedRelativeLayout extends RelativeLayout {
    private boolean isKeyboardShown = false;
    private List<SoftKeyboardLsner> lsners=new ArrayList<SoftKeyboardLsner>();
    private float layoutMaxH = 0f; // max measured height is considered layout normal size
    private static final float DETECT_ON_SIZE_PERCENT = 0.8f;

    public SoftKeyboardLsnedRelativeLayout(Context context) {
        super(context);
    }

    public SoftKeyboardLsnedRelativeLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @SuppressLint("NewApi")
    public SoftKeyboardLsnedRelativeLayout(Context context, AttributeSet attrs,
            int defStyle) {
        super(context, attrs, defStyle);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        final int newH = MeasureSpec.getSize(heightMeasureSpec);
        if (newH > layoutMaxH) {
            layoutMaxH = newH;
        }
        if (layoutMaxH != 0f) {
            final float sizePercent = newH / layoutMaxH;
            if (!isKeyboardShown && sizePercent <= DETECT_ON_SIZE_PERCENT) {
                isKeyboardShown = true;
                for (final SoftKeyboardLsner lsner : lsners) {
                    lsner.onSoftKeyboardShow();
                }
            } else if (isKeyboardShown && sizePercent > DETECT_ON_SIZE_PERCENT) {
                isKeyboardShown = false;
                for (final SoftKeyboardLsner lsner : lsners) {
                    lsner.onSoftKeyboardHide();
                }
            }
        }
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    }

    public void addSoftKeyboardLsner(SoftKeyboardLsner lsner) {
        lsners.add(lsner);
    }

    public void removeSoftKeyboardLsner(SoftKeyboardLsner lsner) {
        lsners.remove(lsner);
    }

    // Callback
    public interface SoftKeyboardLsner {
        public void onSoftKeyboardShow();
        public void onSoftKeyboardHide();
    }
}

Пример:

layout / my_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<yourclasspackage.SoftKeyboardLsnedRelativeLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/myLayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    ...
</yourclasspackage.SoftKeyboardLsnedRelativeLayout>

MyActivity.java

public class MyActivity extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.my_layout);
        SoftKeyboardLsnedRelativeLayout layout = (SoftKeyboardLsnedRelativeLayout) findViewById(R.id.myLayout);
        layout.addSoftKeyboardLsner(new SoftKeyboardLsner() {
            @Override
            public void onSoftKeyboardShow() {
                Log.d("SoftKeyboard", "Soft keyboard shown");
            }

            @Override
            public void onSoftKeyboardHide() {
                Log.d("SoftKeyboard", "Soft keyboard hidden");
            }
        });
    }
}
1 голос
/ 08 сентября 2011

попробуйте эти методы: showSoftInput(View, int, ResultReceiver) и hideSoftInputFromWindow(IBinder, int, ResultReceiver). Вы можете переопределить onReceiveResult(int resultCode, Bundle resultData) метод класса ResultReceiver для обработки события show / hide.

0 голосов
/ 12 октября 2015

Многие разработчики Android любят изменять раскладку в зависимости от того, отображается виртуальная клавиатура или нет. Поэтому для решения вы можете увидеть Android: обнаружение открытия софт-клавиатуры . И это работает для меня, и я думаюэто так же полезно.

0 голосов
/ 29 мая 2013

Вы можете записать это, переписав onConfigurationChanged метод вашей деятельности:

@Override
public void onConfigurationChanged(Configuration newConfig) {
   super.onConfigurationChanged(newConfig);

   if(newConfig.hardKeyboardHidden == Configuration.HARDKEYBOARDHIDDEN_NO) {
      ((SherlockFragmentActivity)getActivity()).getSupportActionBar().hide();
   }
   else if(newConfig.hardKeyboardHidden == Configuration.HARDKEYBOARDHIDDEN_YES){
      ((SherlockFragmentActivity)getActivity()).getSupportActionBar().show();
   }
}
...