Подтвердить что ты не робот

Что вам нужно передать 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

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

4b9b3361

Ответ 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()

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