Android SlidingDrawer сверху?
Есть ли способ заставить ящик выдвигаться сверху вниз?
4 ответа
По умолчанию SlidingDrawer
класс не позволяет этого. Вы можете использовать Panel
Класс отсюда, чтобы получить что-то очень похожее, хотя: http://code.google.com/p/android-misc-widgets/
Я нашел простой способ сделать это. Все, что вам нужно сделать, это установить вращение на 180º для slideDrawer, содержимого и дескриптора. Это проще понять на примере, поэтому посмотрите, что я сделал:
Сначала я покажу вам мой старый 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 для установки в качестве дескриптора и не изменил его вращение, но я изменил вращение его дочернего элемента. Это должно было предотвратить небольшую проблему, которая у меня была, но все работает нормально и все просто.
Я был очень недоволен решениями, представленными здесь:
-
Panel
класс из http://code.google.com/p/android-misc-widgets/ был действительно не интуитивно понятен в использовании, а также имел ошибки и визуальные сбои (непригодные для продуктивного использования) и вообще никаких документов SlidingTray
класс из http://aniqroid.sileria.com/doc/api/ был вложен в библиотеку, нуждающуюся в слишком большой зависимости, и для меня я вообще не работал- с помощью
android:rotation="180"
требует API уровня 11, а моя цель 10.
(не в обиду соответствующим разработчикам, пытаясь быть объективным здесь)
Поэтому мое решение заключалось в том, чтобы извлечь SlidingTray из этой библиотеки http://aniqroid.sileria.com/doc/api/ (автор Ахмед Шакил) и немного реорганизовать ее, поскольку в ней имелись некоторые причуды, которые необходимо было использовать в библиотеке Ахмеда. SlidingTray
основан на собственном Android SlidingDrawer
Я думаю, что это стабильно. Моя модификация состоит из 1 класса, который я назвал MultipleOrientationSlidingDrawer
и вы должны добавить объявляемые стили в вашем файле attrs.xml. В остальном он практически такой же, как SlidingDrawer с дополнительным атрибутом " direction ".
Проверьте это: MultipleOrientationSlidingDrawer (источник и пример) @ 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. Я не пытался использовать это программно.
Мне пришлось сделать то же самое для одного из моих проектов, и я закончил тем, что написал свой собственный виджет для этого. Я назвал это SlidingTray теперь является частью моей библиотеки Aniqroid с открытым исходным кодом.
http://aniqroid.sileria.com/doc/api/ (найдите загрузки внизу или воспользуйтесь проектом кода Google, чтобы увидеть другие варианты загрузки: http://code.google.com/p/aniqroid/downloads/list)
Документация класса находится здесь: http://aniqroid.sileria.com/doc/api/com/sileria/android/view/SlidingTray.html