Как изменить положение кнопки на выдвижной ручке андроида - PullRequest
13 голосов
/ 01 августа 2011

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

Ответы [ 7 ]

21 голосов
/ 02 августа 2011

Поместите свой дескриптор в 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>
5 голосов
/ 25 июня 2012

Проблема, с которой я столкнулся при ответе 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);
}
}
1 голос
/ 19 мая 2012

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

В приведенном ниже примере я извлекаю класс из 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();
            }
        }
    }
}

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

0 голосов
/ 26 января 2016

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

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

Тогда вот так

0 голосов
/ 21 июля 2014

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

0 голосов
/ 19 февраля 2013

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

@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());
}
0 голосов
/ 09 января 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...