как установить значок Drawer Layout в правой части экрана устройства?

Я создал образец приложения для макета ящика, он работает нормально, моя проблема заключается в том, что макет ящика отлично работает справа налево, но я пытаюсь переместить значок слева направо, но это не работает, дайте мне ваше предложение .. !!! Это возможно или нет?

введите здесь описание изображения

<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/drawer_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_gravity="right" >

    <!-- The main content view -->

    <FrameLayout
        android:id="@+id/content_frame"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
         />
    <!-- The navigation drawer -->

    <ListView
        android:id="@+id/drawer_list"
        android:layout_width="240dp"
        android:layout_height="match_parent"
        android:layout_gravity="right"
        android:background="#111"
        android:choiceMode="singleChoice"
        android:divider="@android:color/transparent"
        android:dividerHeight="0dp" />

</android.support.v4.widget.DrawerLayout>

person balaji    schedule 23.11.2013    source источник
comment
ты решил проблему?   -  person MRX    schedule 26.05.2014
comment
@MRX НЕТ, я пробовал так много способов...   -  person balaji    schedule 28.05.2014
comment
@bala у тебя есть решение?   -  person Subhalaxmi    schedule 12.05.2015
comment
@SubhalaxmiNayak до сих пор не нашел решения   -  person balaji    schedule 04.06.2015
comment
просто прочитайте stackoverflow.com/questions/33464416/   -  person Saeed Darvish    schedule 01.11.2015


Ответы (5)


Этот значок представляет меню навигации, которое по замыслу должно находиться в левой части экрана. В соответствии с рекомендациями у нас может быть навигационный ящик с правой стороны, но он будет использоваться для изменения содержимого (например, фильтров). Для всех таких целей вы можете использовать ActionbarItem и разместить ActionItem в правом углу экрана. Нажмите на этот элемент действия, чтобы открыть или закрыть правый навигационный ящик.

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

Просто для информации, чтобы поместить навигационный ящик справа, вы должны изменить гравитацию навигационного ящика следующим образом:

    <?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/drawer_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/main_background" >

    <!-- The main content view -->

    <FrameLayout
        android:id="@+id/content_frame"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >
    </FrameLayout>
    <!-- The navigation drawer -->

    <LinearLayout
        android:id="@+id/right_drawer"
        android:layout_width="280dp"
        android:layout_gravity="end"
        android:layout_height="match_parent"
        android:orientation="vertical" />

</android.support.v4.widget.DrawerLayout>

Кроме того, в этом случае вам действительно нужен значок меню навигации, справа либо используйте настраиваемые макеты заголовков, либо библиотеку, такую ​​​​как ActionBarSherlock, для ее редактирования.

Надеюсь, это поможет!

person Vivek Soneja    schedule 23.11.2013
comment
это ясно и хорошо. макет в навигационном ящике с заголовком и списком "> stackoverflow.com/questions/33464416/ - person Saeed Darvish; 01.11.2015

Может быть, уже слишком поздно, но вы можете решить эту проблему, используя меню по умолчанию.

Создать res/menu/my_right_side_menu.xml

<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:myapp="http://schemas.android.com/apk/res-auto">
    <item
        android:id="@+id/btnMyMenu"
        android:icon="@drawable/ic_drawer"
        android:title="Right Side Menu"
        myapp:showAsAction="always"/>
</menu>

Затем добавьте свое меню в onCreateOptionsMenu() в Activity

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    int menuToUse = R.menu.my_right_side_menu;

    MenuInflater inflater = getMenuInflater();
    inflater.inflate(menuToUse, menu);

    return super.onCreateOptionsMenu(menu);
}

Затем в вашем ActionBarDrawerToggle обработайте событие щелчка вашего пункта меню.

