Как открыть Навигационный ящик без панели действий, открыть только кнопкой

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

Я знаю, что есть метод openDrawer для DrawerLayout http://developer.android.com/reference/android/support/v4/widget/DrawerLayout.html

Я не знал, как его использовать, но я пытался сделать кнопку при нажатии, запускает этот метод:

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

Когда я нажимаю на него, это дает мне Java NullPointerException. У кого-нибудь есть идеи?

РЕДАКТИРОВАТЬ: Этот код находится внутри фрагмента, и я пытаюсь ссылаться на макет этого ящика за пределами фрагмента. Я использовал отладчик, и он показывает, что mDrawlerLayout имеет значение NULL.

Любой совет?

Спасибо!

6 ответов

Решение

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

Быстрый взлом, чтобы сделать то, что вы хотите, это найти вид:

getActivity().findViewById(R.id.drawer_layout)

Это должно работать. Лучше всего иметь метод, позволяющий открыть ящик.

public void openDrawer(){
    mDrawerLayout.openDrawer(mDrawerLayout);
}

В действии onCreate запустите ваш findViewById:

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

mDrawerLayout должен быть переменной-членом вашей деятельности.

Тогда в свой фрагмент вы можете позвонить:

//cast activity to MyActivity so compiler doesn't complain
((MyActivity)getActivity()).openDrawer();

Еще лучший способ сделать это - создать прослушиватель во фрагменте и установить активность в качестве прослушивателя фрагмента. Затем вы можете вызвать метод на деятельность, аналогичную выше. Я позволю вам сделать некоторые исследования о том, как это сделать.

drawerLayout.openDrawer(Gravity.START);

Работает по нажатию кнопки

mButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

            drawer.openDrawer(GravityCompat.START);

        }
    });

У меня есть более простое решение, которое использует isDrawerOpen() из DrawerLayout,

Приведенный ниже код закрывает или открывает панель навигации в зависимости от текущего состояния ящика (Открыто / Закрыто)

Button hamMenu = findViewById(R.id.ham_menu);
hamMenu.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        DrawerLayout navDrawer = findViewById(R.id.drawer_layout);
        // If navigation drawer is not open yet open it else close it.
        if(!navDrawer.isDrawerOpen(GravityCompat.START)) navDrawer.openDrawer(Gravity.START);
        else navDrawer.closeDrawer(Gravity.END);
    }
});

Спасибо @athor & @Ashish Tana.

Мне потребовалось так много времени, чтобы выяснить ошибку (NullPointerException) Я получаю.

Мой работает так; Вместо getView(), Я использую getActivity() и откройте ящик mDrawerLayout.openDrawer(Gravity.LEFT);,

mDrawerLayout = (DrawerLayout) getActivity().findViewById(R.id.drawer_layout);
final ImageButton btnOpenDrawer = (ImageButton) getView().findViewById(R.id.drawer_menu);

        btnOpenDrawer.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mDrawerLayout.openDrawer(Gravity.LEFT);
            }
        });

Я написал ответ об этом здесь: /questions/6845185/kak-otkryit-drawer-layout-tolko-knopkoj/6845195#6845195

   //For me a better way in avoiding a `null pointer` in getting the DrawerLayout
   final DrawerLayout drawer = (DrawerLayout) getActivity().findViewById(R.id.drawer_layout);
   btn.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                            //Opens the Drawer
                drawer.openDrawer(Your View, Usually a ListView);
            }

                return false;
        });

Вы непосредственно получаете текущий ящик внутри представления /fragement, чтобы вы не получили NullPointerException

Решение Kotlin
Если вы хотите открыть его из фрагмента, вы можете использовать:

activity?.drawerLayout?.openDrawer(GravityCompat.START)

или непосредственно внутри активности:

drawerLayout.openDrawer(GravityCompat.START)

Примечание.
Если вы не знакомы с символом "?", Я настоятельно рекомендую прочитать о нулевой безопасности из документации kotlin (она очень короткая, не беспокойтесь): https://kotlinlang.org/docs/reference/null-safety.html

Другие вопросы по тегам