2011-01-17 2 views
4

Okey, поэтому я применил кнопку на скользящем ящике в приложении Android, которое я создаю. Единственная проблема заключается в том, что когда я нажимаю кнопку, весь скользящий выдвижной ящик нажат, и он выдвигается.Кнопки на скользящем ящике? - Android

Я знаю, что я могу отключить «нажмите, чтобы скользить вверх» в XML, но это, похоже, не работает, так как скользящий ящик все еще нажат без скольжения вверх.

Если я вызываю slideDrawer.lock(); функция фактически работает, но затем скользящий выдвижной ящик не может выдвинуться или даже нажат.

У кого-нибудь есть простое решение этой проблемы?

ответ

6

Если я хорошо понимаю, что вы добавили кнопки в свой дескриптор SlidingDrawer, и вы хотите, чтобы они работали как кнопки, когда пользователь нажимал их, сохраняя стандартное поведение SlidingDrawer при нажатии или перетаскивании дескриптора?

Я просто решил аналогичную проблему.

Моя Handle смотрела что-то вроде этого:

Capture of the layout

Он состоит из двух кнопок и центра TextView, который будет реальный дескриптор (реагирующий в качестве стандартного SlidingDrawer ручки).

Для того, чтобы кнопки работать независимо от SlidingDrawer я изменил немного исходный код в onInterceptTouchEvent метода стандартного класса SlidingDrawer.java (скопировать вставить исходный файл из андроида исходного кода):

public boolean onInterceptTouchEvent(MotionEvent event) { 
    //... 
    final Rect frame = mFrame; 
    final View handle = mHandle; 

    // original behaviour 
    //mHandle.getDrawingRect(frame); 

    // New code 
    View trackHandle = mTrackHandle; 
    // set the rect frame to the mTrackHandle view borders instead of the hole handle view 

    // getParent() => The right and left are valid, but we need to get the parent top and bottom to have absolute values (in screen) 
    frame.set(trackHandle.getLeft(), ((ViewGroup) trackHandle.getParent()).getTop(), trackHandle.getRight(), ((ViewGroup) trackHandle.getParent()).getBottom()); 



    if (!mTracking && !frame.contains((int) x, (int) y)) { 
     return false; 
    } 
    //... 
} 

Я также добавил сеттер для mTrackHandle атрибут установлен, при создании деятельности, реальный hanlde использовать:

protected void onCreate(Bundle savedInstanceState) { 
    //... 
    mSlidingDrawer.setTrackHandle((View) findViewById(R.id.menu_handle_TextView_Title)); 
    //... 
} 

После этого вы можете установить стандартный слушателя на ваших двух кнопок. Они будут работать как шарм.

+0

Это один путь :), который на самом деле работает. Есть ли возможность просто расширить базовый класс, а затем переопределить необходимые методы? –

+0

Что установленTrackHandle здесь? –

+0

Это метод, который я добавил в Android [SlidingDrawer] (http://developer.android.com/reference/android/widget/SlidingDrawer.html), чтобы можно было установить TrackHandle. По умолчанию используется только метод getHandle(). Чтобы добавить его, вам нужно подклассифицировать класс SlidingDrawer и добавить метод. –

2

в ответ на Joakim Engstrom: Да, это возможно! , чтобы сделать это, вам нужно переопределить onInterceptTouchEvent, как следует.

 @Override 
public boolean onInterceptTouchEvent(MotionEvent event) { 
    // TODO Auto-generated method stub 
    rect = new Rect(handle.getLeft(), ((View) handle.getParent()).getTop(), 
      handle.getRight(), ((View) handle.getParent()).getBottom()); 
    if (!rect.contains((int) event.getX(), (int) event.getY())) { 
     if (event.getAction() == MotionEvent.ACTION_UP) 
      this.lock(); 
     else 
      this.unlock(); 
     return false; 
    } else { 
     this.unlock(); 
     return super.onInterceptTouchEvent(event); 
    } 
} 

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

+0

Я пробовал вышеуказанный код, но он не делает кнопку swipable. У меня есть скользящий ящик, заполненный recyclerview, который, в свою очередь, имеет разные предметы. Мне нужно, чтобы весь дескриптор был прокручиваемым, а также кликабельным. Плз помоги мне. Я даже задал вопрос [здесь] (http://stackoverflow.com/questions/42652190/how-to-implement-swipe-able-button-in-sliding-drawer-handle), но ответа нет. – Ashu

Смежные вопросы