Как изменить положение кнопки ручки выдвижного ящика Android

По умолчанию кнопка ручки в Android SlidingDrawer находится в центре ящика. Можно ли изменить это положение влево или вправо ..? Если возможно, как я могу это сделать, android:gravity="left" не работает в кнопке.


person Miuranga    schedule 01.08.2011    source источник
comment
Ищите решение этого вопроса, если у кого-нибудь есть какие-либо предложения о том, как это сделать или как изменить SlidingDrawer для этого...   -  person Adil Hussain    schedule 28.12.2011


Ответы (7)


Поместите свой дескриптор в RelativeLayout и установите для него android:layout_alignParentRight="true".

Например вот так:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content">

    <TextView android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/hello" />

    <SlidingDrawer android:id="@+id/drawer"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:handle="@+id/handle" 
        android:content="@+id/content">

        <RelativeLayout
            android:layout_width="fill_parent"
            android:layout_height="wrap_content" 
            android:id="@+id/handle">
            <ImageView android:src="@drawable/icon"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignParentRight="true" />
        </RelativeLayout>

        <LinearLayout 
            android:gravity="center" 
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:background="#aaaa00" android:id="@+id/content">
            <ImageView android:src="@drawable/icon"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:layout_gravity="center">
            </ImageView>
        </LinearLayout>

    </SlidingDrawer>

</FrameLayout>
person HenrikS    schedule 02.08.2011
comment
Этот ответ следует принять - решение HenrikS отлично сработало для меня. - person DashRantic; 21.11.2011
comment
Не работает для меня. Я могу указать атрибут "android:layout_alignParentRight" в представлении "handle" (или дочернем элементе представления "handle", как указано выше), чтобы он компилировался, но, к сожалению, он игнорируется при запуске (так что ImageView по-прежнему выровнен по центру). Чтобы добавить: с шириной RelativeLayout, указанной как fill_parent, даже если код действительно выполнялся, вся ширина экрана действовала бы как дескриптор, который, как я предполагаю, не является желаемым, по крайней мере, для меня. - person Adil Hussain; 28.12.2011
comment
У некоторых людей это не сработало, потому что они упустили тот факт, что дескриптор SlidingDrawer теперь должен быть относительным макетом, внутри которого находится кнопка. Не сам идентификатор кнопки. Это действительно странно (и я сам не мог понять...), но макеты Android больше похожи на магию Гарри Поттера, чем на программирование... - person Radu; 19.02.2013
comment
Макеты Android — это программирование, а не магия Гарри Поттера. Уважать - person P Ravikant; 20.09.2013

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

Чтобы обойти это, я изменил макет представления обработчика (ImageView) в моем случае слева, надеюсь, это будет полезно.

public class CustomSlidingDrawer extends SlidingDrawer {

public CustomSlidingDrawer(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
}

public CustomSlidingDrawer(Context context, AttributeSet attrs) {
    this(context, attrs, 0);
}

@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
    super.onLayout(changed, l, t, r, b);

    final int height = b - t;

    ImageView handle = (ImageView) getHandle();
    int childLeft = 0;
    int childWidth = handle.getWidth();
    int topOffset = 0;
    int bottomOffest = 0;
    int childHeight = handle.getHeight();

    int childTop = this.isOpened()?topOffset:height - childHeight + bottomOffest;

    handle.layout(childLeft, childTop , childLeft + childWidth, childTop+childHeight);
}
}
person garibay    schedule 25.06.2012
comment
какие изменения я должен сделать, если я хочу, чтобы это было с правой стороны, я не могу понять, пожалуйста, помогите - person Anup; 27.05.2016

Идея проста: установите отступ дескриптора на правильное значение в зависимости от желаемого выравнивания.

В приведенном ниже примере я получаю класс от SlidingDrawer и переопределяю onLayout следующим образом. Мой выдвижной ящик находится внизу экрана, и я хочу, чтобы ручка была выровнена по левому краю, а не по центру.

public class ToolDrawer extends SlidingDrawer {
    private int m_handleWidth = 0;  // original handle width

    public boolean onTouchEvent(MotionEvent event) {
        float x = event.getX();
        if (x <= m_handleWidth) {
            return super.onTouchEvent(event);
        }
        return false;
    }

    protected void onLayout (boolean changed, int left, int top, int right, int bottom) {
        super.onLayout(changed, left, top, right, bottom);

        if (changed) {
            ImageView iv = (ImageView) getHandle();
            iv.setPadding(0, 0, getWidth() - iv.getWidth(), 0);
            if (m_handleWidth == 0) {
                m_handleWidth = iv.getWidth();
            }
        }
    }
}

Это так просто.

person AJ Lee    schedule 19.05.2012
comment
Эй, у меня есть ползунок в левой части экрана, и я хочу, чтобы скользящее меню появлялось сверху вниз, а не слева направо; Не могли бы вы помочь мне, что нужно сделать в файле XML. Я глубоко ценю ваш ответ. - person Khay; 06.10.2014

Я попробовал android:paddingBottom="300dp" для ImageView, и он отлично работает, также с левым, правым и верхним. Но вы должны установить отступ из среднего положения, поэтому bottom="300dp" означает, что ручка перемещается вверх на 300 от середины.

person Stefan    schedule 09.01.2012

Более простое решение для ручки с выравниванием по левому краю:

@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
    super.onLayout(changed, l, t, r, b);
    final View handle = getHandle();
    handle.layout(0, handle.getTop(), handle.getWidth(), handle.getBottom());
}
person krio    schedule 19.02.2013

Я исследовал эту проблему 2 дня и понял, что нужно использовать другую библиотеку. Потому что, когда вы используете RelativeLayout или LinearLayout, вы просто получаете экран fill_parent, и, конечно, на него повлияет прикосновение (хотя вы не касаетесь значка).

Итак, я использую SlidingTray из библиотеки Sileria (версия 3.5) http://aniqroid.sileria.com/doc/api/

Тогда вот так

person Tấn Nguyên    schedule 26.01.2016

Я нашел решение для garibay. Вам просто нужно установить android: clickable = "true" в макете содержимого выдвижного ящика.

person Shrinivas Mahamuni    schedule 21.07.2014