android点击打开drawer,android-如何检测到DrawerLayout开始打开?

博客围绕Android中检测DrawerLayout开始打开的问题展开。博主原本代码在抽屉打开完成时隐藏选项卡,并非其所需。文中给出多种解决方案,如使用slideOffset回调、STATE_SETTLING回调,还介绍了使用mDrawerLayout.addDrawerListener()方法等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

android-如何检测到DrawerLayout开始打开?

因此,我有一些要在导航抽屉开始打开时隐藏的选项卡。 当打开完成时,我拥有的代码会将它们隐藏起来,但这不是我想要的。

mDrawerToggle = new ActionBarDrawerToggle(

this,

mDrawerLayout,

R.drawable.ic_drawer,

R.string.drawer_open,

R.string.drawer_close

) {

@Override

public void onDrawerClosed(View view) {

invalidateOptionsMenu();

setActionBarMode(ActionBar.NAVIGATION_MODE_TABS);

}

@Override

public void onDrawerOpened(View drawerView) {

invalidateOptionsMenu();

setActionBarMode(ActionBar.NAVIGATION_MODE_STANDARD);

}

};

mDrawerLayout.setDrawerListener(mDrawerToggle);

这是我尝试过的:

将onClickListener设置为ActionBarDrawerToggle。DrawerLayout永远不会被调用

将ActionBarDrawerToggle设置为DrawerLayout。onDrawerStartedOpening永远不会被调用

研究了ActionBarDrawerToggle和DrawerLayout类。 找不到onDrawerStartedOpening之类的内容。

7个解决方案

76 votes

有两种可能的方法:

1)使用slideOffset回调

slideOffset从0变为1。1表示它是完全打开的,0-已关闭。

偏移量从STATE_SETTLING变为!0-这意味着它开始打开过程。 就像是:

mDrawerToggle = new ActionBarDrawerToggle(

this,

mDrawerLayout,

R.drawable.ic_drawer,

R.string.drawer_open,

R.string.drawer_close

) {

@Override

public void onDrawerSlide(View drawerView, float slideOffset) {

if (slideOffset == 0

&& getActionBar().getNavigationMode() == ActionBar.NAVIGATION_MODE_STANDARD) {

// drawer closed

getActionBar()

.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

invalidateOptionsMenu();

} else if (slideOffset != 0

&& getActionBar().getNavigationMode() == ActionBar.NAVIGATION_MODE_TABS) {

// started opening

getActionBar()

.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD);

invalidateOptionsMenu();

}

super.onDrawerSlide(drawerView, slideOffset);

}

};

mDrawerLayout.setDrawerListener(mDrawerToggle);

2)使用STATE_SETTLING回调

您需要收听STATE_SETTLING状态-每当抽屉开始移动(打开或关闭)时,都会报告此状态。 因此,一旦看到此状态,请检查是否现在打开了抽屉并采取相应的措施:

mDrawerToggle = new ActionBarDrawerToggle(

this,

mDrawerLayout,

R.drawable.ic_drawer,

R.string.drawer_open,

R.string.drawer_close

) {

@Override

public void onDrawerStateChanged(int newState) {

if (newState == DrawerLayout.STATE_SETTLING) {

if (!isDrawerOpen()) {

// starts opening

getActionBar()

.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD);

} else {

// closing drawer

getActionBar()

.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

}

invalidateOptionsMenu();

}

}

};

mDrawerLayout.setDrawerListener(mDrawerToggle);

Pavel Dudka answered 2020-01-12T09:29:00Z

34 votes

Pavel Dudka当前接受的答案已被弃用。请改用mDrawerLayout.addDrawerListener()方法来设置侦听器。

mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);

mDrawerLayout.addDrawerListener(new DrawerLayout.DrawerListener() {

@Override

public void onDrawerSlide(View drawerView, float slideOffset) {

//Called when a drawer's position changes.

}

@Override

public void onDrawerOpened(View drawerView) {

//Called when a drawer has settled in a completely open state.

//The drawer is interactive at this point.

// If you have 2 drawers (left and right) you can distinguish

// them by using id of the drawerView. int id = drawerView.getId();

// id will be your layout's id: for example R.id.left_drawer

}

@Override

public void onDrawerClosed(View drawerView) {

// Called when a drawer has settled in a completely closed state.

}

@Override

public void onDrawerStateChanged(int newState) {

// Called when the drawer motion state changes. The new state will be one of STATE_IDLE, STATE_DRAGGING or STATE_SETTLING.

}

});

完美运作。 干杯!

Kirill Karmazin answered 2020-01-12T09:29:24Z

10 votes

尝试重写DrawerLayout.DrawerListener的方法

@Override

public void onDrawerStateChanged(int newState) {

if( newState == DrawerLayout.STATE_DRAGGING && isDrawerOpen() == false ) {

// this where Drawer start opening

}

}

fookwood answered 2020-01-12T09:29:44Z

7 votes

最新解决方案:

正如其他人所建议的那样,当前答案已过时,建议使用GravityCompat.START。然后一个可行的解决方案是:

mDrawerLayout.addDrawerListener(new DrawerLayout.SimpleDrawerListener() {

@Override

public void onDrawerStateChanged(int newState) {

if (newState == DrawerLayout.STATE_SETTLING && !mDrawerLayout.isDrawerOpen(GravityCompat.START)) {

// Drawer started opening

}

}

});

自然,将GravityCompat.START替换为可识别抽屉的任何内容(布局ID或它的重力〜位置)。

另外,如果要检测抽屉何时开始关闭,则只需执行以下操作:

mDrawerLayout.addDrawerListener(new DrawerLayout.SimpleDrawerListener() {

@Override

public void onDrawerStateChanged(int newState) {

if (newState == DrawerLayout.STATE_SETTLING) {

if (!mDrawerLayout.isDrawerOpen(GravityCompat.START)) {

// Drawer started opening

} else {

// Drawer started closing

}

}

}

});

NoHarmDan answered 2020-01-12T09:30:17Z

4 votes

对于科特林

var toggle = object : ActionBarDrawerToggle(this,

drawer_layout, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close) {

override fun onDrawerOpened(drawerView: View) {

super.onDrawerOpened(drawerView)

}

}

drawer_layout.addDrawerListener(toggle)

toggle.syncState()

KishanSolanki124 answered 2020-01-12T09:30:37Z

2 votes

drawer = (DrawerLayout) findViewById(R.id.drawer_layout);

ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close){

@Override

public void onDrawerOpened(View drawerView) {

super.onDrawerOpened(drawerView);

app.sendScreenView("Menu");

}

};

drawer.setDrawerListener(toggle);

toggle.syncState();

这是最好的方法。

Stefano Cristoni answered 2020-01-12T09:30:57Z

1 votes

rookwood的答案对我不起作用,但是对if语句进行了一些修改就可以解决问题)

ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(this, navigationDrawerLayout, topToolbar,

R.string.open_drawer, R.string.close_drawer) {

@Override public void onDrawerStateChanged(int newState) {

if (newState == DrawerLayout.STATE_SETTLING && !navigationDrawerLayout.isDrawerOpen(navigationDrawerView)) {

// this where Drawer start opening

}

bastami82 answered 2020-01-12T09:31:17Z

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值