0

我有一个 Android 应用程序(全屏、横向),我有两个视图,一个是FrameLayout始终可见的,一个是LinearLayout. 我立即将可见性设置LinearLayoutView.GONE。当用户点击 上的按钮时,我在toFrameLayout上设置了可见性,并使用来在中的 an 上显示软输入。这导致两个视图都向上移动,使得 EditText 位于键盘上方的屏幕上。这一切都很好。LinearLayoutview.VISIBLEInputMethodManagerEditTextLinearLayout

当我关闭软输入时出现问题。在同一个回调中,我将LinearLayout(使用EditText)的可见性设置为View.GONE,而我看到的是 FrameLayout 卡在屏幕顶部(它不会向下移动)。如果我不 GONE-ize LinearLayout,两个视图都可以向下移动。

我可以通过在将可见性设置为 之前启动计时器等待来解决此问题GONE,但我不应该这样做;应该有一些我可以持续收到的通知,表明我什么时候可以隐藏LinearLayout.

我尝试过的事情:hideSoftInputFromWindow使用ResultReceiver(结果接收器回调立即被很好地调用(即在键盘实际消失之前),视图 GONEd 太快,同样的问题),覆盖 onLayout LinearLayout(当软输入时不会被调用上下移动视图),覆盖其他View“开”。

另一个真正令人讨厌的事情是这个问题似乎是我的手机独有的 - 运行 Android 4.0.4 的 AT&T 三星 Galaxy SII Skyrocket(可能带有一些三星修改)。我无法在 4.0.3 模拟器上进行复制,其他任何人也无法在具有其他 Android 版本的其他设备上进行复制。

有任何想法吗?

4

1 回答 1

0

您将不得不编写自己的触摸事件处理程序。这是一个示例,当软输入被隐藏时,将向下滑动整个 frameLayout 视图。如您所见,调用超级处理程序并将我们的代码包装在 textEdit 小部件的测试中是很重要的。如果您想查看计算结果,请取消注释调试记录器代码。

    @Override
public boolean dispatchTouchEvent(MotionEvent event) {

    View v = getCurrentFocus();
    boolean ret = super.dispatchTouchEvent(event);

    if (v instanceof EditText) {
        View w = getCurrentFocus();

        int scrcoords[] = new int[2];
        w.getLocationOnScreen(scrcoords);
        float x = event.getRawX() + w.getLeft() - scrcoords[0];
        float y = event.getRawY() + w.getTop() - scrcoords[1];

        // Log.d("Activity",
        // "Touch event "+event.getRawX()+","+event.getRawY()+" "+x+","+y+" rect "+w.getLeft()+","+w.getTop()+","+w.getRight()+","+w.getBottom()+" coords "+scrcoords[0]+","+scrcoords[1]);
        if (event.getAction() == MotionEvent.ACTION_UP
                && (x < w.getLeft() || x >= w.getRight() || y < w.getTop() || y > w
                        .getBottom())) {

            InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
            imm.hideSoftInputFromWindow(getWindow().getCurrentFocus()
                    .getWindowToken(), 0);
        }
    }

    return ret;

}
于 2017-01-24T16:48:20.873 回答