2015-01-31 3 views
3

Как страницы на Android Developers говоритпанель навигации не открывается при скольжении слева

Пользователь может принести панель навигации на экране, ударяя от левого края экрана, или нажав на значок приложения на панели действий.

Но странно, что ящик навигации по моей деятельности не реагирует на скользящее действие. Он переключается только при касании значка на панели действий. Ниже приводится моя реализация ящика для навигации

mNavigationDrawerFragment = (NavigationDrawerFragment) 
      getSupportFragmentManager().findFragmentById(R.id.navigation_drawer); 

    // Set up the drawer. 
    drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); 
    mNavigationDrawerFragment.setUp(
      R.id.navigation_drawer, 
      drawerLayout); 

Есть ли какие-либо объяснения для этого? Я сомневаюсь, что моя деятельность по умолчанию имеет макет одного из его фрагментов. Так это причина?

Edit: файл макета моей деятельности

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

<!-- The main ocntent view --> 
<FrameLayout android:id="@+id/container" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 
</FrameLayout> 


<!-- The navigation drawer--> 
<fragment android:id="@+id/navigation_drawer" 
    android:layout_width="240dp" 
    android:layout_height="match_parent" 
    android:layout_gravity="start" 
    android:divider="@android:color/transparent" 
    android:name="com.example.android.handsfree.NavigationDrawerFragment" 
    tools:layout="@layout/fragment_navigation_drawer" /> 

+0

Можете ли вы предоставить свой файл макета? – Xyaren

+0

См. Edit @Xyaren – rockydgeekgod

+0

Можете ли вы закрыть выдвижной ящик скользящим жестом? – Xyaren

ответ

1

Ваш 'NavigationDrawerFragment' уже создает ящик Toggle для вас внутри его метода setUp.

Вы должны не создать новый в своей деятельности «Активность».


Примечания: Вы можете использовать android.support.v7.app.ActionBarDrawerToggle вместо v4 один внутри NavigationDrawerFragment.


Update:

Проблема, кажется, теперь решена.Были 2 проблемы:

  1. ОП создали второй ящик тумблер в его MainPage - активность, но там уже было один создан внутри метода Режима установок NavigationDrawerFragment «s, который вызывается с помощью MainPage для того, чтобы настроить ящик , (Это в основном аутсорс [кодирование] некоторых элементов ящика для фрагмента ящика.)
  2. OP заблокировал ящик внутри onCreateOptionsMenu, вызвав метод, который устанавливает DrawerLockMode в LOCK_MODE_LOCKED_CLOSED. Он никогда не возвращал это изменение.
+0

В нем говорится: 'невозможно разрешить панель инструментов символов' в' R.id.toolbar' – rockydgeekgod

+0

Где ваша панель инструментов внутри макета? В одном из приведенных выше комментариев вы сказали, что используете виджет панели инструментов. 'android.support.v7.widget.Toolbar' – Xyaren

+0

