NEW ANSWER 添加于2012年1月25日
自从写下以下答案以来,有人让我了解到ViewTreeObserver和朋友,自版本1以来就一直潜伏在SDK中的API。
不需要自定义Layout类型,一种更简单的解决方案是为活动的根视图提供一个已知的ID,例如@+id/activityRoot,将GlobalLayoutListener挂接到ViewTreeObserver中,然后从中计算活动的视图根与窗口大小之间的大小差:
final View activityRootView = findViewById(R.id.activityRoot);activityRootView.getViewTreeObserver().addonGlobalLayoutListener(new onGlobalLayoutListener() { @Override public void onGlobalLayout() { int heightDiff = activityRootView.getRootView().getHeight() - activityRootView.getHeight(); if (heightDiff > dpToPx(this, 200)) { // if more than 200 dp, it's probably a keyboard... // ... do something here } }});
使用实用程序,例如:
public static float dpToPx(Context context, float valueInDp) { DisplayMetrics metrics = context.getResources().getDisplayMetrics(); return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, valueInDp, metrics);}
简单!
注意: 您的应用程序必须在Android Manifest中设置此标志,android:windowSoftInputMode=”adjustResize”否则以上解决方案将不起作用。
原始答案
是的,这是可能的,但它比应做的要难得多。
如果我需要关心键盘何时出现和消失(这是很常见的),那么我要做的就是将顶层布局类自定义为覆盖onMeasure()。基本逻辑是,如果布局发现自己填充的内容明显少于窗口的总面积,那么可能会显示软键盘。
import android.app.Activity;import android.content.Context;import android.graphics.Rect;import android.util.AttributeSet;import android.widget.LinearLayout;public class LinearLayoutThatDetectsSoftKeyboard extends LinearLayout { public LinearLayoutThatDetectsSoftKeyboard(Context context, AttributeSet attrs) { super(context, attrs); } public interface Listener { public void onSoftKeyboardShown(boolean isShowing); } private Listener listener; public void setListener(Listener listener) { this.listener = listener; } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int height = MeasureSpec.getSize(heightMeasureSpec); Activity activity = (Activity)getContext(); Rect rect = new Rect(); activity.getWindow().getDecorView().getWindowVisibleDisplayframe(rect); int statusBarHeight = rect.top; int screenHeight = activity.getWindowManager().getDefaultDisplay().getHeight(); int diff = (screenHeight - statusBarHeight) - height; if (listener != null) { listener.onSoftKeyboardShown(diff>128); // assume all soft keyboards are at least 128 pixels high } super.onMeasure(widthMeasureSpec, heightMeasureSpec);} }
然后在您的Activity类中…
public class MyActivity extends Activity implements LinearLayoutThatDetectsSoftKeyboard.Listener { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); ... LinearLayoutThatDetectsSoftKeyboard mainLayout = (LinearLayoutThatDetectsSoftKeyboard)findViewById(R.id.main); mainLayout.setListener(this); ... } @Override public void onSoftKeyboardShown(boolean isShowing) { // do whatever you need to do here } ...}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)