2015-08-22 6 views
0

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

Есть ли способ для этого?

ответ

0

Это очень просто.

Вот макет вашего основного вида деятельности, в activity_main.xml:

<android.support.v4.widget.DrawerLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    android:id="@+id/drawer_layout" 
    android:layout_width="match_parent" 
    android:fitsSystemWindows="true" 
    android:layout_height="match_parent"> 

    <FrameLayout 
     android:animateLayoutChanges="true" 
     android:id="@+id/container" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     tools:context=".MainActivity" 
     tools:ignore="MergeRootFrame" /> 

    <android.support.design.widget.NavigationView 
     android:id="@+id/navigation_view" 
     android:layout_width="wrap_content" 
     android:layout_height="match_parent" 
     android:layout_gravity="start" 
     app:headerLayout="@layout/drawer_list_header" 
     app:menu="@menu/navigation"/> 
</android.support.v4.widget.DrawerLayout> 

А вот ваш MainActivity:

public class MainActivity extends AppCompatActivity { 

    NavigationView navigationView; 
    DrawerLayout drawerLayout; 

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

     navigationView = (NavigationView) findViewById(R.id.navigation_view); 

     navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() { 
      @Override 
      public boolean onNavigationItemSelected(MenuItem menuItem) { 
       switch (menuItem.getItemId()) { 
        case R.id.navi_1: 
         // on 1st item in the menu, do something 
         break; 
        case R.id.navi_2: 
         // on 2nd item in the menu, do something 
         break; 
       } 
       drawerLayout.closeDrawers(); 
       return false; 
      } 
     }); 

     drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); 
    } 

    // [...] 

    private void openDrawer() { 
     if (!drawerLayout.isDrawerOpen(navigationView)) { 
      drawerLayout.openDrawer(navigationView); 
     } 
    } 

    private void closeDrawer() { 
     if (drawerLayout.isDrawerOpen(navigationView)) { 
      drawerLayout.closeDrawers(); 
     } 
    } 
} 

Теперь вы можете открыть ящик с openDrawer() и закрыть его с closeDrawer().

Образец navigation.xml файл, который находится под меню реж в Рез (ресурсы) папки:

<?xml version="1.0" encoding="utf-8"?> 
<menu xmlns:android="http://schemas.android.com/apk/res/android"> 
    <group android:checkableBehavior="single"> 
     <item 
      android:id="@+id/navi_1" 
      android:checked="true" 
      android:icon="@drawable/ic_android" 
      android:title="First item"/> 
     <item 
      android:id="@+id/navi_2" 
      android:icon="@drawable/ic_android" 
      android:title="Second item"/> 
    </group> 
</menu> 

Sample drawer_list_header.xml файл, расположенный под макета реж в Рез папка:

<?xml version="1.0" encoding="utf-8"?> 
<ImageView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/list_header" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:scaleType="fitXY" 
    android:adjustViewBounds="true" 
    android:paddingBottom="8dp" 
    android:src="@drawable/list_header_final"> 

</ImageView> 

Вот некоторые примечания:

  • Вы должны объявить файл меню для ящика, см. app:menu="@menu/navigation" в файле макета.
  • Возможно, вы захотите объявить макет заголовка, который отображается над элементами меню в ящике, см. app:headerLayout="@layout/drawer_list_header".
  • Ящик может быть открыт с помощью движения по краю экрана. Чтобы пользователи не могли этого сделать, вы можете заблокировать/разблокировать ящик при действии с помощью drawerLayout.setDrawerLockMode(...);, см. documentation for details.

Также обратите внимание, что для использования NavigationView вам понадобится последняя поддержка дизайна lib, добавив зависимость к файлу градиента вашего модуля: compile 'com.android.support:design:22.2.0'. Подробнее об этом here.

+0

Но моя main_activity уже находится в относительной компоновке, могу ли я просто добавить код виджета v4? –

+0

DrawerLayout должен быть корнем, но вы можете заменить FrameLayout в моем коде существующим RelativeLayout, он будет иметь одинаковую внешность и внешний вид, но у вас будет доступ к ящику. –

+0

Он доступен в библиотеке поддержки, см. [Конец этого сообщения] (http://android-developers.blogspot.hu/2015/05/android-design-support-library.html) об этом. В принципе, вам нужно добавить зависимость от вашего файла градиента: 'compile 'com.android.support: design: 22.2.0'' –

0

Да, вы можете осуществить DrawerLayout без ActionBar. Вы можете вручную открывать и закрывать DrawerLayout как

drawerLayout.openDrawer(Gravity.LEFT); 

    drawerLayout.closeDrawer(Gravity.LEFT); 
Смежные вопросы