硬件Enter键打开DrawerLayout(不必要)

时间:2016-10-23 18:14:37

标签: android barcode-scanner

我正在处理一个处理条形码读取的应用程序,并返回属于条形码的产品信息。

在我的一个片段上,我有一个EditText,您可以手动输入条形码,也可以使用阅读器,如果文本框获取并输入keydown,它会启动数据请求,这样可以正常工作。

这是我的问题,我有另一个片段,但是这个没有EditText,我不想添加一个,但我仍然希望处理条形码请求。

我解决它的方式,这属于MainActivity:

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_ENTER) {
        Log.v("MainActivity: ", "Enter");
        return true;
    }
    char unicodechar = (char)event.getUnicodeChar();
    Log.v("main", keyCode + " - " + unicodechar) ;
    Long timedifference = elapsedRealtime() - PreviousTime;
    if (timedifference > MIN_RESPONSE_TIME && Vonalkód.length() == 0) {
        Vonalkód.append(unicodechar);
    }
    if (timedifference < MIN_RESPONSE_TIME && Vonalkód.length() > 0) {
        Vonalkód.append(unicodechar);
    }

    cdt = new CountDownTimer(200, 20) { 
        @Override
        public void onTick(long l) {
        }

        @Override
        public void onFinish() {
            int tab = ((GlobalVars) getApplication()).get_activetab();
            ViewPager vp = (ViewPager) findViewById(R.id.viewpager);
            FragmentPagerAdapter fpa = (FragmentPagerAdapter) vp.getAdapter();
            if (tab == 0){ // Átvétel
                FragmentAruAtvetelMain frag = (FragmentAruAtvetelMain) fpa.instantiateItem(vp, tab);
                if (frag != null){
                    frag.myOnKeyDown(Vonalkód.toString());
                }

            }
            if (tab == 1){ // Átvételi lista
                FragmentAruAtvetelLista frag = (FragmentAruAtvetelLista) fpa.instantiateItem(vp, tab);
                if (frag != null){
                    frag.myOnKeyDown(Vonalkód.toString());
                }
            }
            Vonalkód = new StringBuilder();
        }
    }.start();

    PreviousTime = elapsedRealtime();

    return super.onKeyDown(keyCode, event);
}

我使用MainActivity捕获条形码阅读器的按键,如果200ms后没有任何新字符,我认为已经完成了。当前活动视图是一个带有2个选项卡的Tablayout。我知道哪个标签处于活动状态,并且我将MainActivity中的条形码文本发送到当前活动片段的方法。

这是我的MainActivity布局:

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
    android:orientation="vertical">

    <android.support.v7.widget.Toolbar
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@color/half_black"
        android:id="@+id/toolbar"
        android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
        app:title="KBRMobile" />

    <android.support.v4.widget.DrawerLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_height="match_parent"
        android:layout_width="match_parent"
        android:id="@+id/drawerLayout"
        >

        <FrameLayout
            android:orientation="vertical"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:id="@+id/containerView">
        </FrameLayout>

        <android.support.design.widget.NavigationView
            xmlns:android="http://schemas.android.com/apk/res/android"
            xmlns:app="http://schemas.android.com/apk/res-auto"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_gravity="start"
            android:id="@+id/NavView"
            app:itemTextColor="@color/black"
            app:menu="@menu/drawermenu"
            android:layout_marginTop="0dp"
            />
    </android.support.v4.widget.DrawerLayout>
</LinearLayout>

现在这是我的问题,如果我按下片段上的ENTER键,它会打开Drawerlayout。

这是条形码读取后我的调试日志的样子

(字符代码 - 实际的unicode):

V/main: 12 - 5
V/main: 16 - 9
V/main: 16 - 9
V/main: 14 - 7
V/main: 9 - 2
V/main: 9 - 2
V/main: 8 - 1
V/main: 14 - 7
V/main: 7 - 0
V/main: 8 - 1
V/main: 9 - 2
V/main: 9 - 2
V/main: 14 - 7
(this is where the ENTER key should be, but something "captured it", and opened the DrawerLayout)
V/Main:: 5997221701227

此时DrawerLayout已打开。如果我再次阅读条形码:

V/main: 12 - 5
V/main: 16 - 9
V/main: 16 - 9
V/main: 14 - 7
V/main: 9 - 2
V/main: 9 - 2
V/main: 8 - 1
V/main: 14 - 7
V/main: 7 - 0
V/main: 8 - 1
V/main: 9 - 2
V/main: 9 - 2
V/main: 14 - 7
V/MainActivity:: Enter
V/Main:: 5997221701227

当DrawerLayout打开时,OnKeyDown现在可以获取ENTER键。

所以在这之后,我的问题就是这样,甚至在它到达MainActivity的OnKeyDown之前捕获的是什么键?为什么ENTER键打开DrawerLayout,我该如何防止这种情况?我只想在结束时使用ENTER键捕获条形码,这样我就可以非常可靠地处理条形码读取过程。目前我对CountDownTimer不满意。

更新

如果你正在处理这个问题,这里有一些提示。

您要找的是:dispatchKeyEvent(KeyEvent事件)。此方法在到达窗口之前获取所有关键事件。

您有两种选择:

  1. requestFocus()在某些gui元素上,因此他们将使用Enter键
  2. 覆盖dispatcherKeyEvent并在整个activty中禁用enter键。

0 个答案:

没有答案