Как открыть навигационный ящик без панели действий, открыть с помощью одной кнопки
У меня есть панель навигации без любой панели действий (я не хочу панель действий). Я пытаюсь сделать так, чтобы у меня была кнопка, открывающая ящик навигации.
Я знаю, что существует метод 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.
Любые советы?
Спасибо!
Ответы
Ответ 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);
}
});