Android 如何在导航抽屉打开和关闭时更改按钮图像
我的导航片段有一个导航按钮,该按钮将变为活动状态,并在单击时打开导航抽屉菜单: 现在,当我单击它时,它将变为活动状态,如下所示: 但是,我希望将其与导航抽屉相关联,这样即使我没有单击按钮并滑动打开导航抽屉,当导航抽屉菜单打开时,按钮将变为活动状态,当从右向左滑动关闭时,按钮将变为红色/非活动状态。我尝试使用的代码如下所示:Android 如何在导航抽屉打开和关闭时更改按钮图像,android,android-fragments,android-activity,android-fragmentactivity,android-navigation,Android,Android Fragments,Android Activity,Android Fragmentactivity,Android Navigation,我的导航片段有一个导航按钮,该按钮将变为活动状态,并在单击时打开导航抽屉菜单: 现在,当我单击它时,它将变为活动状态,如下所示: 但是,我希望将其与导航抽屉相关联,这样即使我没有单击按钮并滑动打开导航抽屉,当导航抽屉菜单打开时,按钮将变为活动状态,当从右向左滑动关闭时,按钮将变为红色/非活动状态。我尝试使用的代码如下所示: private boolean mIsNavigationOpen = false; private DrawerLayout drawerLayout;
private boolean mIsNavigationOpen = false;
private DrawerLayout drawerLayout;
private NavigationPanelFragment dlDrawer;
private ActionBarDrawerToggle actionBarDrawerToggle;
public boolean isNavigationOpen() {
return mIsNavigationOpen;
}
//----------Code for Navigation open logo button active/inactive instances
@SuppressWarnings("deprecation")
public void setNavigationOpen(final boolean isNavigationOpen) {
this.mIsNavigationOpen = isNavigationOpen;
final ImageButton mainButton = (ImageButton) findViewById(R.id.button_main);
if(isNavigationOpen) {
mainButton.setBackgroundResource(R.drawable.bg_helios_active);
} else {
mainButton.setBackgroundDrawable(null);
}
@Override
protected void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main_activity);
//----------Code for Navigation Drawer setup
// 2. App Icon
drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
// 2.1 create ActionBarDrawerToggle
actionBarDrawerToggle = new ActionBarDrawerToggle(this, drawerLayout,
R.drawable.arrow_up, R.string.drawer_open, R.string.drawer_close){
/** Called when a drawer has settled in a completely closed state. */
public void onDrawerClosed(View view) {
// getActionBar().setTitle(NavigationPanelFragment.activeFragmentTitle);
// invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu()
}
/** Called when a drawer has settled in a completely open state. */
public void onDrawerOpened(View drawerView) {
// getActionBar().setTitle(NavigationPanelFragment.activeFragmentTitle);
// invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu()
}
};
// 2.2 Set actionBarDrawerToggle as the DrawerListener
drawerLayout.setDrawerListener(actionBarDrawerToggle);
}
@Override
protected void onPostCreate(Bundle savedInstanceState) {
super.onPostCreate(savedInstanceState);
// Sync the toggle state after onRestoreInstanceState has occurred.
actionBarDrawerToggle.syncState();
}
private void setupOnClickListenerForMainButton() {
final ImageButton mainButton = (ImageButton) findViewById(R.id.button_main);
mainButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(final View v) {
toggleNavigationPanel();
}
});
}
@Override
public boolean onMenuItemSelected(final int featureId, final MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
toggleNavigationPanel();
break;
default:
break;
}
return super.onMenuItemSelected(featureId, item);
}
public void onNewsClicked(final View view) {
if(mIsNavigationOpen) {
toggleNavigationPanel();
}
if (isFragmentVisible(NewsFragment.TAG_NEWS_FRAGMENT)) {
return;
}
FragmentStackManager.getInstance().clearBackStack(getSupportFragmentManager());
mActiveFragment = NewsFragment.newInstance(getSupportFragmentManager());
updateActionBarTitle();
//For swipe action close drawer on button click
drawerLayout.closeDrawer(R.id.drawer);
}
public void onListsClicked(final View view) {
if(mIsNavigationOpen) {
toggleNavigationPanel();
}
if (isFragmentVisible(ListsContainerFragment.TAG_LIST_CONTAINER_FRAGMENT)) {
return;
}
FragmentStackManager.getInstance().clearBackStack(getSupportFragmentManager());
mActiveFragment = ListsContainerFragment.newInstance(getSupportFragmentManager());
updateActionBarTitle();
//For swipe action close drawer on button click
drawerLayout.closeDrawer(R.id.drawer);
}
private void toggleNavigationPanel() {
//final FragmentStackManager manager = FragmentStackManager.getInstance();
if (mIsNavigationOpen) {
//NavigationPanelFragment.removeInstance(getSupportFragmentManager());
updateActionBarTitle();
drawerLayout.closeDrawer(R.id.drawer);
} else {
drawerLayout.openDrawer(R.id.drawer);
final TextView title = (TextView) findViewById(R.id.main_title);
title.setText(getString(R.string.title_applications));
//NavigationPanelFragment.newInstance(getSupportFragmentManager(), manager.getTopTitle());
}
setNavigationOpen(!mIsNavigationOpen);
}
您可能希望将注意力集中在主按钮和togglenavigationpanel上。我添加了条件if(drawerlayout.isdraweropen(R.id.drawer)){closedrawerlayout…}
但这并没有奏效。我想知道是否有人对此有任何想法
谢谢 设置抽屉后,将添加一个侦听器,该侦听器具有抽屉处于两种最终状态时的回调功能,因此您需要做的是重置这些回调中的可提取内容。我已经展示了我认为您的最终代码应该是什么样子,减去一些您需要做的清理,希望它能有所帮助
private DrawerLayout drawerLayout;
private NavigationPanelFragment dlDrawer;
private ActionBarDrawerToggle actionBarDrawerToggle;
private ImageButton mDrawerButton; //Store it! - findViewById is *Expensive*
private TextView mTitle;
@Override
protected void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main_activity);
mTitle = (TextView) findViewById(R.id.main_title);
mDrawerButton = (ImageButton) findViewById(R.id.button_main);
drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
actionBarDrawerToggle = new ActionBarDrawerToggle(this, drawerLayout,
R.drawable.arrow_up, R.string.drawer_open, R.string.drawer_close) {
public void onDrawerClosed(View view) {
mDrawerButton.setImageResource(R.drawable.bg_helios_inactive);
}
public void onDrawerOpened(View drawerView) {
mDrawerButton.setImageResource(R.drawable.bg_helios_active);
}
};
drawerLayout.setDrawerListener(actionBarDrawerToggle);
setupOnClickListenerForMainButton(;
}
@Override //Note: I'd imagine this should be in onResume ...
protected void onPostCreate(Bundle savedInstanceState) {
super.onPostCreate(savedInstanceState);
actionBarDrawerToggle.syncState();
}
private void setupOnClickListenerForMainButton() {
mDrawerButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(final View v) {
toggleNavigationPanel();
}
});
}
...
private void toggleNavigationPanel() {
//if ( drawerLayout.isOpen() ) { //I dont know what methods these objects have
if ( dlDrawer.isOpen() ) { //but one of these must be sensibly storing its own state
updateActionBarTitle();
drawerLayout.closeDrawer(R.id.drawer);
} else {
drawerLayout.openDrawer(R.id.drawer);
mTitle.setText(getString(R.string.title_applications));
}
}
你为什么不使用
onDrawerClosed
和onDrawerOpened
?我如何使用它?你能用代码来说明吗?另外,仅供参考,我添加了public void onDrawerClosed(视图视图视图){toggleNavigationPanel()}public void onDrawerOpened(视图抽屉视图){toggleNavigationPanel()}它对滑动有效,但一旦单击,它就会因空指针异常而崩溃。它似乎在mDrawerButton.setImageResource上崩溃(R.drawable.bg_helios_active);具有空指针异常。但是,当我返回到原始实现并仅添加toggleNavigationPanel()时在Oncreate的onDrawerOpened/Ondrawerclosed中,它确实可以识别导航抽屉的滑动,并相应地将helios按钮切换为selected和Unselected,但只要我单击helios按钮,它就会崩溃,出现空指针异常,我想知道是什么原因导致您切换到GlenAvigationPanel()的崩溃在由toggleNavigationPanel()的操作触发的回调中,它将如何工作?确保在oncreate(mDrawerButton)中找到图像视图,并查看日志猫以了解更多信息我需要在单击按钮时保留isNavigationPen()函数,所以我要将条件定义为(isNavigationPen())| | drawerLayout.isDrawerOpen(R.id.drawer)){updateActionBarTitle();drawerLayout.closeDrawer(R.id.drawer);}else{drawerLayout.openDrawer(R.id.drawer);mTitle.setText(getString(R.string.title_应用程序))}?保留该变量会带来麻烦,因为抽屉应该知道它的状态,然后你也会存储一个单独的状态表示,它可能会失去同步。使用(或添加,如果必要)状态到抽屉和isDrawerOpen方法。drawerLayout.closeDrawer和openDrawer应更新状态,因此绝对没有理由将其存储在此处,脱离上下文即使我更改了所有内容并将任何内容放在公共空间onDrawerClosed(视图)中它在android.support.v4.widget.DrawerLayout.updateDrawerState(DrawerLayout.java:459)的android.support.v4.widget.DrawerLayout$ViewDragCallback.onViewDragStateChanged(DrawerLayout.java:1348)的android.support.v4.widget.ViewDragHelper.setDragState(ViewDragHelper.java:866)上由于空指针异常而崩溃在android.os.Handler.handleCallback(Handler.java:615)的android.os.Handler.dispatchMessage(Handler.java:92)的android.support.v4.widget.ViewDragHelper$2.run(ViewDragHelper.java:335)