mDrawerToggle = new ActionBarDrawerToggle(this,  mDrawerLayout, R.string.drawer_open, R.string.drawer_close) {

        @Override
        public boolean onOptionsItemSelected(android.view.MenuItem item) {
            if (item != null && item.getItemId() == R.id.btnMyMenu) {
                if (mDrawerLayout.isDrawerOpen(Gravity.RIGHT)) {
                    mDrawerLayout.closeDrawer(Gravity.RIGHT);
                } else {
                    mDrawerLayout.openDrawer(Gravity.RIGHT);
                }
                return true;
            }
            return false;
        }
    };

И, наконец, не забудьте скрыть кнопку «Домой» от ActionBar

getSupportActionBar().setDisplayHomeAsUpEnabled(false);
getSupportActionBar().setDisplayShowHomeEnabled(false);
person Fernando Velazquez    schedule 27.01.2015
comment
Это правильный подход. Но вам больше не нужен ActionBarDrawerToggle. Вы можете напрямую реализовать onOptionsItemSelected из класса активности. Код для onOptionsItemSelected будет точно таким, как вы показали здесь. - person RajV; 13.06.2016

Если вы используете AppBarLayout и панель инструментов, выполните следующие действия.

<android.support.design.widget.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:theme="@style/AppTheme.AppBarOverlay"
        android:layoutDirection="rtl">

        <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            android:background="?attr/colorPrimary"
            app:popupTheme="@style/AppTheme.PopupOverlay" />


</android.support.design.widget.AppBarLayout>

уведомление: android:layoutDirection="rtl"

person farhang67    schedule 10.02.2017
comment
Он работает для значка ящика. Но я хочу оставить название слева. Заголовок слева и значок ящика будут справа. Как решить? - person Arun PK; 23.11.2018

Вот похожее на лазейку решение, которое сработало в моем случае.

toggle = new ActionBarDrawerToggle(
            this, drawer, toolbar0, R.string.open_nav, R.string.close_nav);

Я сделал для него панель инструментов.

<android.support.design.widget.AppBarLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            android:layout_marginRight="40dp"
            android:layout_marginEnd="40dp"
            android:background="@color/colorPrimary">
            <!-- this is your general toolbar-->
            <TextView
                android:id="@+id/title"
                android:layout_width="wrap_content"
                android:layout_height="match_parent"
                android:layout_gravity="right|end|center_vertical"
                android:text="Mytitle"/>

        </android.support.v7.widget.Toolbar>

        <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar0"
            android:layout_width="40dp"
            android:layout_height="?attr/actionBarSize"
            android:layout_gravity="right|end"
            android:background="?attr/colorPrimary"
            app:popupTheme="@style/ThemeOverlay.AppCompat.Light" />
            <!-- this is your nav-button toolbar-->

    </FrameLayout>

</android.support.design.widget.AppBarLayout>

и установите для него onclicklistener:

toolbar0.setNavigationOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            if (drawer.isDrawerOpen(Gravity.RIGHT)) {
                drawer.closeDrawer(Gravity.RIGHT);
            } else {
                drawer.openDrawer(Gravity.RIGHT);
            }
        }

    });
person navid    schedule 08.03.2017

Из Руководства разработчика:

Расположение и расположение ящика управляется с помощью атрибута android:layout_gravity в дочерних представлениях, соответствующего тому, с какой стороны представления вы хотите, чтобы ящик появлялся: слева или справа. (Или начало/конец в версиях платформы, которые поддерживают направление компоновки.)

Это означает, что вы можете сделать это:

<DrawerLayout
    android:layout_gravity="right">
</DrawerLayout>

Редактировать

Согласно Создание панели навигации,

Представление ящика (ListView) должно указывать свою горизонтальную гравитацию с помощью атрибута android:layout_gravity. Для поддержки языков с письмом справа налево (RTL) укажите значение с «start» вместо «left» (чтобы ящик отображался справа, когда макет RTL).

Итак, вы должны сделать:

<DrawerLayout
    android:layout_gravity="start">
</DrawerLayout>
person chinglun    schedule 23.11.2013