gpt4 book ai didi

android - 第一次触摸被忽略?

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:43:30 25 4
gpt4 key购买 nike

我正在研究闹钟。作为其中的一部分,我有一个 IntentService,它会在警报实际响起时启动一个 Activity 。在 Activity 的 onCreate 中,我唤醒屏幕,获取唤醒锁,强制 Activity 进入全屏,并播放声音。这是 onCreate 中的所有内容:

super.onCreate(savedInstanceState);

// Get Alarm ID from the extras
Bundle extras = getIntent().getExtras();
int id = extras.getInt("AlarmID", -1);

// Get Alarm info from the DB
DB = new DatabaseHelper(this);
alarm = DB.getAlarm(id);

if (alarm == null || !alarm.isEnabled()) finish();

getWindow().requestFeature(Window.FEATURE_ACTION_BAR);
setContentView(R.layout.activity_alarm);

// My root view
View contentView = findViewById(R.id.fullscreen_content);

// Hide action bar for full screen
ActionBar bar = getActionBar();
if (bar != null) bar.hide();
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);

// Hide nav bar
mSystemUiHider = SystemUiHider.getInstance(this, contentView, HIDER_FLAGS);
mSystemUiHider.setup();
mSystemUiHider.hide();

// Show over lock screen
getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);

// Wake up screen
PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
wakeLock = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP, "MyWakeLock");
wakeLock.acquire();

// Get UI Elements
TextView time = (TextView)findViewById(R.id.Time);
TextView name = (TextView)findViewById(R.id.SmallAlarmName);

// Fill UI Elements
time.setText(Alarm.FormatTime(alarm.getHour(), alarm.getMinute()));
name.setText(alarm.getName());

// Play selected ringtone
tone = RingtoneManager.getRingtone(this, alarm.getSound());
tone.setStreamType(RingtoneManager.TYPE_ALARM);
tone.play();

View 相当简单:2 个 TextView 用于显示时间和闹钟名称,2 个可点击的 ImageView 用于暂停和禁用。

我遇到的问题是,我第一次触摸屏幕时没有任何反应。两个 ImageView 都以 Log.i 开头,所以我知道如果事件触发,我何时推送它。第一次推送时,没有日志输出。在第二次推送时,将触发适当的 ImageView 事件。创建 Activity 时屏幕最初是打开还是关闭并不重要,第一次触摸会被重复忽略。发生了什么事,我该如何解决才能使第一次触摸按预期工作?

我正在我的 Nexus 5、4.4.3、Rooted、stock rom、Xposed Framework 上进行测试(但没有会影响我的应用程序的模块)。由于需要使用铃声(VM 没有铃声),我无法真正在虚拟机中进行测试。

另外,为了记录,第一次点击没有其他日志发生。我不知道手机认为我在窃听什么。

编辑:我认为这与旗帜有关。我注意到我在调用 getWindow().setFlags(...) 时调用了 setFlags 而不是 addFlags。相反,我将其更改为 addFlags 并尝试将其更改为:

int flags = WindowManager.LayoutParams.FLAG_FULLSCREEN |
WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON |
WindowManager.LayoutParams.FLAG_TOUCHABLE_WHEN_WAKING |
WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED;
getWindow().addFlags(flags);

但没有变化。

有什么方法可以判断什么可能拦截了第一次点击?

我尝试在 onCreate 的末尾设置一个断点并不断单步执行,直到它最终等待事件发生,但即使在这种状态下,第一次点击也不会在调试器中进行更改。第二次点击我的一个 ImageView 将按预期在我的点击处理程序内的第一行停止调试器。

编辑 2:我想我正在做某事。我正在通过过滤器查看 logcat,只看到与我的应用程序相关的内容。我尝试在没有过滤器的情况下查看 logcat,并且能够在第一次点击时可靠地获取这些类型的消息:

06-12 23:28:04.437      812-844/? W/InputEventReceiver﹕ Attempted to finish an input event but the input event receiver has already been disposed.

第一次点击会响应其中两个警告。第一次点击后的额外点击不会发出此类警告,我的处理程序将按预期执行。

快速搜索返回 this question但对我的情况没有帮助。不仅仅是警告,我认为这可能是第一次点击被忽略的根本原因。但是,我仍然不知道如何修复它。

最佳答案

不确定这是否是答案或它有多普遍,但是..我通过删除这些标志以某种方式设法为我解决了这个问题:

getWindow().getDecorView().setSystemUiVisibility(
View.SYSTEM_UI_FLAG_LAYOUT_STABLE
//| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
//| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);

我只能推测这 2 个标志导致第一次触摸无知的原因。也许是与这些标签相关的“沉浸式模式”,因为它应该(并且确实)自己隐藏导航,所以它可能以某种方式在引擎盖下发生冲突..我不知道:-)

关于android - 第一次触摸被忽略?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24177391/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com