I want to listen to ScrollView to see if it scrolls. I used OnTouchListener, it works well. But when I want to add trackball compatibility using OnKeyListener or overriding the OnKeydown method, it won't work. Focus buttons seem to be causing problems.
Any solution or workaround to solve this problem? Any help is appreciated.
Here are some demo codes to reproduce my problem:
public class TestActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); ScrollView scrollView = (ScrollView) findViewById(R.id.scroll_view); LinearLayout mainLayout = (LinearLayout) findViewById(R.id.main_layout); LinearLayout.LayoutParams wrapParams = new LinearLayout.LayoutParams( ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT); for (int i = 0; i < 100; i++) { MyItem item = (MyItem) LayoutInflater.from(this).inflate(R.layout.item, null); item.setParent(scrollView); item.setBackgroundColor(Color.WHITE); item.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT)); mainLayout.addView(item, wrapParams); } scrollView.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) {
main.xml:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical"> <com.fannyxie.MyScroller android:id="@+id/scroll_view" android:layout_width="fill_parent" android:layout_height="wrap_content" android:descendantFocusability="beforeDescendants" android:clickable="true" android:focusable="true"> <LinearLayout android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical"> <LinearLayout android:id="@+id/main_layout" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical"> </LinearLayout> </LinearLayout> </com.fannyxie.MyScroller> </LinearLayout>
item.xml:
<?xml version="1.0" encoding="utf-8"?> <com.fannyxie.MyItem xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical"> <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="TITLE"/> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/myButton" android:text="Button"></Button> </com.fannyxie.MyItem>
MyScroller.java
public class MyScroller extends ScrollView { public MyScroller(Context context, AttributeSet attrs) { super(context, attrs); } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { //not go into here... Log.i("MyScroller", "onKeyDown"); return super.onKeyDown(keyCode, event); } @Override public boolean onTrackballEvent(MotionEvent event) { //not go into here... Log.i("MyScroller", "onTrackballEvent"); return super.onTrackballEvent(event); } @Override protected boolean onRequestFocusInDescendants(int direction, Rect previouslyFocusedRect) { //some times go into here, when no button get the focus when entering first time Log.i("MyScroller", "request focus in descendants"); return super.onRequestFocusInDescendants(direction, previouslyFocusedRect); } }
Myitem.java
public class MyItem extends LinearLayout { private Button myButton; public MyItem(Context context, AttributeSet attrs) { super(context, attrs); } @Override protected boolean onRequestFocusInDescendants(int direction, Rect previouslyFocusedRect) {