탐색 창을 오른쪽에서 왼쪽으로 열도록 설정하는 방법


84

우선 나는이 질문이 전에 여기에 나타났음을 알고 있지만 많은 것을 시도한 후에도 여전히 성공하지 못했습니다. Android 개발자 사이트 에서 예제를 작업 중입니다 .

예제에서 구현하는 방법 (왼쪽에서 오른쪽으로) 대신 오른쪽에서 왼쪽으로 메뉴가 열리도록 설정하려고합니다. 또한 메뉴 열기 버튼을 작업 표시 줄의 오른쪽으로 이동하고 싶습니다. 또한, 예를 들어, 여기에 몇 가지 답변을 빨간색 이 대답 .

뷰와 레이아웃의 중력을 변경하려고하는데 오류가 발생합니다.

절대 중력이 왼쪽 인 서랍 뷰를 찾을 수 없습니다.

오른쪽에서 열리도록 메뉴를 설정하고 작업 표시 줄 버튼을 오른쪽으로 이동하려면 내 코드의 문제가 무엇인지, 무엇을 변경해야하는지 알려주세요.

xml 코드는 다음과 같습니다.

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

    <FrameLayout
        android:id="@+id/content_frame"
        android:layoutDirection="rtl"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        />

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

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


github.com/Ali-Rezaei/SlidingDrawer 를 살펴보면 몇 줄의 코드로 어느쪽에서든 슬라이드 할 수 있습니다.
Ali

답변:


155

메인 레이아웃에서 ListView중력을 오른쪽으로 설정합니다 .

android:layout_gravity="right" 

또한 코드에서 :

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

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

그것이 작동하기를 바랍니다 :)


2
@Rudi : 두 번째 부분의 답을 아십니까? 액션 바를 오른쪽에서 왼쪽으로 만드는 방법을 의미합니다. (서랍 탐색 아이콘 권취 방향도 변경)
알리레자 Farahani에게

@alireza 왜 사용자 지정 작업 표시 줄을 사용하지 않습니까?
Rudi 2014

@Rudi : setCustomView방법을 의미 합니까? 그렇다면 그 방법을 보여주는 링크를 붙여 주시겠습니까?
Alireza Farahani 2014

@alireza보기 상단에서 액션 바를 사용하는 대신 메인 xml에서 커스텀 액션 바를 만들고 원하는대로 설정했습니다.
Rudi

@Rudi : 그러면 위쪽 탐색 및 서랍 열기 및 닫기 애니메이션과 같은 동작을 어떻게 수행 할 수 있습니까? 처음부터 구현해야합니까?
Alireza Farahani 2014

61

매니페스트에 다음 코드를 추가합니다.

<application android:supportsRtl="true">

Oncreate에 다음 코드를 작성하십시오.

getWindow().getDecorView().setLayoutDirection(View.LAYOUT_DIRECTION_RTL);

그것은 나를 위해 작동합니다. ;)


1
이 모든 것이 괜찮을 정답, 다음이 코드를 사용하여 시작하는 당신의 목록보기의 단지 세트 중력
마흐디 Giveie

9
당신이 낮은 API에 대한이 사용할 수 있도록를 작동하고, 그러나 setLayoutDirection (View.LAYOUT_DIRECTION_RTL)은 17 위의 API입니다
밀라 드

6
이것은 활동의 전체 레이아웃, 심지어 toStartOf / toEndOf 등을 뒤집지 않습니까?
TWiStErRob

13
이것은 잘못된 대답입니다. 전체 활동 레이아웃을 오른쪽에서 왼쪽으로 뒤집습니다.
Tarun

1
빠른 해결책이라고 생각했지만 올바른 해결책은 아닙니다.
sidhanshu

37

해결책


your_layout.xml :

<?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="end">

    <include layout="@layout/app_bar_root"
        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:itemTextColor="@color/black"
        app:menu="@menu/activity_root_drawer" />

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

YourActivity.java :

