我正在编写一个Android视图(Android 12)。
我有一个带有editText控件的linearlayout。
我想在软键盘输出时更改linearlayout背景图像,并在隐藏键盘时再次更改。
我试图在每个editText上设置一个焦点监听器,但它无济于事。
我怎样才能做到这一点?
答案 0 :(得分:1)
试试这个:
final View activityRootView = findViewById(R.id.activityRoot);
activityRootView.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
Rect r = new Rect();
//r will be populated with the coordinates of your view that area still visible.
activityRootView.getWindowVisibleDisplayFrame(r);
int heightDiff = activityRootView.getRootView().getHeight() - (r.bottom - r.top);
heightDiff = convertPixelsToDp(heightDiff , this);
if (heightDiff > 100) { // if more than 100 pixels, its probably a keyboard...
... do something here
}
}
});
中的详情
用于在所有设备中更改heightDiff到dp,并使用它并使用以下方法更改它:
public static float convertPixelsToDp(float px, Context context){
Resources resources = context.getResources();
DisplayMetrics metrics = resources.getDisplayMetrics();
float dp = px / (metrics.densityDpi / 160f);
return dp;
}
答案 1 :(得分:0)
首先,在布局中添加一个ID:
android:id="@+id/view"
例如:
<LinearLayout
android:id="@+id/view"
android:layout_width="match_parent"
android:layout_height="match_parent" >
然后使用this问题中的此代码来确定软键盘是否可见。您应该将其放在onCreate
方法中。
final View root = findViewById(R.id.view);
root.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
int heightDiff = root.getRootView().getHeight() - root.getHeight();
if (heightDiff > 100) { // more than 100 pixels is probably a keyboard
// keyboard is shown
layout.setBackground(getResources().getDrawable(R.drawable.idOfPic));
} else {
// keyboard is not shown
layout.setBackground(getResources().getDrawable(R.drawable.otherPic));
}
}
});
注意取决于您的布局(根据我自己的经验说),if (heightDiff > 100)
可能需要更改。它可能是if (heightDiff > 150)
或其他东西;像素高度是任意的。
不幸的是,没有真正的方法来确定软键盘是否可见(荒谬)。这是最好的方法。