Android SlidingDrawer сверху?

Есть ли способ заставить ящик выдвигаться сверху вниз?

4 ответа

Решение

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

http://www.ohloh.net/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

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