Можно ли поймать событие, которое Soft Keyboard было отображено или скрыто для EditText?
Android EditText, мягкая клавиатура показать/скрыть событие?
Ответ 1
Привет, я использовал следующее обходное решение:
Что касается моего представления содержимого - это подкласс 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);
}
Это обходное решение помогло мне скрыть некоторые элементы управления, когда клавиатура показывает и возвращает в противном случае.
Надеюсь, это было бы полезно.
Ответ 2
На самом деле нет такого события. IME просто показывает и скрывает свое окно; обратная связь, которую вы получаете от этого, - это диспетчер окон, который приводит к изменению размера вашего собственного содержимого окна, если вы поместили его в режим изменения размера.
Ответ 3
Я решил эту проблему, используя 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 - это вид корневой активности.
Ответ 4
В моем случае я хотел скрыть нижнюю панель, когда была показана экранная клавиатура. Я считал, что лучше всего скрыть панель, когда размер макета меньше, чем размер обычного макета. Поэтому я использовал это решение, которое отлично работает, учитывая, что мягкая клавиатура обычно занимает 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");
}
});
}
}
Ответ 5
попробуйте следующие методы: showSoftInput(View, int, ResultReceiver)
и hideSoftInputFromWindow(IBinder, int, ResultReceiver)
. Вы можете переопределить метод onReceiveResult(int resultCode, Bundle resultData)
класса ResultReceiver
для обработки события show/hide.
Ответ 6
Многие разработчики Android любят изменять макет, основываясь на том, показана ли виртуальная клавиатура или нет. Для решения вы можете видеть Android: открыть панель softkey open.and он работает для меня, и я думаю, что это так полезно.
Ответ 7
Вы можете записать это, перезаписав метод 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();
}
}