滚动前:
滚动期间:
我在滚动过程中的期望:
我对 HorizontalScrollView 有疑问。当我从此视图中选择一个元素时,我通过调用将焦点设置到该元素:
else if (v.getParent() == candidatesScrollView.getChildAt(0))
{
Button candidateButton = (Button) v;
v.requestFocusFromTouch();
v.setSelected(true);
(...)
}
之后,当我滚动列表而不选择其他元素时,我失去了先前选择的元素的焦点。我对这个主题进行了一些研究,但没有适合我的解决方案......如何滚动我的 HorizontalScrollList 而不会失去所选元素的焦点?任何帮助表示赞赏。自从我提出这个问题以来已经大约 14 天了,但仍然没有找到解决方案。请帮忙。
这是我的 XML 的一部分:
<HorizontalScrollView
android:id="@+id/CandidatesHorizontalScrollView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_above="@+id/linearLayout2"
android:clickable="false"
android:focusable="false"
android:focusableInTouchMode="false"
android:visibility="gone" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clickable="false"
android:focusable="false"
android:focusableInTouchMode="false"
android:orientation="horizontal" >
<Button
android:id="@+id/horizontalscrollview1_button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button"
android:textSize="25sp" />
(...)
// 11 more buttons
</LinearLayout>
</HorizontalScrollView>
更新
我当前的解决方案#1(无法正常工作): 滚动后,然后再次滚动(例如向后滚动),滚动从所选元素开始。
我创建了自定义 HorizontalScrollView 类,其中我覆盖了 onTouchEvent() 方法。我不认为这是这样做的最佳方式,因为在这种情况下,我每次移动一个像素时都必须进行计算。例如,如果我将 toast.show() 添加到下面的方法中,它将尝试显示与我移动像素一样多的 toast(如果我移动 10 个像素,它将尝试显示 10 个 Toast)。无论如何,它对我有用,并且选择和重点保持不变。
请帮助我修改此代码,以便最终为该已知问题提供一个好的答案:
@Override
public boolean onTouchEvent(MotionEvent ev)
{
int i = 0;
Button button = null;
for (; i < 11; i++)
{
button = (Button)((LinearLayout)getChildAt(0)).getChildAt(i);
if(button.isSelected())
break;
}
super.onTouchEvent(ev);
button.setSelected(true);
button.requestFocusFromTouch();
return true;
}
为了确保上面的代码能够正常工作,你需要在你的 HorizontalScrollView 中一次只选择一个项目,即当你按下不同的按钮时,你需要将前一个设置为 setSelected(false)
我当前的解决方案#2(无法正常工作):
我尝试实施的解决方案#2,认为第一个不够优雅,涉及到手势检测器的使用。在我的自定义 HorizontalListView 类中,我添加了以下代码:
构造函数:
public MyHorizontalScrollView(Context context, AttributeSet attrs) {
super(context, attrs);
this.context = context;
gestureDetector = new GestureDetector(context, new MyHorizontalScrollViewGestureDetector());
this.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
gestureDetector.onTouchEvent(event);
return true;
}
});
// TODO Auto-generated constructor stub
}
MyHorizontalScrollViewGestureDetector 内部类:
public class MyHorizontalScrollViewGestureDetector extends SimpleOnGestureListener
{
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY)
{
//Here code similar like that one in solution #1
//But the View is not scrolling, even without that code
super.onScroll(e1, e2, distanceX, distanceY);
return true;
}
}
但是,该列表不会随着该解决方案滚动。我可以添加到 onScroll 方法:
ScrollBy((int)positionX, (int)positionY);
这使得列表会滚动,但不是很好,它有时会冻结。我想知道为什么超级不调用滚动。方法。
我当前的解决方案#3(工作,但它是走动):
因为解决方案 1 和 2 都不起作用,所以我决定不再专注于玩。我现在所做的是,每当我单击它以及每次更改为不同的 Button 时都更改 Button Drawable。我使用与用于聚焦按钮(Holo)相同的 Drawable。在那种情况下,我不必担心在 HorizontalScrollView 中滚动。这个解决方案是一种临时解决方案,所以我期待任何评论、建议和编辑。