Tytuł wyjaśnia wszystko. Chcę tylko wiedzieć, czy szuflada nawigacji jest otwarta, czy nie. Szukałem dużo w sieci i znalazłem metodę, isDrawerOpen(int drawerGravity)
ale nie mogłem znaleźć satysfakcjonującej odpowiedzi, która wyjaśnia, jak jej użyć w metodzie. Byłbym wdzięczny, gdyby ktoś mi to wyjaśnił.
Z góry dziękuję!
android
android-navigation
Chinmay Dabke
źródło
źródło
boolean drawerOpen = mDrawerLayout.isDrawerOpen(mDrawerList)
. mDrawerLayout to szuflada, a mDrawerList to widok listyOdpowiedzi:
Zakładając, że zdefiniowałeś drawerlayout w xml:
DrawerLayout mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); ... if(mDrawerLayout.isDrawerOpen(GravityCompat.START)) { //drawer is open }
źródło
mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); mDrawerToggle = new ActionBarDrawerToggle( this, /* host Activity */ mDrawerLayout, /* DrawerLayout object */ R.drawable.ic_drawer, /* nav drawer icon to replace 'Up' caret */ R.string.drawer_open, /* "open drawer" description */ R.string.drawer_close /* "close drawer" description */ ) { /** Called when a drawer has settled in a completely closed state. */ public void onDrawerClosed(View view) { super.onDrawerClosed(view); getActionBar().setTitle(mTitle); } /** Called when a drawer has settled in a completely open state. */ public void onDrawerOpened(View drawerView) { super.onDrawerOpened(drawerView); getActionBar().setTitle(mDrawerTitle); } }; // Set the drawer toggle as the DrawerListener mDrawerLayout.setDrawerListener(mDrawerToggle);
Ten słuchacz używa :)
źródło
Posługiwać się:
mDrawerLayout.isDrawerOpen () Sposób
Przykład:
if(mDrawerLayout.isDrawerOpen(GravityCompat.START)) { mDrawerLayout.closeDrawer(Gravity.LEFT); //CLOSE Nav Drawer! }else{ mDrawerLayout.openDrawer(Gravity.LEFT); //OPEN Nav Drawer! }
źródło
W następujący sposób możesz sprawdzić, czy szuflada jest otwarta lub zamknięta.
public class YourActivity extends AppCompatActivity implements DrawerLayout.DrawerListener { protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_dash_board); DrawerLayout drawer=(DrawerLayout)findViewById(R.id.container); drawer.setDrawerListener(this); }//onCreate() @Override public void onDrawerOpened(View arg0) { //write your code } @Override public void onDrawerClosed(View arg0) { //write your code } @Override public void onDrawerSlide(View arg0, float arg1) { //write your code } @Override public void onDrawerStateChanged(int arg0) { //write your code } }//class
źródło
Odpowiedź shakeJ jest poprawna i pamiętaj, że możesz użyć onDrawerSlide, aby uruchomić inne funkcje ... na przykład użyłem go do zmiany koloru StatusBar.
/** Called when a drawer has settled in a completely closed state. */ public void onDrawerClosed(View view) { super.onDrawerClosed(view); isOpen = false; } /** Called when a drawer has settled in a completely open state. */ public void onDrawerOpened(View drawerView) { super.onDrawerOpened(drawerView); isOpen = true; } public void onDrawerSlide(View drawerView,float slideOffset){ super.onDrawerSlide(drawerView,slideOffset); if(!isOpen){ setStatusBarColor("#00102b"); } if(isOpen){ setStatusBarColor("#EFEFF0"); } }
źródło
Wykryj
DrawerLayout
otwarte, zamknięte, przesuń DrawerLayout.DrawerListenerDrawerLayout drawerLayout: drawerLayout.addDrawerListener(new DrawerLayout.DrawerListener() { /** * Called when a drawer's position changes. * * @param slideOffset The new offset of this drawer within its range, from 0-1 * Example when you slide drawer from left to right, slideOffset will increase from 0 - 1 (0 when drawer closed and 1 when drawer display full) */ @Override public void onDrawerSlide(@NonNull View drawerView, float slideOffset) { } @Override public void onDrawerOpened(@NonNull View drawerView) { // do something when drawer opened } @Override public void onDrawerClosed(@NonNull View drawerView) { // do something when drawer closed } /** * Called when the drawer motion state changes. The new state will * be one of {@link #STATE_IDLE}, {@link #STATE_DRAGGING} or {@link #STATE_SETTLING}. */ @Override public void onDrawerStateChanged(int newState) { } });
Sprawdź, czy szuflada jest otwarta
if(drawerLayout.isDrawerOpen(GravityCompat.START)) // or GravityCompat.END
źródło
Metoda jest taka sama w Kotlinie.
Zainicjuj widok DrawerLayout
val drawerLayout: DrawerLayout = findViewById(R.id.drawer_layout)
Sprawdź, czy szuflada jest otwarta
if(drawerLayout.isDrawerOpen(GravityCompat.START)){ Log.d("Drawer","open") }
Jeśli chcesz, aby działania były wykonywane automatycznie po otwarciu lub zamknięciu szuflady, możesz wykonać następujące czynności.
W swoim głównym działaniu utwórz klasę wewnętrzną, która jest podklasą klasy DrawerLayout.DrawerListener . Klasa DrawerLayout implementuje interfejs DrawerListener.
inner class CustomDrawer : DrawerLayout.DrawerListener{ override fun onDrawerStateChanged(newState: Int) { } override fun onDrawerSlide(drawerView: View, slideOffset: Float) { imm.hideSoftInputFromWindow(drawerView?.getWindowToken(), 0) } override fun onDrawerClosed(drawerView: View) { imm.hideSoftInputFromWindow(drawerView?.getWindowToken(), 0) } override fun onDrawerOpened(drawerView: View) { imm.hideSoftInputFromWindow(drawerView?.getWindowToken(), 0) } }
Umieść swoją akcję w funkcji, której chcesz użyć. W moim przykładzie zamykam klawiaturę programową, jeśli użytkownik wchodzi w interakcję z szufladą nawigacji. Zadeklaruj InputMethodManager w następujący sposób w swoim głównym działaniu:
var imm: InputMethodManager = this.getSystemService(Activity.INPUT_METHOD_SERVICE)
Dodaj swój niestandardowy DrawerListener do drawerLayout (umieściłem go w metodzie onCreate)
var drawerListener = CustomDrawer()
drawerLayout.addDrawerListener(drawerListener)
źródło
Może, spóźniłem się, ale mogę udostępnić nowe zaktualizowane informacje. W podanym kodzie ustawiam otwieranie / zamykanie szuflady w funkcji onclick. Jeśli szuflada jest otwarta, to w przeciwnym razie będzie otwarta
(androidx.drawerlayout.widget.DrawerLayout)
. Rozwiązanie to bazuje na RXava DrawerLayout . W moim kodzie otwieram drawerlayout od prawej do lewej.@Override public void onClick(View view) { if (drawerLayout.isDrawerVisible(GravityCompat.END)) { drawerLayout.closeDrawer(GravityCompat.END); }else { drawerLayout.openDrawer(GravityCompat.END); } }
Uwaga: Jeśli otworzysz drawerLayout z prawej strony, użyj „GravityCompat.END” i jest otwarta z lewej strony, użyj „GravityCompat.START” . Miłego kodowania .....
źródło