选择项目时,导航抽屉不会关闭

时间:2015-03-10 13:50:21

标签: android android-fragments enums android-navigation

我有一个导航抽屉,当选择一个项目时,它会加载新的片段但从不关闭抽屉。我的导航抽屉代码如下所示:

import android.IntentIntegrator;
import android.IntentResult;
import android.annotation.TargetApi;
import android.app.SearchManager;
import android.content.Context;
import android.content.Intent;
import android.content.res.Configuration;
import android.os.Build;
import android.os.Bundle;
import android.support.v4.app.ActionBarDrawerToggle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBarActivity;
import android.support.v7.widget.SearchView;
import android.support.v7.widget.Toolbar;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.Spinner;
import android.widget.Toast;



/**
 * Created by Mike and Simon on 2/22/14.
 */
public class MainDrawer2 extends ActionBarActivity
{
    private static final String EXTRA_NAV_ITEM    = "extraNavItem";
    private static final String STATE_CURRENT_NAV = "stateCurrentNav";

    private ActionBarDrawerToggle mDrawerToggle;
    private DrawerLayout mDrawerLayout;


    private NavDrawerListAdapter mDrawerAdapter;
    private ListView mDrawerList;

    private CharSequence mTitle;
    private CharSequence mDrawerTitle;

    private MainNavItem mCurrentNavItem;


    public static Intent createLaunchFragmentIntent(Context context, MainNavItem navItem)
    {
        return new Intent(context, MainDrawer2.class)
                .putExtra(EXTRA_NAV_ITEM, navItem.ordinal());
    }



    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.fragment_main);



        //Crashlytics.start(this);

        mTitle = mDrawerTitle = getTitle();
        mDrawerLayout = (DrawerLayout)findViewById(R.id.drawer_layout);
        mDrawerList   = (ListView)findViewById(R.id.drawer);

        // Set a toolbar to replace the action bar.
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        toolbar.setTitleTextColor(0xFFFFFFFF);

        setSupportActionBar(toolbar);

        //getActionBar().setDisplayHomeAsUpEnabled(true);
        //enableHomeButtonIfRequired();

        mDrawerAdapter = new NavDrawerListAdapter(getApplicationContext());
        mDrawerList.setAdapter(mDrawerAdapter);
        mDrawerList.setOnItemClickListener(new ListView.OnItemClickListener()
        {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id)
            {
                displayNavFragment((MainNavItem)parent.getItemAtPosition(position));
            }
        });

        mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout,
                R.drawable.ic_menu_white, R.string.app_name, R.string.app_name)
        {
            public void onDrawerClosed(View view)
            {
                //getActionBar().setTitle(mTitle);
                invalidateOptionsMenu();
            }

            public void onDrawerOpened(View drawerView)
            {
                //getActionBar().setTitle(mDrawerTitle);
                invalidateOptionsMenu();
            }
        };

        mDrawerLayout.setDrawerListener(mDrawerToggle);

        if(getIntent().hasExtra(EXTRA_NAV_ITEM)){
            MainNavItem navItem = MainNavItem.values()
                    [getIntent().getIntExtra(EXTRA_NAV_ITEM,
                    MainNavItem.STATISTICS.ordinal())];
            displayNavFragment(navItem);
        }
        else if(savedInstanceState != null){
            mCurrentNavItem = MainNavItem.values()
                    [savedInstanceState.getInt(STATE_CURRENT_NAV)];
            setCurrentNavItem(mCurrentNavItem);
        }
        else{
            displayNavFragment(MainNavItem.STATISTICS);
        }
    }

    @TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH)
    private void enableHomeButtonIfRequired()
    {
        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH){
            //getActionBar().setHomeButtonEnabled(true);
        }
    }
    public void setActionBarTitle(String title) {
        //getActionBar().setTitle(title);
    }


    @Override
    public void setTitle(CharSequence title)
    {
        mTitle = title;
        //getActionBar().setTitle(mTitle);
    }

    @Override
    protected void onPostCreate(Bundle savedInstanceState)
    {
        super.onPostCreate(savedInstanceState);
        // Sync the toggle state after onRestoreInstanceState has occurred.
        mDrawerToggle.syncState();
    }

    @Override
    public void onConfigurationChanged(Configuration newConfig)
    {
        super.onConfigurationChanged(newConfig);
        // Pass any configuration change to the drawer toggles
        mDrawerToggle.onConfigurationChanged(newConfig);
    }

    @Override
    protected void onSaveInstanceState(Bundle outState)
    {
        super.onSaveInstanceState(outState);

        if (mCurrentNavItem == null){


        }
        else{
            outState.putInt(STATE_CURRENT_NAV, mCurrentNavItem.ordinal());
        }

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu)
    {
        getMenuInflater().inflate(R.menu.main, menu);

        return true;
    }

    /*
    @Override
    public boolean onPrepareOptionsMenu(Menu menu)
    {
        // if nav drawer is opened, hide the action items
        boolean drawerOpen = mDrawerLayout.isDrawerOpen(mDrawerList);
        menu.findItem(R.id.action_settings).setVisible(!drawerOpen);
        return super.onPrepareOptionsMenu(menu);
    }
    */



    private void displayNavFragment(MainNavItem navItem)
    {
        //if(navItem == mCurrentNavItem){
        //  return;
        //}
        Fragment fragment = Fragment.instantiate(this,
                navItem.getFragClass().getName());
        if(fragment != null){

            getSupportFragmentManager().beginTransaction()
                    .replace(R.id.main, fragment)
                    .commit();
            //setCurrentNavItem(navItem);
        }
    }

    private void setCurrentNavItem(MainNavItem navItem)
    {
        int position = navItem.ordinal();
        // If navItem is in DrawerAdapter

        if(position >= 0 && position < mDrawerAdapter.getCount()){
            //mDrawerList.setItemChecked(position, true);
        }
        else{
            // navItem not in DrawerAdapter, de-select current item
            if(mCurrentNavItem != null){
                //mDrawerList.setItemChecked(mCurrentNavItem.ordinal(), false);
            }
        }

        //test to keep item not selected
        int toClear=mDrawerList.getCheckedItemPosition();

        if (toClear >= 0) {
            mDrawerList.setItemChecked(toClear, false);
        }

        mDrawerLayout.closeDrawer(mDrawerList);
        //setTitle(navItem.getTitleResId());
        mCurrentNavItem = navItem;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {

        switch (item.getItemId()) {
            case android.R.id.home:
                if(mDrawerLayout.isDrawerOpen(mDrawerList)) {
                    mDrawerLayout.closeDrawer(mDrawerList);

                }
                else {
                    mDrawerLayout.openDrawer(mDrawerList);
                }
                return true;
            default:

                return super.onOptionsItemSelected(item);
        }
    }




    public void goToSearch(MenuItem item){

        //go to search page
        Fragment Fragment_one;
        FragmentManager man= getSupportFragmentManager();
        FragmentTransaction tran = man.beginTransaction();
        Fragment_one = new Search();

        tran.replace(R.id.main, Fragment_one);//tran.
        tran.addToBackStack(null);
        tran.commit();

    }

    public void scanBarcode(MenuItem item){

        //open scanner
        IntentIntegrator scanIntegrator = new IntentIntegrator(this);
        scanIntegrator.initiateScan();



    }

    public void onActivityResult(int requestCode, int resultCode, Intent intent) {

        //retrieve scan result
        IntentResult scanningResult = IntentIntegrator.parseActivityResult(requestCode, resultCode, intent);
        if (scanningResult != null) {
            //we have a result

            String scanContent = scanningResult.getContents();

            //todo: set scan content into setting, load new fragment which calls async task below. New
            //todo: fragment will have same ui as search. :-)
            Fragment Fragment_one;




            FragmentManager man= this.getSupportFragmentManager();
            FragmentTransaction tran = man.beginTransaction();
            BarcodeFrag fragmentNew = new BarcodeFrag();
            Bundle bundle = new Bundle();
            bundle.putString("scanContent", scanContent);
            fragmentNew.setArguments(bundle);


            tran.replace(R.id.main, fragmentNew);//tran.
            tran.addToBackStack(null);
            //tran.commit();
            tran.commitAllowingStateLoss();


        }

        else{
            Toast toast = Toast.makeText(getApplicationContext(),
                    "No scan data received!", Toast.LENGTH_SHORT);
            toast.show();
        }

    }



}

