Как открыть Навигационный ящик без панели действий, открыть только кнопкой
У меня есть панель навигации без какой-либо панели действий (я не хочу панель действий). Я пытаюсь сделать так, чтобы у меня была кнопка, которая может открыть навигационный ящик.
Я знаю, что есть метод 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();
Еще лучший способ сделать это - создать прослушиватель во фрагменте и установить активность в качестве прослушивателя фрагмента. Затем вы можете вызвать метод на деятельность, аналогичную выше. Я позволю вам сделать некоторые исследования о том, как это сделать.
Работает по нажатию кнопки
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