Как открыть навигационный ящик нажатием кнопки в главном фрагменте?
Я создал приложение с одним действием, которое использует ящик навигации, чтобы открыть несколько разных фрагментов. У меня есть actionbar drawertoggle, но это не очень заметно.
Если я помещаю кнопку в onCreateView в свой основной фрагмент (фрагмент, который появляется, когда мое приложение запускается первым), как я могу заставить его открыть ящик навигации, контролируемый моей деятельностью?
Это похоже на работу. Ответ намного проще, чем я думал, что это будет.
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View fragView = inflater.inflate(R.layout.mainmenu, container, false);
button1 = (Button) fragView.findViewById(R.id.button1);
mDrawerLayout = (DrawerLayout)getActivity().findViewById(R.id.drawer_layout);
mDrawerList = (ListView)getActivity().findViewById(R.id.left_drawer);
button1.setOnClickListener(this);
return fragView;
}
@Override
public void onClick(View v) {
mDrawerLayout.openDrawer(mDrawerList);
}
Спасибо за ваши ответы.
Ответы
Ответ 1
если вам нужно открыть слайд:
mDrawerLayout.openDrawer(Gravity.LEFT); //Edit Gravity.START need API 14
если вам нужно закрыть слайд
mDrawerLayout.closeDrawer(Gravity.LEFT); //Edit Gravity.START need API 14
ПримерEXAMPLE
мой mDrawerLayout приведен здесь:
mDrawerLayout = (DrawerLayout)findViewById(R.id.my_drawer_layout);
мое состояние слайда:
mSlideState=false;
если вам нужно знать состояние слайд-меню (закрыто, открыто). Используйте этот код:
mDrawerLayout.setDrawerListener(new ActionBarDrawerToggle(this,
mDrawerLayout,
R.drawable.ic_menu_slide,
0,
0){
@Override
public void onDrawerClosed(View drawerView) {
super.onDrawerClosed(drawerView);
mSlideState=false;//is Closed
}
@Override
public void onDrawerOpened(View drawerView) {
super.onDrawerOpened(drawerView);
mSlideState=true;//is Opened
}});
наконец. Вы можете использовать событие клика следующим образом:
public void clickEventSlide(){
if(mSlideState){
mDrawerLayout.closeDrawer(Gravity.END);
}else{
mDrawerLayout.openDrawer(Gravity.END);
}}
В моем случае мое слайд-меню находится справа (Gravity.END), но если вам это нужно слева, попробуйте с Gravity.START
Ответ 2
У меня есть гораздо более простое решение, используя isDrawerOpen()
.
Это автоматически закрывает или открывает ящик навигации в зависимости от текущего состояния ящика (Открыто/Закрыто)
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 the navigation drawer is not open then open it, if its already open then close it.
if(!navDrawer.isDrawerOpen(Gravity.START)) navDrawer.openDrawer(Gravity.START);
else navDrawer.closeDrawer(Gravity.END);
}
});
Ответ 3
если вы используете навигационную активность по умолчанию в android, вам просто нужно
добавьте этот код в нажатие кнопки кнопки --- >
mDrawerLayout.openDrawer(Gravity.START);
для закрытия вам ничего не нужно делать.
Ответ 4
Чтобы применить панель инструментов в качестве панели приложения, сначала убедитесь, что ваша деятельность выходит за пределы AppCompatActivity. Затем вызовите setSupportActionBar() и передайте объект панели инструментов из вашего макета:
toolbar=(Toolbar) findViewById(R.id.toolbar_main);
setSupportActionBar(toolbar);
ActionBar actionbar = getSupportActionBar();
actionbar.setDisplayHomeAsUpEnabled(true);
actionbar.setHomeAsUpIndicator(R.drawable.ic_menu_black_24dp);
drawerLayout=(DrawerLayout)findViewById(R.id.drawer_layout);
ActionBarDrawerToggle actionBarDrawerToggle=new ActionBarDrawerToggle(this,drawerLayout,R.string.navigation_drawer_open,
R.string.navigation_drawer_close);
drawerLayout.addDrawerListener(actionBarDrawerToggle);
actionBarDrawerToggle.syncState();
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
drawerLayout.openDrawer(GravityCompat.START);
return true;
}
return super.onOptionsItemSelected(item);
}
@Override
public void onBackPressed() {
if (drawerLayout.isDrawerOpen(GravityCompat.START)){
drawerLayout.closeDrawer(GravityCompat.START);
}
else{
super.onBackPressed();
}
}
}
Ответ 5
Используйте стандартную модель обратного вызова, как описано здесь:
http://developer.android.com/training/basics/fragments/communicating.html
Когда вы нажимаете кнопку, инициируйте обратный вызов активности и откройте ее.
Ответ 6
Используйте эти строки, чтобы открыть и закрыть ящик для определенного события:
Фрагмент кода для открытия ящика:
drawerLayout.openDrawer(Gravity.START);
Фрагмент кода для закрытия ящика:
drawerLayout.closeDrawer(Gravity.LEFT);
→ openDrawer(gravity_of_navigation_view_to_be_shown)
в openDrawer ("gravity"), в разделе "gravity", вы должны ввести гравитацию навигационного вида, как указано выше:
Gravity.LEFT
Gravity.RIGHT
Gravity.START
Gravity.END
Я думаю, что это лучший ответ.