Android на TouchListener для всего диалога

У меня есть диалог для выбора файлов. Этот диалог содержит просмотр списка для отображения каталогов и файлов и имеет onItemClickListener для целей навигации.

Как я могу реагировать на события броска, чтобы подняться в структуре каталогов? Я попытался установить OnTouchListener в корневом RelativeLayout для отправки событий касания моему GestureListener:

    final GestureDetector detector = new GestureDetector(new MyGestureDetector(tvCurrentPath));     
        dialog.findViewById(R.id.rlFilelist).setOnTouchListener(new OnTouchListener() {
            public boolean onTouch(View view, MotionEvent e) {
                detector.onTouchEvent(e);
                return false;
            }
        });

События регистрируются в onTouch(), но метод onFling() никогда не вызывается в MyGestureDetector. Однако, если я присоединяю OnTouchListener к списку, он работает как положено. Проблема этого подхода заключается в том, что представление списка не всегда сильно заполняется данными, а когда оно пустое или при щелчке по элементам ниже, события onTouch () не инициируются.

Макет диалога:

    <?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/rlFilelist"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical"
    android:focusable="true" >    

    <RelativeLayout
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_above="@+id/llButtons" >

        <TextView
            android:id="@+id/tvCurrentPath"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="10dip"
            android:layout_marginRight="10dip" >
        </TextView>

        <ListView
            android:id="@+id/lvFileListing"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_above="@id/llButtons"
            android:layout_below="@id/tvCurrentPath" >
        </ListView>
    </RelativeLayout>

    <RelativeLayout
        android:id="@+id/llButtons"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_marginBottom="5dip"
        android:layout_marginTop="5dip" >

        <Button
            android:id="@+id/btAddDirectory"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentLeft="true"
            android:layout_marginRight="10px"
            android:text="@string/host_tv_dg_add_directory" />

        <Button
            android:id="@+id/btUp"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginRight="10px"
            android:layout_toRightOf="@id/btAddDirectory"
            android:text="@string/host_tv_dg_navigate_up" />

        <Button
            android:id="@+id/btClose"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_toRightOf="@id/btUp"
            android:text="@string/_tv_close" />
    </RelativeLayout>

</RelativeLayout>

Снимок экрана для диалога с не полностью заполненным lisview: http://imageshack.us/photo/my-images/802/dialog.png/

Как я могу сделать так, чтобы события onFling() запускались во всем диалоге или во "полном" просмотре списка, даже если он не полностью заполнен элементами?

Спасибо!

2 ответа

Решение

Вы должны создать класс, который расширяет класс диалога, а затем вы можете создать детектор жестов и присоединить его к событию класса. Вот пример кода:

public class GestureDialog extends Dialog {
    public GestureDialog (Context context, int theme) {
        super(context, theme);

        gestDetec = new MyGestureDetector();    //inital setup
        gestureDetector = new GestureDetector(gestDetec);   
        gestureListener = new View.OnTouchListener() {
            public boolean onTouch(View v, MotionEvent event) {
                if (gestureDetector.onTouchEvent(event)) {
                    return true;
                }
                return false;
            }
        };
    }
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        if (gestureDetector.onTouchEvent(event))
            return true;
        else
            return false;
    }
class MyGestureDetector extends SimpleOnGestureListener {
    @Override
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {

        System.out.println( "Help im being touched!" );
        return false;
    }
}

}

Вы можете взять один activity и установить это theme в манифесте dialog,

затем implements onTouchListener к этой деятельности и написать один onTouch() событие в этой деятельности.

Теперь у вас есть событие Touch для всего диалога:)

Другие вопросы по тегам