键盘存在时防止抽屉菜单显示? (Android Appcelerator)

时间:2017-10-02 11:42:01

标签: android titanium appcelerator

我想阻止用户在键盘存在时打开导航抽屉菜单。我尝试将“focus”和“blur”监听器添加到TextField:

$.searchField.addEventListener('focus', function(e) {
    Ti.API.info('locked drawer');
    $.drawerLayout.drawerLockMode = Titanium.UI.Android.DrawerLayout.LOCK_MODE_LOCKED_CLOSED;
});

$.searchField.addEventListener('blur', function(e) {
    Ti.API.info('unlocked drawer');
    $.drawerLayout.drawerLockMode = Titanium.UI.Android.DrawerLayout.LOCK_MODE_UNLOCKED;
});

但是你可以看到没有任何事情发生:

2 个答案:

答案 0 :(得分:1)

我使用 NL Fokke Drawer Widget 完成了类似的工作。

使用这个小部件,我创建了这样的窗口:

<强> XML:

<Alloy>
  <Widget id="drawer" src="nl.fokkezb.drawer">
    <View module="xp.ui" role="leftWindow">

    </View>

    <NavigationWindow module="xp.ui" platform="ios" role="centerWindow">
        <Window>
            <Require src="homeView"></Require>
        </Window>
    </NavigationWindow>

    <Window module="xp.ui" platform="android" role="centerWindow">
        <Require src="homeView"></Require>
    </Window>
</Widget>

<强> JS:

// to close the drawer   
$.drawer.instance.setDrawerLockMode($.drawer.module.LOCK_MODE_UNLOCKED);

// to unlock the drawer
$.drawer.instance.setDrawerLockMode($.drawer.module.LOCK_MODE_LOCKED_CLOSED);

如果你没有使用这个小部件,那么我相信你可以将你的代码与这个小部件的代码和&amp;看看它是如何设置锁定模式的。

答案 1 :(得分:-1)

将此代码添加到您的活动

    @Override
public boolean dispatchTouchEvent(MotionEvent ev) {
    View v = getCurrentFocus();
    if (v != null &&
            (ev.getAction() == MotionEvent.ACTION_UP || ev.getAction() == MotionEvent.ACTION_MOVE) &&
            v instanceof EditText &&
            !v.getClass().getName().startsWith("android.webkit.")) {
        int scrcoords[] = new int[2];
        v.getLocationOnScreen(scrcoords);
        float x = ev.getRawX() + v.getLeft() - scrcoords[0];
        float y = ev.getRawY() + v.getTop() - scrcoords[1];
        if (x < v.getLeft() || x > v.getRight() || y < v.getTop() || y > v.getBottom())
            hideKeyboard(this);
    }
    return super.dispatchTouchEvent(ev);
}

public void hideKeyboard(Activity activity) {
    if (activity != null && activity.getWindow() != null && activity.getWindow().getDecorView() != null) {
        InputMethodManager imm = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.hideSoftInputFromWindow(activity.getWindow().getDecorView().getWindowToken(), 0);
    }
}