android - 如何使用抽屉导航打开和关闭更改我的按钮图像

标签 android android-fragments android-activity android-fragmentactivity android-navigation

我的导航 fragment 有一个导航按钮,它会在单击时变为 Activity 状态并打开抽屉导航菜单: enter image description here

现在当我点击它时,它会激活如下: enter image description here

但是,我想将它与抽屉导航相关联,即使我不单击按钮并滑动打开抽屉导航,按钮也会在抽屉导航菜单打开和滑动关闭时变为 Activity 状态从右向左返回,按钮变为红色/不活动。我尝试使用的代码如下:

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);
    }

您可能希望专注于 main_button 和 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));
    }
}

关于android - 如何使用抽屉导航打开和关闭更改我的按钮图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20246119/

相关文章:

android - 使用哪个上下文?

android - 在 Android 中执行搜索时如何完成当前 Activity ?

android - 当我使用 ADB 通过终端运行深层链接时,深层链接未正确打开

android - 在弃用 onAttach(Activity activity) 后如何检查 Activity 是否实现了接口(interface)

Android View 在屏幕重定向时出现渲染错误?

java - 1 个 Activity 上的操作按钮?

java - ViewHolder从Adapter从Fragment启动Activity,Activity如何与Fragment对话?

android - 我正在从广播接收器开始一个 Activity ,但为什么我的其他 Activity 也开始了?

android - 有什么简单的方法可以在 Android 中更改 Spinner 下拉菜单的颜色?

android - 无法让应用程序以编程方式解锁键盘 [现有解决方案均无效!]