سؤال

وأود أن إنشاء صورة/فيديو القبض على التطبيق.

لقد خلق CaptureView الطبقة التي تمتد SurfaceView ووضعها في النموذج الرئيسي.

الشكل الرئيسي هو النشاط onCreateOptionsMenu() الأسلوب الذي يخلق القائمة.القائمة تعمل بشكل جيد ولكن بعد ذلك حاولت تطبيق الطريقة onKeyDown:

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {

    if(event.getAction() == KeyEvent.ACTION_DOWN) {
        switch(keyCode) {
        case KeyEvent.KEYCODE_CAMERA:
            videoPreview.TakePicture();
            return true;
        }
    }

    return super.onKeyDown(keyCode, event);
}

القائمة لم تظهر بعد عن طريقة لا يصاب onKeyDown الحدث.

لا أحد يعرف ماذا يمكن أن يكون سبب هذه المشكلة ؟

هل كانت مفيدة؟

المحلول

لقد وجدت أنني كنت أعود true لجميع الأحداث، حيث يجب أن أعود بها فقط للحصول على الكود الذي كنت أستخدمه. انتقلت العودة الحقيقية داخل نطاق if بيان وعادت false خلاف ذلك جلبت قادتي مرة أخرى!

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    super.onKeyDown(keyCode, event);
    if (keyCode == KeyEvent.KEYCODE_BACK) {
        dba.close();
        Intent result = new Intent("Complete");
        setResult(Activity.RESULT_OK, result);
        finish();
        return true;
    }
    return false;
}

نصائح أخرى

كان لدي مشكلة مماثلة وحلها عن طريق إضافة

this.requestFocus();
this.setFocusableInTouchMode(true);

في منشئ فرعية Subclass سفلي.

لقد حلت إزالة بيان IF، مثل هذا:

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    switch(keyCode)
    {
        case KeyEvent.KEYCODE_CAMERA:
            videoPreview.TakePicture();
            return true;
    }
    return super.onKeyDown(keyCode, event);
}

أنا لا أعرف لماذا في بعض الأحيان أنها لا تعمل ، على الرغم من واحدة من بلدي تطبيقات هذا keyDown() هو يعمل بشكل جيد و مرة أخرى عندما كنت استخدام التطبيق الجديد ثم لا يعمل.

ولكن لدي الحل الذي يعمل دائما:

@Override
public boolean dispatchKeyEvent (KeyEvent event) {
    if (event.getAction()==KeyEvent.ACTION_DOWN && event.getKeyCode()==KeyEvent.KEYCODE_BACK) {
        Toast.makeText(this, "Back button pressed", Toast.LENGTH_LONG).show();
        return true;
    }
    return false;
}

لقد قمت بحل هذا عن طريق إضافة إلى منشئ هذا الرمز:

setFocusable(true);
requestFocus();

شكرًا، ciryon.

أيضا في كل مرة أستخدمها setContentView(myView); يجب أن أتصل myView.requestFocus();. وبعد إذا كان هناك حل أفضل من فضلك قل لي.

حسنا، عند النظر إلى وثائق API الشيء الوحيد الذي يبرز هو أن الروبوت: يجب تعيين السمة القابلة للنقر وكذلك العرض الذي يتم تمكينه للحصول على طريقة OnkeyDown (...) للعمل.

يمكنك تجربة هذا

this.setFocusable(true);

نشاطك يمكن أن يأكل الحدث الرئيسي. تجاوز OnkeyDown في النشاط ورمي نقطة توقف هناك.

أيضا: عندما تقول أنك "وضعتها في النموذج الرئيسي" هل تستخدم تخطيط XML أو القيام به في التعليمات البرمجية الخاصة بك؟

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top