Program Tip

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

programtip 2020. 10. 22. 22:23
반응형

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


우선 나는이 질문이 전에 여기에 나타났음을 알고 있지만 많은 것을 시도한 후에도 여전히 성공하지 못했습니다. 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>

메인 레이아웃에서 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;
    }
};

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


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

<application android:supportsRtl="true">

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

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

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


해결책


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);
            }
        }
    });
//...
}

이 대답 은 탐색을 오른쪽에서 왼쪽으로 열도록 설정하는 데 유용하지만 아이콘을 오른쪽으로 설정하는 솔루션은 없습니다. 이 코드로 수정할 수 있습니다. 당신이 그것을 줄 경우 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);
        }
    });

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

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

그리고 사용하는 것을 잊지하지 않는 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>

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

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

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


이것을보세요 : 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);
}

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


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

android:supportsRtl="true"

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

android:layout_direction="rtl"

다음 오류의 주요 문제 :

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

즉,

android:layout_gravity="right"

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

mDrawerToggle.syncState();

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

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


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

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" />

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


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"

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

android:layoutDirection="locale"

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

참고URL : https://stackoverflow.com/questions/18547277/how-to-set-navigation-drawer-to-be-opened-from-right-to-left

반응형