SeekBar в NavigationDrawer

Я хочу использовать панель поиска в панели навигации

По сути, мне нужно скользить влево и вправо, чтобы установить панель поиска, и, ну, как вы уже догадались, она скользит по панели навигации...

Что я хотел бы сделать, так это сдвинуть панель поиска, когда она сфокусирована, и навигационный ящик, когда это не так.

Как мне это сделать?

Вот мой код при установке элемента (я еще не установил панель поиска)

private View onCritereView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

    View mView = inflater.inflate(R.layout.fragment_critere, container, false);
    LinearLayout mLinearLayout = (LinearLayout) mView.findViewById(R.id.critere_linearlayout);

    View mViewElement = inflater.inflate(R.layout.item_critere, null);
    ((TextView)mViewElement.findViewById(R.id.critere_title)).setText("Prix Maximum");

    mLinearLayout.addView(mViewElement);

    return mView;
}

Вот item_critere.xml с панелью поиска:

<?xml version="1.0" encoding="utf-8"?>
<TableLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/critere_item"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:stretchColumns="*">

    <TableRow
            android:layout_width="fill_parent"
            android:layout_height="fill_parent">

        <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:textAppearance="?android:attr/textAppearanceMedium"
                android:text="Large Text"
                android:id="@+id/critere_title"
                android:layout_gravity="left|center_vertical"
                android:layout_column="0"/>

        <SeekBar
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:id="@+id/critere_qualifier"
                android:layout_column="1"
                android:layout_span="4"/>
    </TableRow>

    <TableRow
            android:layout_width="fill_parent"
            android:layout_height="fill_parent">

        <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:textAppearance="?android:attr/textAppearanceSmall"
                android:text="Medium Text"
                android:id="@+id/critere_value"
                android:layout_span="4"/>
    </TableRow>

</TableLayout>

Заранее спасибо :)


person nsvir    schedule 23.08.2013    source источник


Ответы (2)


Просто добавьте onTouchListener. При касании экрана на панели поиска (action_down) запретить родителю перехватывать событие.

seekbar.setOnTouchListener(new ListView.OnTouchListener() 
{
    @Override
    public boolean onTouch(View v, MotionEvent event) 
    {
        int action = event.getAction();
        switch (action) 
        {
        case MotionEvent.ACTION_DOWN:
            // Disallow Drawer to intercept touch events.
            v.getParent().requestDisallowInterceptTouchEvent(true);
            break;

        case MotionEvent.ACTION_UP:
            // Allow Drawer to intercept touch events.
            v.getParent().requestDisallowInterceptTouchEvent(false);
            break;
        }

        // Handle seekbar touch events.
        v.onTouchEvent(event);
        return true;
    }
});
person dumazy    schedule 23.08.2013
comment
На самом деле это было скопировано для использования ListViews внутри ScrollView. Так что это новый SeekBar.OnTouchListener вместо ListView.onTouchListener. Это действительно простой способ, и он работает для многих подобных проблем. - person dumazy; 23.08.2013
comment
Хорошо, теперь сложнее .. x) Я добавил прокрутку между панелью навигации и панелью поиска. Я хочу отключить только событие interceptTouch навигационного ящика, а не прокрутку x) Возможно ли это? - person nsvir; 23.08.2013
comment
Итак, у вас в ящике есть вертикальная полоса прокрутки с горизонтальными полосами поиска, верно? - person dumazy; 23.08.2013
comment
Я думаю, что это должно работать нормально, без необходимости дальнейшей реализации. Если вы коснетесь панели поиска, событие будет перехвачено только для панели поиска. Если вы коснетесь где-нибудь еще в прокрутке, все пойдет так, как должно. - person dumazy; 23.08.2013
comment
Arf nop:/ Прокрутка работает с навигационным ящиком. Он различает горизонтальное/вертикальное движение. Но на панели поиска горизонтальное движение не фиксируется ни на панели поиска, ни на панели навигации. - person nsvir; 23.08.2013
comment
нет необходимости обрабатывать событие, оно работает без него. Также какова цель этого `v.onTouchEvent(event);`? - person Muhammad Babar; 13.02.2015

Используйте 1_

вместо ViewParent.requestDisallowInterceptTouchEvent.

В @dumazy ответ requestDisallowInterceptTouchEvent решает эту проблему, но также создает другую.

Во время прокрутки панели навигации. Если коснуться SeekBar, сработает OnSeekBarChangeListener. Таким образом, событие прокрутки прервется, и прогресс панели поиска начнет меняться при перемещении пальца.

Я немного изменил исходный ответ, чтобы решить эту проблему, используя DrawerLockMode:

mSeekBar.setOnTouchListener(new SeekBar.OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        int action = event.getAction();
        switch (action) {

            case MotionEvent.ACTION_DOWN:
                // Disallow Drawer to intercept touch events.
                // v.getParent().requestDisallowInterceptTouchEvent(true);
                mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_OPEN);
                break;

            case MotionEvent.ACTION_UP:
            case MotionEvent.ACTION_CANCEL:
                // Allow Drawer to intercept touch events.
                // v.getParent().requestDisallowInterceptTouchEvent(false);
                mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNDEFINED);
                break;
        }

        // Handle SeekBar touch events.
        v.onTouchEvent(event);
        return true;
    }
});
person S.R    schedule 12.07.2019