2010-09-12 5 views
26

Есть ли способ сделать выдвижной ящик слайдом сверху вниз?Android SlidingDrawer сверху?

+0

Вы можете посмотреть https://github.com/Ali-Rezaei/SlidingDrawer, что позволяет вам скользить с любой стороны. – Ali

ответ

7

По умолчанию SlidingDrawer класс не допускает этого. Вы можете использовать Panel класс здесь, чтобы получить что-то очень похожее, хотя: http://code.google.com/p/android-misc-widgets/

http://www.ohloh.net/p/android-misc-widgets

+1

Получали ли вы там панели? Мне очень сложно интегрировать эту панель, которая, кажется, очень крутая. Моя проблема здесь, если кто-то может ее просмотреть http://code.google.com/p/android-misc-widgets/issues/detail?id=9 Ошибка говорит: «Бинарная строка XML-файла # 15: атрибут контента требуется и должен ссылаться на действительного ребенка ». – OneWorld

+0

Мне пришлось обернуть виджет панели в макет фрейма, чтобы заставить его работать – OneWorld

+1

У топ-капельницы было нежелательное поведение: содержимое внизу было перемещено на дно. Я установил его так: <другие материалы ниже /> OneWorld

6

Я должен был сделать то же самое для одного из моих проектов, и я закончил писать свой собственный виджет для этого. Я назвал его SlidingTray теперь входит в мой открытый исходный код Aniqroid библиотека.

http://aniqroid.sileria.com/doc/api/ (Посмотрите для загрузки в нижней части или использовать проект Google Code, чтобы увидеть больше вариантов загрузки: http://code.google.com/p/aniqroid/downloads/list)

Документация класса здесь: http://aniqroid.sileria.com/doc/api/com/sileria/android/view/SlidingTray.html

+0

Я пробовал это, но когда я реализую его с помощью примера xml, я получаю «исключение nullpointer» в 'com.sileria.android.Resource.getIdentifier'. Хотелось бы воспользоваться этим. – Peterdk

+2

Упс, похоже, я забыл 'Kit.init()' ... Отлично работает сейчас! – Peterdk

+0

Также, если вы копируете/вставляете XML-пример из документации, это 'com.sileria.android.view.SlidingTray', а не' com.sileria.android.SlidingTray' – Fr4nz

30

Я нашел простой способ сделать это , Все, что вам нужно сделать, это установить поворот на 180º для скользящего устройства, содержимого и рукоятки. Это проще понять на примере, так что посмотрите, что я сделал:

Во-первых, я покажу вам мой старый SlidingDrawer, снизу вверх.

<SlidingDrawer xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/slidingDrawer" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:orientation="vertical" 
    android:gravity="center_horizontal" 
    android:handle="@+id/handle" 
    android:content="@+id/content"> 
    <ImageView android:id="@+id/handle" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:src="@drawable/ic_launcher" /> 
    <ImageView android:id="@+id/content" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:background="#FF0000" 
     android:src="@drawable/ic_launcher" /> 
</SlidingDrawer> 

Теперь посмотрим на изменения, которые я сделал, установив вращение 180º

<SlidingDrawer xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/slidingDrawer" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:orientation="vertical" 
    android:gravity="center_horizontal" 
    android:handle="@+id/handle" 
    android:content="@+id/content" 
    android:rotation="180"> 
    <LinearLayout android:id="@+id/handle" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content"> 
     <ImageView android:id="@+id/imageView" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:src="@drawable/ic_launcher" 
      android:rotation="180" /> 
    </LinearLayout> 
    <ImageView android:id="@+id/content" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:background="#FF0000" 
     android:src="@drawable/ic_launcher" 
     android:rotation="180" /> 
</SlidingDrawer> 

Обратите внимание, что я создал LinearLayout, чтобы установить в качестве ручки, и не изменить это вращение, но я изменил вращение его ребенка. Это было для предотвращения небольшой проблемы, которую я имел, но все работает нормально, и это просто.

+3

Примечание 'android: rotation' - это уровень API 11 (Android 3.0). – azdev

+0

хороший ... но как насчет

+0

Мне не удалось найти обходное решение, которое работает под уровнем API 11 – Leandroid

7

Я был очень недоволен решениями, предоставляемых здесь:

  • Panel класса от http://code.google.com/p/android-misc-widgets/ был действительно неинтуитивным использовать, а также были ошибка и визуальные глюки (непригодная для продуктивного использования) и не документов на всех
  • SlidingTray класс от http://aniqroid.sileria.com/doc/api/ был вложен в Lib нуждающихся слишком много зависимостей и для меня, я не получил его на работу на всех
  • с использованием android:rotation="180" требует уровня API 11, и моя цель 10.

(не в обиду соответствующих разработчиков, пытаясь быть объективным здесь)

Так что мое решение было извлечь SlidingTray из этой библиотеки http://aniqroid.sileria.com/doc/api/ (Ахмед Шакил) и реструктурировать это немного, так как у нее есть некоторые причуды необходимо было использовать в библиотеке Ахмеда. SlidingTray основан на Androids собственный SlidingDrawer, поэтому я думаю, он стабилен. Мое изменение состоит из 1 класса, который я назвал MultipleOrientationSlidingDrawer и , вы должны добавить declare-styleables в свой attrs.xml. Кроме того, он имеет примерно такое же использование, как SlidingDrawer с дополнительным атрибутом «ориентация».

Проверьте это: MultipleOrientationSlidingDrawer (source & example) @ gist

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

<your.app.MultipleOrientationSlidingDrawer 
     xmlns:custom="http://schemas.android.com/apk/res-auto/your.app" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     custom:handle="@+id/handle_c" 
     custom:content="@+id/content_c" 
     custom:orientation="top"> 
     <RelativeLayout 
      android:id="@id/handle_c" 
      android:layout_width="match_parent" 
      android:layout_height="30dp" 
      android:background="#333333"> 
      <TextView 
       android:layout_width="wrap_content" 
       android:layout_height="match_parent" 
       android:text="Handle Text" 
       android:gravity="left|center_vertical"/> 
     </RelativeLayout> 

     <FrameLayout 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:id="@id/content_c" 
      android:background="#555555"> 

      <ListView 
       android:id="@+id/listview_credits" 
       android:layout_width="match_parent" 
       android:layout_height="match_parent"/> 
     </FrameLayout> 
    </your.app.MultipleOrientationSlidingDrawer> 

Отказ от ответственности: Все кредиты идут на соответствующий разработчик. Я не тестировал это решение экстенсивно, он отлично работает с TOP и BOTTOM, установленным в XML. Я не пытался использовать его программно.

+0

Это хорошо, но вы видели проблемы с анимацией? Вы нашли решение для мигания просмотра во время его перемещения? – Vetalll

+0

У меня были мигающие анимации с http://code.google.com/p/android-misc-widgets/, но не с этим apporach (до сих пор) – for3st

+0

Возможно ли сделать 'FrameLayout'' content_c' не занимать все свободное пространство, потому что я вижу, что он все толкал, даже если я устанавливаю 'android: layout_height =" wrap_content "' – Erik

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