Я пытался переместить свой код через к 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
Может кто-нибудь объяснить, что эти методы фактически должны быть переданы им работать?
Да. Если вы посмотрите на источник для DrawerLayout', метод 'isDrawerOpen (...)' вызывает вызов 'isDrawer (...)', чтобы проверить, что 'View', который он передал, является ящиком. Критерии - проверить, имеет ли 'View' значение' layout_gravity' либо 'Gravity.LEFT', либо' Gravity.RIGHT'. «Start» 'layout_gravity' - это псевдоним, который может использоваться для определения того, на какой стороне ящик привязан. С языками RTL (справа налево) это будет «Gravity.RIGHT» для языков LTR, это «Gravity.LEFT». Если ни один из них не установлен для 'View', метод' isDrawer (..) 'возвращает false. – Squonk
Спасибо, человек! В моем случае я был смущен тем, какую гравитацию использовать. Не '' 'android: gravity''', но' '' android: layout_gravity'''! – ruX