スクロール前:
スクロール中:
スクロール中に期待すること:
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(正しく機能しない): スクロールしてから再度スクロールすると(たとえば、スクロールバック)、選択した要素からスクロールが開始されます。
onTouchEvent() メソッドをオーバーライドするカスタム HorizontalScrollView クラスを作成しました。その場合、1ピクセルでも移動するたびに計算を行う必要があるため、これが最適な方法だとは思いません。たとえば、以下のメソッドに toast.show() を追加すると、移動したピクセルと同じ数のトーストを表示しようとします (10 ピクセル移動すると、10 個のトーストを表示しようとします)。とにかく、それは私にとってはうまくいき、選択と集中が保たれています.
このコードを修正して、最終的にその既知の問題に対する適切な回答を作成するのを手伝ってください:
@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 で一度に 1 つの項目のみを選択する必要があります。つまり、別のボタンを押したときに、前の項目を 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 Drawable を変更することです。フォーカス ボタン (Holo) と同じ Drawable を使用します。その場合、HorizontalScrollView でのスクロールについては心配する必要はありません。この解決策はある種のウォークアラウンドであるため、コメント、提案、編集をお待ちしています。