我还有一个用于抽屉的枚举,如下所示:

import android.support.v4.app.Fragment;

public enum MainNavItem
{
    // Displayed in NavDrawerListAdapter
    STATISTICS("Your Statistics",   R.layout.statistics_pagelayout,     StatisticsPage.class),
    DISCOVER  ("Discover",          R.layout.activity_discover,         BPTopBeers.class),
    PORTFOLIO ("Portfolio",         R.layout.activity_portfolio,        Portfolio.class),
    DRINKLOCAL ("Drink Local",      R.layout.beer_location_list,           DrinkLocal.class),
    Map      ("Brewery Map",        R.layout.activity_brewmap,          MapTabs.class),
    LISTS      ("Your Lists",       R.layout.activity_search,           AllLists.class),
    NEWS      ("News",              R.layout.activity_news,             NewsWeb.class),
    Find      ("Nearby Breweries",  R.layout.beer_location_list,        FindBrewery.class),
    CONTACT   ("Contact",           R.layout.activity_contact,          ContactPage.class),
    // Items NOT displayed in NavDrawerListAdapter
    SEARCH    ("Search",            R.layout.activity_search,           Search.class),
    ;

    private static MainNavItem LAST_NAV_ITEM = CONTACT;

    private String mTitleResId;
    private int mLayoutResId;
    private Class<? extends Fragment> mFragClass;


    private MainNavItem(String titleResId, int layoutResId, Class<? extends Fragment> fragClass)
    {
        mTitleResId  =  titleResId;
        mLayoutResId = layoutResId;
        mFragClass   = fragClass;
    }

    public int getLayoutResId()
    {
        return mLayoutResId;
    }

    public String getTitleResId()
    {
        return mTitleResId;
    }

    public Class<? extends Fragment> getFragClass()
    {
        return mFragClass;
    }

    public static MainNavItem[] getNavAdapterItems()
    {
        int count = LAST_NAV_ITEM.ordinal() + 1;

        MainNavItem[] adapterItems = new MainNavItem[count];
        for(int i = 0; i < count; i++){
            adapterItems[i] = values()[i];
        }

        return adapterItems;
    }
}

2 个答案:

答案 0 :(得分:1)

将此添加到mDrawerList的onItemClick方法

if(mDrawerLayout.isDrawerOpen(mDrawerList)) {
        mDrawerLayout.closeDrawer(mDrawerList);

  }
  else {
        mDrawerLayout.openDrawer(mDrawerList);
  }

答案 1 :(得分:0)

我无法找到您在代码中加载片段的位置,但在替换片段之前可能会遗漏mDrawerToggle.onDrawerClosed(mDrawerLayout);