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

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

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

Я знаю, что существует метод openDrawer для DrawerLayout http://developer.android.com/reference/android/support/v4/widget/DrawerLayout.html#openDrawer(android.view.View)

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

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

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

EDIT: Этот код находится внутри фрагмента, и я пытаюсь отнести этот макет ящика за пределы фрагмента. Я использовал отладчик, и он показывает, что mDrawlerLayout имеет значение NULL.

Любые советы?

Спасибо!

4b9b3361

Ответ 1

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

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

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

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

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

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

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

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

Затем в фрагменте вы можете вызвать:

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

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

Ответ 2

drawerLayout.openDrawer(Gravity.START);

Ответ 3

Благодаря @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);
            }
        });

Ответ 4

У меня есть более простое решение, которое использует 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);
    }
});

Ответ 5

Я написал ответ об этом здесь: fooobar.com/questions/209840/...

   //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

Ответ 6

Он работает при нажатии кнопки

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

            drawer.openDrawer(GravityCompat.START);

        }
    });