【问题标题】:Is there a way to enter touchmode programatically?有没有办法以编程方式进入触摸模式?
【发布时间】:2012-05-07 18:42:48
【问题描述】:

所以我有一个有趣的问题。我有一个 ListView,我想在方向更改时保持准确的行选择和 yoffset。因此我称之为:

list.postDelayed(new Runnable() {
        @Override
        public void run() {
            list.requestFocusFromTouch();
            list.setSelectionFromTop(finalPosition, yoffset);
        }
    },100);

看起来很简单,而且效果很好。问题是当我改变方向两次(回到原来的方向,即横向->纵向->横向)时,列表退出了TouchMode,即list.isInTouchMode()返回false(在第一次方向改变时,列表.isInTouchMode() 返回 true,一切都很好,点击工作等)。因此,当您使用 setSelectionFromTop() 以编程方式滚动列表视图并单击列表中的项目而不先触摸应用程序中的其他位置时,列表会跳转并滚动到我单击的位置,突出显示错误的项目。这很烦人,我似乎找不到解决办法。欢迎任何想法和建议。

调用 list.requestFocusFromTouch() 似乎对设置 TouchMode 没有影响。

更多信息: Android:To set an item as selected when the ListView opens?

我发现了 Romain Guy 的帖子“每当你触摸屏幕,在手机的任何位置,你都会进入 touch 所有应用程序的模式。这是期望和期望的 行为。 " http://groups.google.com/group/android-developers/browse_thread/thread/590b02939d14675b/077ad77e4217e56e?lnk=gst&q=[android]+scroll+listview+not+in+touchmode#077ad77e4217e56e

我想要做的就是以某种方式进入 TouchMode 而不强迫用户在第二次方向改变时实际触摸设备。我曾多次尝试 list.dispatchTouchEvent() 。我可能发送了错误的运动事件:

list.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), 
    SystemClock.uptimeMillis(), MotionEvent.ACTION_DOWN , 
    list.getWidth(), list.getHeight(), 0));
list.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), 
    SystemClock.uptimeMillis(), MotionEvent.ACTION_MOVE , 
    list.getWidth(), list.getHeight(), 0));
list.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), 
    SystemClock.uptimeMillis(), MotionEvent.ACTION_UP , 
    list.getWidth(), list.getHeight(), 0));

另一种选择是找出我们不再处于 TouchMode 的原因。我没有覆盖 onConfigurationChanged() 所以布局会在每次方向改变时完全重建。

提前致谢!

贾里德

【问题讨论】:

  • 顺便说一句,我为我提交的代码的丑陋间距道歉。 Stackoverflow 有一个奇怪的格式限制。 - 我设法解决了间距问题。现在看起来更正常了。 =)
  • 澄清一下,您的列表视图是否设置为使用 CHOICE_MODE_SINGLE 以便保留最近选择的项目?
  • 是的,但是在方向更改时会重新创建整个视图。我尝试将选择模式更改为所有可能的选项,但没有效果。

标签: android listview android-layout


【解决方案1】:

尝试使用 Listview 的 setItemChecked(...) 方法。我已经看到当 Listview 设置为 CHOICE_MODE_SINGLE 时使用了相当多的方法,因为该模式确实使每个 listview 项目成为可检查的对象。

还请查看以下 QA,其中有人试图做类似的事情。似乎最简单的解决方案是为“选中”项目创建不同的背景。

Android listview array adapter selected

【讨论】:

  • Unfort 似乎没有任何效果。我不是想改变所选项目的背景,我想要正常的点击行为。 IE 我显示一个列表,单击一个列表项,列表项选择器背景显示在正确的项目上,然后我处理单击。问题在于,在第二次方向更改时,列表认为它仍位于默认位置(选定项目 0),即使它已滚动到其他位置。因此,当我单击列表中的任何项目时,尽管单击由正确的列表项处理,但列表会跳转。
猜你喜欢
  • 2013-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-02
  • 2021-08-28
  • 1970-01-01
相关资源
最近更新 更多