2013-11-29 3 views
22

Я пытался переместить свой код через к DrawerLayout как предложено андроида here, как SlidingDrawer является осуждается.Что вам нужно пройти v4.widget.DrawerLayout.isDrawerOpen() /. OpenDrawer() /. CloseDrawer()

Моя проблема в том, что до сих пор DrawerLayout представляется либо очень плохо реализованным, имеет бесполезные сообщения об ошибках (без защитного программирования) и/или не объясняется достаточно хорошо в документации.

метод isDrawerOpen() описан here:

public boolean isDrawerOpen (View drawer)

Check if the given drawer view is currently in an open state. To be considered "open" the drawer must have settled into its fully visible state. To check for partial visibility use isDrawerVisible(android.view.View).

Parameters: drawer - Drawer view to check

Returns: true if the given drawer view is in an open state

Каждый из методов isDrawerOpen(View drawer), openDrawer(View drawer) и closeDrawer(View drawer) не работают, когда прошло: The DrawerLayout в вопросе или какому-либо из его детей. Я понятия не имею, что я должен использовать в этих методах, чтобы они могли функционировать. Может ли кто-нибудь сообщить мне об этом?

См. Ниже описание проблемы с реализацией.

У меня есть макет, как так:

<android.support.v4.widget.DrawerLayout 
    android:id="@+id/mainmenuPanel" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" > 

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

    <FrameLayout 
     android:id="@+id/menuPane" 
     android:layout_width="300dp" 
     android:layout_height="match_parent" /> 
</android.support.v4.widget.DrawerLayout> 

И в моем коде я следующий метод подсоединили к кнопке:

protected void onCreate(Bundle savedInstanceState) {  
    ... 
    mMenuPanel = (DrawerLayout) findViewById(R.id.mainmenuPanel); 
    .... 
} 

public boolean isDrawerOpen() { 
    if(mMenuPanel != null) { 
     return mMenuPanel.isDrawerOpen(mMenuPanel); 
    } 
    return false; 
} 

Однако, если вы даете ему себя в качестве аргумента (который был бы избыточным в крайнем случае), вы получаете следующую ошибку:

E/AndroidRuntime(11241): java.lang.ClassCastException: 
android.widget.FrameLayout$LayoutParams cannot be cast to 
android.support.v4.widget.DrawerLayout$LayoutParams 

(Что, как вы заметили, сделайте не дайте вам никакой информации о том, что вы сделали неправильно. Это вместо этого симметрия проблемы).

Другие ответы here10 или here либо непонятны, либо очень тесно связаны с вопросом без особого объяснения. Даже я попытался добавить искусственную LinearLayout или один в DrawerLayout сек детей, и каждый даст этой ошибки:

E/AndroidRuntime(11424): java.lang.IllegalArgumentException: 
View android.widget.FrameLayout{420f5ea8 V.E..... ........ 
0,0-800,1172 #7f060038 app:id/menuPane} is not a drawer 

Может кто-нибудь объяснить, что эти методы фактически должны быть переданы им работать?

ответ

18

И ответ:

Второго ребенок (он же, то «Ящик») является то, что должно быть передано методами. Моя проблема заключалась в том, что к тому времени, когда я понял это, я уменьшил макет до такой простой, насколько это возможно, чтобы протестировать - я удалил гравитацию из «ящика». Без гравитации вы получите полностью несвязанные сообщения об ошибках.

Я могу подтвердить, я получил код для работы с использованием следующей установки:

mMenuPanel.isDrawerOpen(findViewById(R.id.drawer)); 

и с макетом:

<android.support.v4.widget.DrawerLayout 
    android:id="@+id/mainmenuPanel" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" > 

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

    <FrameLayout 
     android:id="@+id/drawer" 
     android:layout_width="300dp" 
     android:layout_height="match_parent" 
     android:layout_gravity="start"/> <!-- This line was the problem!!!!!!!--> 
</android.support.v4.widget.DrawerLayout> 
+2

Да. Если вы посмотрите на источник для DrawerLayout', метод 'isDrawerOpen (...)' вызывает вызов 'isDrawer (...)', чтобы проверить, что 'View', который он передал, является ящиком. Критерии - проверить, имеет ли 'View' значение' layout_gravity' либо 'Gravity.LEFT', либо' Gravity.RIGHT'. «Start» 'layout_gravity' - это псевдоним, который может использоваться для определения того, на какой стороне ящик привязан. С языками RTL (справа налево) это будет «Gravity.RIGHT» для языков LTR, это «Gravity.LEFT». Если ни один из них не установлен для 'View', метод' isDrawer (..) 'возвращает false. – Squonk

+0

Спасибо, человек! В моем случае я был смущен тем, какую гравитацию использовать. Не '' 'android: gravity''', но' '' android: layout_gravity'''! – ruX

2

В вашей деятельности, если у вас есть ссылка на DrawerLayout и в в этом случае FrameLayout с id R.id.menuPane вы также можете сделать ...

DrawerLayout mMenuPanel = (DrawerLayout) findViewById(R.id.mainmenuPanel); 
FrameLayout mMenuPane = (FrameLayout) findViewById(R.id.menuPane); 
mMenuPanel.isDrawerOpen(mMenuPane); 

В основном вы должны передать ссылку на вид в настоящее время используется в качестве ящика внутри DrawerLayout, которая всегда будет mMenuPanel.getChildAt (1) в любом случае.

13

, если вы хотите избежать ссылок на виды или макеты, чтобы позвонить isDrawerOpen, можно применить другой способ.

В этом случае вы должны указать вес:

mDrawerLayout.isDrawerOpen(Gravity.START); 

Будучи mDrawerLayout ссылку на ваш DrawerLayout.

, как вы сказали, не забудьте android:layout_gravity="start"

-1

Если вы используете макет ящика из библиотеки поддержки, как мы можем видеть из вашего вопроса, что вы, есть также метод:

closeDrawers() 

Это закроет все открытые ящики (как правило, это один).

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

  • Нет связанных вопросов^_^