Вместо использования Android ActionBar библиотека поддержки использует ** собственный ** вид/виджет панели инструментов (см. мой макет как пример ** ** [здесь] (http : //pastebin.com/pLyBq61n) – Xyaren

0

Вы должны использовать:

drawerLayout.setDrawerLockMode (DrawerLayout.LOCK_MODE_UNLOCKED);

+1

Ящик должен быть разблокирован по умолчанию после создания. – Xyaren

+0

Это не работает – rockydgeekgod

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

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

<ListView 
    android:id="@+id/listview_drawer" 
    android:layout_width="240dp" 
    android:layout_height="match_parent" 
    android:layout_gravity="start" 
    android:background="@color/drawer" 
    android:choiceMode="singleChoice" /> 

на вашей деятельности

drawlayout = (DrawerLayout) findViewById(R.id.drawer_layout); 
    listData = (ListView) findViewById(R.id.listview_drawer); 

    drawlayout.setDrawerShadow(R.drawable.drawer_shadow, 
      GravityCompat.START); 
+0

Как это решит проблему? OP использует фрагмент ящика, который отлично подходит. – Xyaren

+0

Да. Док в Android Developers говорит, что мы можем использовать «ListView», но это не единственный способ. – rockydgeekgod

+0

, поэтому вам нужно использовать ActionBarDrawableToggle, чтобы вы могли использовать любой другой макет вместо ListView. – Akash

0

Добавьте эти поля в классе деятельности:

private ActionBarDrawerToggle mDrawerToggle; 
private DrawerLayout mDrawerLayout; 

Затем в вашей деятельности:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    ... 
    // enabling action bar app icon and behaving it as toggle button 
    getActionBar().setDisplayHomeAsUpEnabled(true); 
    getActionBar().setHomeButtonEnabled(true) 

    mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); 
    mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, 
       R.drawable.ic_drawer, //nav menu toggle icon 
       R.string.app_name, // nav drawer open - description for accessibility 
       R.string.app_name // nav drawer close - description for accessibility 
     ){ 
      public void onDrawerClosed(View view) { 
       // calling onPrepareOptionsMenu() to show action bar icons 
       invalidateOptionsMenu(); 
      } 

      public void onDrawerOpened(View drawerView) { 
       // calling onPrepareOptionsMenu() to hide action bar icons 
       invalidateOptionsMenu(); 
      } 
     }; 
     mDrawerLayout.setDrawerListener(mDrawerToggle); 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    // toggle nav drawer on selecting action bar app icon/title 
    if (mDrawerToggle.onOptionsItemSelected(item)) { 
     return true; 
    } 
    return super.onOptionsItemSelected(item); 
} 

/** 
* When using the ActionBarDrawerToggle, you must call it during 
* onPostCreate() and onConfigurationChanged()... 
*/ 

@Override 
protected void onPostCreate(Bundle savedInstanceState) { 
    super.onPostCreate(savedInstanceState); 
    // Sync the toggle state after onRestoreInstanceState has occurred. 
    mDrawerToggle.syncState(); 
} 

@Override 
public void onConfigurationChanged(Configuration newConfig) { 
    super.onConfigurationChanged(newConfig); 
    // Pass any configuration change to the drawer toggls 
    mDrawerToggle.onConfigurationChanged(newConfig); 
} 

ic_drawer - .png изображение, которое расположено в ресурсах, пригодных для использования. Вы можете найти это изображение в Google.

Уровень API для использования - 11+.

Надеюсь, это поможет вам.

+0

Конструктор, который вы использовали для 'ActionBarDrawerToggle', предназначен для' v4.app.ActionBarDrawerToggle'. То, что я использую, является 'v7.app.ActionBarDrawerToggle' Итак, для рисования нет параметров [Это] (https://developer.android.com/reference/android/support/v7/app/ActionBarDrawerToggle .html) является ссылкой – rockydgeekgod

+0

В чем разница или преимущества? –

0

1- заменить тег на:

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

    <!-- The main ocntent view --> 
    <FrameLayout android:id="@+id/container" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"> 
    </FrameLayout> 


    <!-- The navigation drawer--> 
    <ListView android:id="@+id/navigation_drawer" 
     android:layout_width="240dp" 
     android:layout_height="match_parent" 
     android:layout_gravity="start" 
     android:divider="@android:color/transparent" /> 
    </android.support.v4.widget.DrawerLayout> 

2- использовать этот код в OnCreate функции и может использовать v4 ActionBarDrawerToggle или v7 ней я использовать v4:

private DrawerLayout mDrawerLayout; 
private ActionBarDrawerToggle mDrawerToggle; 

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

mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout,R.drawable.ic_drawer, 
R.string.app_name,R.string.app_name) { 
        public void onDrawerClosed(View view) { 
         getActionBar().setTitle(mTitle); 
         invalidateOptionsMenu(); 
        } 

        public void onDrawerOpened(View drawerView) { 
         getActionBar().setTitle(mDrawerTitle); 
         invalidateOptionsMenu(); 
        } 
       }; 
       mDrawerLayout.setDrawerListener(mDrawerToggle); 
+0

Я использовал версию v7. Но кроме этого я вижу, не вижу разницы между вашим и моим кодом – rockydgeekgod

Смежные вопросы