Android – возможен ли навигационный ящик с правой стороны?


person user2062024    schedule 17.06.2013    source источник
comment
проверьте этот ответ: stackoverflow.com/a/17792254/1572408 он работает для меня.   -  person Rudi    schedule 14.10.2013


Ответы (9)


Вот документация по ящику, и кажется, что вы можете настроить его так, чтобы он выдвигался слева или справа.

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

http://developer.android.com/reference/android/support/v4/widget/DrawerLayout.html

person Larry McKenzie    schedule 17.06.2013
comment
Почему их пример не работает в моем случае? Я имею в виду, я установил его на иврит и не вижу, чтобы он был справа. - person android developer; 23.05.2014
comment
Мне нужно больше, чтобы продолжать. Вы уверены, что все настроено правильно? Я бы рекомендовал опубликовать новый вопрос. - person Larry McKenzie; 23.05.2014
comment
Я решил оставить это. Мне удалось заставить их проект работать, используя другие вещи, а затем я решил не использовать его, так как это может сбивать с толку, когда ящик навигации находится на другой стороне. Возможно, я изменю свое мнение позже. - person android developer; 23.05.2014
comment
@LarryMcKenzie - Можно ли установить рисуемое меню справа? - person RoCk RoCk; 26.06.2018
comment
@RoCk Я предполагаю, что вы говорите о значке меню гамбургера, который выглядит как 3 горизонтальные линии. Это не компонент DrawerLayout. Таким образом, вы можете создать кнопку в любом месте, которая может открыть панель навигации. Это не рекомендуемый шаблон, но вы можете поместить значок в меню, чтобы разместить его в правой части панели инструментов. - person Larry McKenzie; 26.06.2018

NavigationDrawer можно настроить так, чтобы он выдвигался слева, справа или с обеих сторон. Ключом является порядок появления ящиков в объявлении XML и атрибут layout_gravity. Вот пример:

<android.support.v4.widget.DrawerLayout
    android:id="@+id/drawer_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <FrameLayout
        android:id="@+id/content"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:baselineAligned="false" >
    </FrameLayout>

    <!-- Left drawer -->

    <ListView
        android:id="@+id/left_drawer"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_gravity="left"
        android:choiceMode="singleChoice" />

    <!-- Right drawer -->

    <ListView
        android:id="@+id/right_drawer"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_gravity="right"
        android:choiceMode="singleChoice" />
</android.support.v4.widget.DrawerLayout>
person Jeshurun    schedule 29.09.2013

Мое приложение аварийно завершало работу с ошибкой "Нет представления ящика с гравитацией ВЛЕВО".

Поэтому добавил это в onOptionsItemSelected:

if (item != null && item.getItemId() == android.R.id.home) {
        if (mDrawerLayout.isDrawerOpen(Gravity.RIGHT)) {
            mDrawerLayout.closeDrawer(Gravity.RIGHT);
        } else {
            mDrawerLayout.openDrawer(Gravity.RIGHT);
        }
    }
person amalBit    schedule 14.02.2014

Чтобы добавить в решение https://stackoverflow.com/a/21781710/437039.

Если вы используете проект Navigation Drawer, созданный Android Studio, все изменится в onOptionsItemSelected. Поскольку они создали дочерний класс, вы должны использовать этот код

if (item != null && id == android.R.id.home) {
        if (mNavigationDrawerFragment.isDrawerOpen(Gravity.RIGHT)) {
            mNavigationDrawerFragment.closeDrawer(Gravity.RIGHT);
        } else {
            mNavigationDrawerFragment.openDrawer(Gravity.RIGHT);
        }
        return true;
}

Следующий. В классе NavigationDrawerFragment вам нужно создать 3 метода:

Способ 1

public boolean isDrawerOpen(int gravity) {
    return mDrawerLayout != null && mDrawerLayout.isDrawerOpen(gravity);
}

Способ 2

public void closeDrawer(int gravity) {
    mDrawerLayout.closeDrawer(gravity);
}

Способ 3

public void openDrawer(int gravity) {
    mDrawerLayout.openDrawer(gravity);
}

Только теперь правый ящик будет функционировать.

person sandalone    schedule 26.09.2014

Вы можете использовать NavigationView из дизайна материалов. Например:

<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/drawer_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
    tools:openDrawer="start">

    <include
        layout="@layout/app_bar_main"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

    <android.support.design.widget.NavigationView
        android:id="@+id/nav_view"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_gravity="end"
        android:fitsSystemWindows="true"
        app:headerLayout="@layout/nav_header_main"
        app:menu="@menu/activity_main_drawer" />

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

