Android 如何检测导航抽屉是否打开?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/21633791/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
How to detect if navigation drawer is open?
提问by Chinmay Dabke
The title explains it all. All what I want to do is to know if the navigation drawer is open or not. I searched a lot on the net and found the method isDrawerOpen(int drawerGravity)
but couldn't find a satisfactory answer which explains how to use it in a method. I would appreciate if anyone explains it to me.
标题说明了一切。我想要做的就是知道导航抽屉是否打开。我在网上搜索了很多并找到了方法,isDrawerOpen(int drawerGravity)
但找不到令人满意的答案来解释如何在方法中使用它。如果有人向我解释,我将不胜感激。
Thanks in advance!
提前致谢!
回答by Neoh
Assuming you have defined a drawerlayout in xml:
假设你已经在 xml 中定义了一个 drawerlayout:
DrawerLayout mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
...
if(mDrawerLayout.isDrawerOpen(GravityCompat.START)) {
//drawer is open
}
回答by ShakeJ
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);
That listener use:)
那个听众使用:)
回答by Jorgesys
Use:
用:
mDrawerLayout.isDrawerOpen()method
mDrawerLayout.isDrawerOpen()方法
Example:
例子:
if(mDrawerLayout.isDrawerOpen(GravityCompat.START)) {
mDrawerLayout.closeDrawer(Gravity.LEFT); //CLOSE Nav Drawer!
}else{
mDrawerLayout.openDrawer(Gravity.LEFT); //OPEN Nav Drawer!
}
回答by Gyan S Awasthi
By the following way you can find the Drawer is open or close..
通过以下方式您可以找到抽屉是打开还是关闭..
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
回答by MontDeska
shakeJ's answer its the correct one, and remember you can use the onDrawerSlideto be able to fire other functions... for example I used it to change the StatusBar Color.
ShakeJ 的答案是正确的,请记住您可以使用onDrawerSlide来触发其他功能……例如,我用它来更改状态栏颜色。
/** 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");
}
}
回答by Phan Van Linh
Detect DrawerLayout
opened, closed, slide DrawerLayout.DrawerListener
检测DrawerLayout
打开、关闭、滑动DrawerLayout.DrawerListener
DrawerLayout 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) {
}
});
Check Drawer is opened
检查抽屉已打开
if(drawerLayout.isDrawerOpen(GravityCompat.START)) // or GravityCompat.END
回答by Zealous System
May be, I am late but I can share new updated information.
In given code, I set open/close drawer in onclick function.If drawer isopen than it willbe closed else open.This solution is based on RXava DrawerLayout (androidx.drawerlayout.widget.DrawerLayout)
.
In my code I open drawerlayout from right to left.
可能是,我迟到了,但我可以分享新的更新信息。在给定的代码中,我在 onclick 函数中设置了打开/关闭抽屉。如果抽屉是打开的,则它会关闭,否则打开(androidx.drawerlayout.widget.DrawerLayout)
。此解决方案基于 RXava DrawerLayout 。在我的代码中,我从右到左打开 drawerlayout。
@Override
public void onClick(View view) {
if (drawerLayout.isDrawerVisible(GravityCompat.END)) {
drawerLayout.closeDrawer(GravityCompat.END);
}else {
drawerLayout.openDrawer(GravityCompat.END);
}
}
Note: If you open drawerLayout from right side use "GravityCompat.END"and it is open from left side, than use "GravityCompat.START". Enjoy codding.....
注意:如果从右侧打开 drawerLayout 使用"GravityCompat.END"并且从左侧打开,则使用"GravityCompat.START"。享受编码......
回答by Joe Muller
The method is the same in Kotlin.
该方法在 Kotlin 中是相同的。
Initialize the DrawerLayoutView
val drawerLayout: DrawerLayout = findViewById(R.id.drawer_layout)
Check if the drawer is open
if(drawerLayout.isDrawerOpen(GravityCompat.START)){ Log.d("Drawer","open") }
初始化DrawerLayout视图
val drawerLayout: DrawerLayout = findViewById(R.id.drawer_layout)
检查抽屉是否打开
if(drawerLayout.isDrawerOpen(GravityCompat.START)){ Log.d("Drawer","open") }
If you want to take actions automatically when the drawer is opened or closed, you can do the following.
如果您想在抽屉打开或关闭时自动采取行动,您可以执行以下操作。
In your main activity, create an inner class that is a subclass of DrawerLayout.DrawerListener. The DrawerLayout class implements the DrawerListener interface.
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) } }
Put your action in the function you want to use. In my example, I'm closing the soft keyboard if the user interacts with the navigation drawer. Declare the InputMethodManager like this in your main activity:
var imm: InputMethodManager = this.getSystemService(Activity.INPUT_METHOD_SERVICE)
Add your custom DrawerListener to the drawerLayout (I put it in the onCreate method)
var drawerListener = CustomDrawer()
drawerLayout.addDrawerListener(drawerListener)
在您的主要活动中,创建一个内部类,它是DrawerLayout.DrawerListener的子类。DrawerLayout 类实现了 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) } }
将您的操作放在您要使用的函数中。在我的示例中,如果用户与导航抽屉交互,我将关闭软键盘。在您的主要活动中像这样声明 InputMethodManager :
var imm: InputMethodManager = this.getSystemService(Activity.INPUT_METHOD_SERVICE)
将您的自定义 DrawerListener 添加到 drawerLayout (我把它放在 onCreate 方法中)
var drawerListener = CustomDrawer()
drawerLayout.addDrawerListener(drawerListener)