탐색 창을 오른쪽에서 왼쪽으로 열도록 설정하는 방법
우선 나는이 질문이 전에 여기에 나타났음을 알고 있지만 많은 것을 시도한 후에도 여전히 성공하지 못했습니다. 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
대신 start
에 onNavigationItemSelected
방법 :
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에 추가했습니다.
'Program Tip' 카테고리의 다른 글
LinearLayout을 부모 중심에 정렬하는 방법은 무엇입니까? (0) | 2020.10.22 |
---|---|
지도와 무순지도 중에서 선택하는 방법은 무엇입니까? (0) | 2020.10.22 |
MySQL 설치 : 오류 : gem 기본 확장을 빌드하지 못했습니다. (0) | 2020.10.22 |
입력 / 쓰기를 중지 한 후 입력 텍스트에서 이벤트를 트리거하는 방법은 무엇입니까? (0) | 2020.10.22 |
플러그인 오류 : 필수 플러그인 'Android 지원'이 비활성화 됨 (0) | 2020.10.22 |