Полное руководство см. на http://v4all123.blogspot.in/2016/03/simple-example-of-navigation-view-on.html

person Gunaseelan    schedule 21.02.2016

Я знаю, что это старый вопрос, но для тех, кто все еще ищет ответ:

Да, это возможно. Пожалуйста, проверьте мой ответ по ссылке ниже:

https://stackoverflow.com/a/19358114/1572408

person Rudi    schedule 30.07.2014

Тогда используйте эти коды @amal, я думаю, это вам поможет. XML:

<!-- Framelayout to display Fragments -->

<FrameLayout
    android:id="@+id/frame_container"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="48dp"
        android:background="@drawable/counter_bg" >

        <ImageView
            android:id="@+id/iconl"
            android:layout_width="25dp"
            android:layout_height="wrap_content"
            android:layout_gravity="left"
            android:layout_marginLeft="12dp"
            android:layout_marginRight="12dp"
            android:src="@drawable/ic_launcher" />

        <ImageView
            android:id="@+id/iconr"
            android:layout_width="25dp"
            android:layout_height="wrap_content"
            android:layout_alignParentRight="true"
            android:layout_alignParentTop="true"
            android:layout_marginRight="17dp"
            android:src="@drawable/ic_launcher" />
    </RelativeLayout>
</FrameLayout>

<!-- Listview to display slider menu -->

<ListView
    android:id="@+id/list_slidermenu"
    android:layout_width="240dp"
    android:layout_height="match_parent"
    android:layout_gravity="start"
    android:background="@color/list_background"
    android:choiceMode="singleChoice"
    android:divider="@color/list_divider"
    android:dividerHeight="1dp"
    android:listSelector="@drawable/list_selector" />

<ListView
    android:id="@+id/list_slidermenu2"
    android:layout_width="240dp"
    android:layout_height="match_parent"
    android:layout_gravity="end"
    android:background="@color/list_background"
    android:choiceMode="singleChoice"
    android:divider="@color/list_divider"
    android:dividerHeight="1dp"
    android:listSelector="@drawable/list_selector" />

//set the required images

Код активности:

ImageView iconl,iconr;

private DrawerLayout mDrawerLayout;
private ListView mDrawerList,mDrawerList2;

ImageView iconl,iconr;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    iconl = (ImageView)findViewById(R.id.iconl);
    iconr = (ImageView)findViewById(R.id.iconr);

    mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
    mDrawerList = (ListView) findViewById(R.id.list_slidermenu);
    mDrawerList2 = (ListView) findViewById(R.id.list_slidermenu2);
    mDrawerList.setOnItemClickListener(new SlideMenuClickListener());
    mDrawerList2.setOnItemClickListener(new SlideMenuClickListener());
    iconl.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            mDrawerLayout.openDrawer(Gravity.START);
            mDrawerLayout.closeDrawer(Gravity.END);
        }
    });
    iconr.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            mDrawerLayout.openDrawer(Gravity.END);
            mDrawerLayout.closeDrawer(Gravity.START);
        }
    });
}
}

и здесь вы можете установить свой собственный адаптер списка для обоих списков и при щелчке элемента вызвать displayView (position); метод, в котором вы можете добавить свой фрагмент в framelayout.

/**
 * Diplaying fragment view for selected nav drawer list item
 * */
private void displayView(int position) {
    // update the main content by replacing fragments
    Fragment fragment = null;
    switch (position) {
    case 0:
        fragment = new HomeFragment();
        break;


    default:
        break;
    }

    if (fragment != null) 
    {
        FragmentManager fragmentManager = getFragmentManager();
        fragmentManager.beginTransaction()
        .replace(R.id.frame_container, fragment).commit();

        // update selected item and title, then close the drawer
        mDrawerList.setItemChecked(position, true);
        mDrawerList.setSelection(position);

        mDrawerLayout.closeDrawer(mDrawerList);
    } else {
        // error in creating fragment
        Log.e("MainActivity", "Error in creating fragment");
    }
}
person Rohit Goswami    schedule 25.04.2014

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

person Vikash Sharma    schedule 14.04.2018

напишите этот код в свой Main.java, а im1 - это значок вашей панели навигации в правом верхнем углу в файле xml.

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_home);
    im1=findViewById(R.id.humburgericon);
    im1.setOnClickListener(new View.OnClickListener() {
        @SuppressLint("WrongConstant")
        @Override
        public void onClick(View v) {
              drawerLayout.openDrawer(Gravity.END);});
person Mohit Baghel    schedule 11.01.2020