@Override
protected void onCreate(Bundle savedInstanceState) {
//...
toolbar = (Toolbar) findViewById(R.id.toolbar);

drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
            this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
drawer.setDrawerListener(toggle);
toggle.syncState();

toolbar.setNavigationOnClickListener(new View.OnClickListener() {

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

2
잘 작동합니다. 그러나 툴바 아이콘은 여전히 ​​왼쪽에 나타납니다. 토글 버튼 아이콘을 오른쪽으로 가져 오는 방법은 무엇입니까?
Darush

Drawerlayout과 NavigationView 모두에 android : layout_gravity = "end"를주었습니다. 잘 작동합니다.
varotariya vajsi

toolbar.setNavigationOnClickListener필요 분 API 광고 21 레벨 :(
SepJaPro2.4

@ SepJaPro2.4 yes, but From August 2018, new apps must target at least Android 8.0 (API level 26). From November 2018, app updates must target Android 8.0 (API level 26).(Google)
Volodymyr Kulyk

2
안드로이드 추가 : layoutDirection = 당신의 AppBarLayout XML의 "RTL은"오른쪽에있는 토글 버튼을 설정
Terranology

4

이 답변 은 탐색을 오른쪽에서 왼쪽으로 열도록 설정하는 데 유용하지만 아이콘을 오른쪽으로 설정하는 솔루션은 없습니다. 이 코드 는 그것을 고칠 수 있습니다. 당신이 그것을 줄 경우 drawer첫 번째 PARAM로하고 ViewCompat.LAYOUT_DIRECTION_RTL두 번째 PARAM 같이 ENTIER 레이아웃은 RTL로 설정됩니다. 빠르고 간단한 해결책이지만 메뉴가 오른쪽에서 왼쪽으로 열리도록 설정하고 아이콘을 오른쪽으로 설정하려는 분들에게는 올바른 해결책이 될 수 없다고 생각합니다. (하지만 그것은 목적에 달려 있습니다.) 그러나, 나는이주는 제안 toolbar대신의를 drawer. 이렇게하면 도구 모음 만 RTL이됩니다. 그래서 저는이 두 가지 대답의 조합이 당신이 원하는 것을 정확히 할 수 있다고 생각합니다.

이러한 설명에 따르면 코드는 다음과 같아야합니다.

(이 줄을 onCreate 메서드에 추가)

final DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); // Set it final to fix the error that will be mention below.

    ViewCompat.setLayoutDirection(toolbar, ViewCompat.LAYOUT_DIRECTION_RTL);

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

서랍을 최종으로 만들어야합니다. 그렇지 않으면 다음 오류가 발생합니다.

변수 '서랍'은 내부 클래스 내에서 액세스되며 최종적으로 선언되어야합니다.

그리고 사용하는 것을 잊지하지 않는 end대신 startonNavigationItemSelected방법 :

drawer.closeDrawer(GravityCompat.END);

그리고 activity_main.xml에서

<android.support.v4.widget.DrawerLayout 
   android:id="@+id/drawer_layout"
   tools:openDrawer="end">

   <android.support.design.widget.NavigationView
      android:id="@+id/nav_view"
      android:layout_gravity="end"/>
</android.support.v4.widget.DrawerLayout>

3

다음은 서랍에 대한 문서이며 왼쪽 또는 오른쪽에서 꺼내도록 구성 할 수있는 것으로 보입니다.

서랍 위치 및 레이아웃은 서랍이 나타나기를 원하는 뷰의 측면 (왼쪽 또는 오른쪽)에 해당하는 하위 뷰의 android : layout_gravity 속성을 사용하여 제어됩니다. (또는 레이아웃 방향을 지원하는 플랫폼 버전에서 시작 / 종료합니다.)

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


나는 전에이 대답을 보았고 내 질문에서도 언급했습니다.
galvan 2013-08-31

괜찮아. 중력 end대신 사용하십시오 right. 편집 : 제거 android:layout_gravity="right"로부터 android.support...DrawerLayout변경 android:layout_gravity="right"에 대한 android:layout_gravity="end"내부ListView
KickAss

1
여전히 오류가 있습니다. 절대 중력이 왼쪽 인 서랍 뷰를 찾을 수 없습니다. android : supportsRtl = "true"매니페스트에 추가하고 drawerLayout 아래의 xml에 android : layoutDirection = "rtl"을 추가 한 다음 메뉴가 오른쪽에 열리지 만 이제는 닫히지 않습니다. 메뉴 버튼 (작업 표시 줄에 있음) 목록의 항목을 클릭하거나 목록의 외부를 클릭하면 닫히지 만 작업 표시 줄의 메뉴 버튼을 클릭하면 표시되지 않습니다. 그 이유는 무엇입니까?
galvan 2013-08-31

확실하지는 않지만 ... 이제 Drawer의 방향과 위치가 변경되었으므로 Android 예제에 따라 Activity에서 Toggle 스위치 메서드 / 버튼 리스너가 있어야합니다. RightToLeft로 이동하여 닫는 것을 알 수 있도록 수정했습니다. 그것은 (즉 숨겨진) (그 말이 경우) 가까이 늘 있도록 왼쪽에 이미 메뉴에서 보류입니다 생각 될 수있다
KickAss

여러분, 저도 같은 종류의 일을하고 있지만 laoutDirection = "rtl"을 사용하면 minSdk를 17로 변경해야하지만 제 앱은 API 레벨 10을 지원해야합니다. 제 앱이 API 10을 지원할 수 있도록 도와 줄 수 있나요?
Aditya 2013

3

이것을보세요 : ExpandableListView를 DrawerLayout 폼에서 오른쪽에서 왼쪽으로 밉니다 .

ActionBarDrawerToggle을 구현했다고 가정합니다. 트릭은 onOptionsItemSelected(MenuItem item)ActionBarDrawerToggle 개체 내부의 메서드를 다음과 같이 재정의하는 것입니다.

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

onOptionsItemSelected(MenuItem item)활동에서 이것을 확인하고 호출하십시오 .

@Override
public boolean onOptionsItemSelected(MenuItem item) {

if(mDrawerToggle.onOptionsItemSelected(item)) {
    return true;
}

return super.onOptionsItemSelected(item);
}

이렇게하면 홈 버튼 기능을 사용할 수 있습니다. 버튼을 작업 표시 줄의 오른쪽으로 이동하려면 사용자 지정 작업 항목을 구현해야하며 원하는대로 작동하도록하기위한 다른 항목이있을 수 있습니다.


3

다음 오류의 주요 문제 :

절대 중력이 왼쪽 인 서랍 뷰를 찾을 수 없습니다.

즉,

android:layout_gravity="right"

오른쪽에있는 목록보기의 경우 다음 함수를 호출하여 왼쪽에서 서랍을 열어보십시오.

mDrawerToggle.syncState();

햄버거 아이콘을 클릭하세요!

위의 기능에 주석을 달고 @Rudi가 말한 것처럼 메뉴 열기 / 닫기를 처리하십시오!


3

내비게이션 뷰의 중력을 변경하여이 문제를 해결했습니다.

android : layout_gravity

하기 종료 대신 시작

<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"
        app:menu="@menu/activity_drawer" />

그것은 나를 위해 일했습니다.


2

먼저이 코드를 애플리케이션 태그의 AppManifest.xml에 넣어야합니다.

android:supportsRtl="true"

그런 다음 activity_main.xml 파일에 다음 코드를 넣으십시오.

android:layout_direction="rtl"

그 가장 좋은 방법은 지금, 당신이 내 하루가 감사 저장입니다
아메드 Mousa을

2

Android Studio에서 Navigation Drawer Activity 예제를 수정했습니다. 지원 라이브러리 25.3.1.

MainActivity.java :

private DrawerLayout mDrawerLayout;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

    ActionBar actionBar = getSupportActionBar();
    if (actionBar != null) {
        actionBar.setDisplayHomeAsUpEnabled(true);
    }

    mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);

    NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
    navigationView.setNavigationItemSelectedListener(this);
}

@Override
public void onBackPressed() {
    if (mDrawerLayout.isDrawerOpen(GravityCompat.END)) {
        mDrawerLayout.closeDrawer(GravityCompat.END);
    } else {
        super.onBackPressed();
    }
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    int itemId = item.getItemId();
    switch (itemId) {
        case android.R.id.home:
            finish();
            return true;

        case R.id.action_right_drawer:
            if (mDrawerLayout.isDrawerOpen(GravityCompat.END)) {
                mDrawerLayout.closeDrawer(GravityCompat.END);
            } else {
                mDrawerLayout.openDrawer(GravityCompat.END);
            }
            return true;

        default:
            return super.onOptionsItemSelected(item);
    }
}

@SuppressWarnings("StatementWithEmptyBody")
@Override
public boolean onNavigationItemSelected(MenuItem item) {
    // Handle navigation view item clicks here.

    mDrawerLayout.closeDrawer(GravityCompat.END);
    return true;
}

main.xml ( https://material.io/icons/ 에서 ic_menu_white_24px 다운로드 ) :

<?xml version="1.0" encoding="utf-8"?>
    <menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">
    <item android:id="@+id/action_right_drawer"
        android:title="Drawer menu"
        android:icon="@drawable/ic_menu_white_24px"
        android:orderInCategory="100"
        app:showAsAction="always" />
</menu>

activity_main.xml 변경

android:layout_gravity="start"

...에

android:layout_gravity="end"

2

rtl에서 여는 것은 사용자 경험에 좋지 않습니다. 사용자 로케일에 반응하도록하기 위해 DrawerLayout 매개 변수에 다음 행을 추가했습니다.

android:layoutDirection="locale"

햄버거 레이아웃이 서랍 열기 방향과 일치하도록 내 AppBarLayout에 추가했습니다.


1

DrawerLayout 속성 android:layout_gravity="right|end"tools:openDrawer="end" NavigationView 속성 android:layout_gravity="end"

XML Layout

<?xml version="1.0" encoding="utf-8"?>
<androidx.drawerlayout.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"
    android:layout_gravity="right|end"
    tools:openDrawer="end">

    <include layout="@layout/content_main" />

    <com.google.android.material.navigation.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" />

</androidx.drawerlayout.widget.DrawerLayout>

Java Code

// Appropriate Click Event or Menu Item Click Event

if (drawerLayout.isDrawerOpen(GravityCompat.END)) 
{
     drawerLayout.closeDrawer(GravityCompat.END);
} 
else 
{
     drawerLayout.openDrawer(GravityCompat.END);
}
//With Toolbar
toolbar = (Toolbar) findViewById(R.id.toolbar);

drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
            this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
drawer.setDrawerListener(toggle);
toggle.syncState();

toolbar.setNavigationOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            //Gravity.END or Gravity.RIGHT
            if (drawer.isDrawerOpen(Gravity.END)) {
                drawer.closeDrawer(Gravity.END);
            } else {
                drawer.openDrawer(Gravity.END);
            }
        }
    });
//...
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.