Как открыть панель навигации при нажатии кнопки в основном фрагменте?

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

    }

Спасибо за ответ.


person user2729524    schedule 18.10.2013    source источник


Ответы (5)


если вам нужно открыть слайд:

mDrawerLayout.openDrawer(Gravity.LEFT); //Edit Gravity.START need API 14

если вам нужно закрыть слайд

mDrawerLayout.closeDrawer(Gravity.LEFT); //Edit Gravity.START need API 14

ПРИМЕР

мой 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

person Miguel Rodríguez    schedule 30.01.2015
comment
вы можете использовать mDrawerLayout.isDrawerOpen(drawerView) вместо флага - person Rowan; 13.07.2015
comment
я хочу, чтобы этот макет был выше моего обзора. В ЭТОМ ПЛАН ПЕРЕМЕЩАЕТСЯ В БОК. что я должен делать? - person DKV; 26.11.2015
comment
в вашем xml последнее (самое нижнее) объявленное представление по умолчанию будет иметь наивысший z-index (вверху), следует принять приведенный выше ответ, если он решил проблему. - person Talha; 05.12.2016
comment
Все работает нормально, но setDrawerListener устарело, необходимо использовать addDrawerListener - person MeLine; 11.04.2017

Вам следует использовать 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);
    }
});
person Sapnesh Naik    schedule 28.10.2018
comment
Вы открываете левый ящик и закрываете правый? В противном случае, почему вы используете gravity.start в первой строке и gravity.end во второй? также почему вы используете и GravityCompat, и Gravity? Просто чтобы узнать, не упустил ли я что-то, потому что в документации для обозначения ящика используется гравитация. - person A. Harkous; 09.07.2019
comment
@ A.Harkous Я открываю не левый ящик, а закрываю правый. Я использую Gravity.START и Gravity.END для того, чтобы при нажатии той же кнопки, если ящик не открыт, он будет открыт, в противном случае, если ящик уже был открыт, он закроется. Это служит для использования одной и той же кнопки для закрытия или открытия панели навигации в зависимости от ее текущего состояния. И да, использование GravityCompat было опечаткой. Починил это - person Sapnesh Naik; 09.07.2019

если вы используете навигационную активность по умолчанию в Android, вам просто нужно добавить этот код в прослушиватель нажатия кнопки --->

mDrawerLayout.openDrawer(Gravity.START);

для закрытия ничего делать не надо.

person behrad    schedule 15.03.2018
comment
В результате меню гамбургера исчезнет и будет заменено стрелкой вверх. - person AndroidDev; 27.05.2019

Используйте эти строки, чтобы открывать и закрывать ящик при определенном событии:

Фрагмент кода для открытия ящика:

drawerLayout.openDrawer(Gravity.START);

Фрагмент кода для закрытия ящика:

drawerLayout.closeDrawer(Gravity.LEFT);

openDrawer(gravity_of_navigation_view_to_be_shown)

в openDrawer («гравитация») в разделе «гравитация» вы должны ввести гравитацию в представлении навигации, как указано выше:

Gravity.LEFT
Gravity.RIGHT
Gravity.START
Gravity.END

Думаю, это лучший ответ.

person Muhammad Awais    schedule 22.09.2019

Чтобы применить панель инструментов в качестве панели приложения, сначала убедитесь, что ваша активность простирается от AppCompatActivity. Затем вызовите setSupportActionBar () и передайте объект Toolbar из вашего макета:

    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();
    }
}

}

person Kumar Ajay A.K    schedule 11.04.2019