Что вам нужно передать v4.widget.DrawerLayout.isDrawerOpen()/. OpenDrawer()/. CloseDrawer()
Я пытаюсь переместить мой код на DrawerLayout
, как было предложено андроидом здесь, поскольку SlidingDrawer
устарел.
Моя проблема в том, что до сих пор DrawerLayout
представляется либо очень плохо реализованным, имеет бесполезные сообщения об ошибках (без защитного программирования) и/или не объясняется достаточно хорошо в документации.
описан метод isDrawerOpen()
здесь:
public boolean isDrawerOpen (просмотрщик)
Проверьте, находится ли данный вид ящика в открытом состоянии. Быть считающийся "открытым", ящик должен был заселиться в его полностью видимый государство. Чтобы проверить использование частичной видимости isDrawerVisible (android.view.View).
Параметры: ящик - вид ящика для проверки
Возвращает: true, если данный вид ящика находится в открытом состоянии
Каждый из методов isDrawerOpen(View drawer)
, openDrawer(View drawer)
и closeDrawer(View drawer)
не работает при передаче: 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
(что, как вы заметили, не дает вам никакой информации о том, что вы сделали неправильно, а скорее является симметром проблемы).
Другие ответы здесь или здесь либо непонятны, либо очень тесно связаны с вопросом без особого объяснения. Тем не менее я попытался добавить faux 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
Может ли кто-нибудь объяснить, что эти методы действительно должны были передать им для работы?
Ответы
Ответ 1
И ответ:
Второй ребенок (ака, "Ящик" ) - это то, что нужно передать методам. Моя проблема заключалась в том, что к тому времени, когда я понял это, я уменьшил макет до такой простой, насколько это возможно, чтобы протестировать - я удалил гравитацию из "ящика". Без гравитации вы получите полностью несвязанные сообщения об ошибках.
Я могу подтвердить, что я получил код для работы, используя следующую настройку:
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
если вы хотите избежать ссылок на представления или макеты, чтобы вызвать isDrawerOpen, можно применить другой способ.
В этом случае вы должны указать Gravity:
mDrawerLayout.isDrawerOpen(Gravity.START);
Быть mDrawerLayout ссылкой на ваш DrawerLayout.
как вы сказали, не забудьте android:layout_gravity="start"
Ответ 3
В вашей деятельности, если у вас есть ссылка на 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) в любом случае.
Ответ 4
Если вы используете макет ящика из библиотеки поддержки, как мы можем видеть из вашего вопроса, который вы есть, есть также метод:
closeDrawers()
Это закроет все открытые ящики (обычно это один).