Intereting Posts
Android: smoothScrollToPosition () работает неправильно Где Eclipse скрывает хранилище ключей? Получение видеопотока IP Cam на Android (MJEPG) Как установить текст в текстовое представление из string.xml и обычной строки за раз Удалите пробел между кнопками в LinearLayout (Android) Обработка изображений на Android – какие библиотеки я могу использовать? COCOS 2D-снимок экрана черный в Android Android: Как вы можете получить фреймбуфер (скриншот) на корневом устройстве? Можно ли изменить контекст приложения во время жизненного цикла приложения? Доступ к обработчику потоков пользовательского интерфейса из службы Почему размер apk для Android отличается при построении из окон и mac Получение атрибута «android: icon»: атрибут не является строковым значением »при загрузке APK в хранилище воспроизведения Проблемы с установкой API Android 4.2 Как использовать adb grant или adb revoke? Android – Получить высоту элемента списка ListView?

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

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

Solutions Collecting From Web of "Android EditText, мягкая клавиатура показать / скрыть событие?"

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

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

@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); } 

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

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

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

Я решил эту проблему, используя 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 является корневым представлением вашей деятельности.

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

Расширьте любой макет, который вы захотите, вместо 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(); } } 

Пример:

макет / 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"); } }); } } 

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

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

Вы можете onConfigurationChanged это, перезаписав метод 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(); } }