そのため、ナビゲーションドロワーstartsを開いたときに非表示にするタブがあります。私が持っているコードは、開いたときにそれらを隠していますが、それは私が望むものではありません。
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
をmDrawerLayout
に設定します。 onClick
は呼び出されませんonTouchListener
をmDrawerLayout
に設定します。 onTouch
は呼び出されませんActionBarDrawerToggle
およびDrawerLayout
クラスを調査しました。 onDrawerStartedOpening
のようなものが見つかりませんでした。これを行うには2つの方法があります。
1)onDrawerSlide(View drawerView, float slideOffset)
callbackを使用
slideOffset
は0から1に変わります。_1
_は完全に開いていること、_0
_-閉じていることを意味します。
オフセットが_0
_から_!0
_に変更されると、-startedプロセスを開くことを意味します。何かのようなもの:
_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)Use onDrawerStateChanged(int newState)
callback
_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による現在受け入れられている回答は既に廃止されています。代わりに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.
}
});
完全に動作します。乾杯!
drawerLayout.DrawerListenerのメソッドをオーバーライドしよう
@Override
public void onDrawerStateChanged(int newState) {
if( newState == DrawerLayout.STATE_DRAGGING && isDrawerOpen() == false ) {
// this where Drawer start opening
}
}
最新のソリューション:
他の人が示唆したように、現在の答えは時代遅れであり、mDrawerLayout.addDrawerListener()
を使用することをお勧めします。実用的なソリューションは次のとおりです。
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
}
}
}
});
コトリン用
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()
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();
それが最良の方法です。
fookwoodの答えは私にとってはうまくいきませんでしたが、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
}