Ответ 1
Здесь решение, которое работает как экран входа Evernote:
Сначала определите класс, который будет вашим специальным LinearLayout следующим образом:
public class MyLayout extends LinearLayout {
public MyLayout(Context context, AttributeSet attrs) {
super(context, attrs);
}
public MyLayout(Context context) {
super(context);
}
private OnSoftKeyboardListener onSoftKeyboardListener;
@Override
protected void onMeasure(final int widthMeasureSpec, final int heightMeasureSpec) {
if (onSoftKeyboardListener != null) {
final int newSpec = MeasureSpec.getSize(heightMeasureSpec);
final int oldSpec = getMeasuredHeight();
if (oldSpec > newSpec){
onSoftKeyboardListener.onShown();
} else {
onSoftKeyboardListener.onHidden();
}
}
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
public final void setOnSoftKeyboardListener(final OnSoftKeyboardListener listener) {
this.onSoftKeyboardListener = listener;
}
public interface OnSoftKeyboardListener {
public void onShown();
public void onHidden();
}
}
Этот макет прослушивает измерение изменений, и если новые измерения являются < чем старые, это означает, что часть экрана съедена мягкой клавиатурой.
Хотя для его работы в вашем манифесте вам нужно установить android:windowSoftInputMode="adjustResize"
, чтобы содержимое было изменено и не просто сдвинуто.
И вся система работает следующим образом: У вас есть макет:
<MyLayout id="layout">
<SomeImage id="image"/>
<SomeText>
<SomeInput>
</MyLayout>
Это похоже на экран входа в систему evernotes. Затем в вашей деятельности:
((MyLayout)findViewById(R.id.layout)).setOnSoftKeyboardListener(new OnSoftKeyboardListener() {
@Override
public void onShown() {
findViewById(R.id.image).setVisibility(View.GONE);
}
@Override
public void onHidden() {
findViewById(R.id.image).setVisibility(View.VISIBLE);
}
});
Затем перейдите в manifest.xml и установите
android:windowSoftInputMode="adjustResize"
Что произойдет, когда появится мягкая клавиатура, она скроет изображение и изменит размер остальной части контента. (Фактически вы видите, как изменяется текст в Evernote)
Скрыть изображение, конечно, одно из многих вещей, которые вы можете сделать. Но вы должны быть осторожны, так как различные изменения макета также вызывают onMeasure.
Конечно, это грязный вариант. Вам нужно проверить изменения ориентации и правильное время, когда вы действительно выполняете измерения, а может быть, и более логично при сравнении новых спецификаций со старыми. Но я думаю, что это единственный способ сделать это.