保持点击菜单项不同于点击?

时间:2015-03-06 02:31:23

标签: android android-fragments android-toolbar

我目前有一个菜单可以加载到我的工具栏中,如下所示:

<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">




    <item
        android:id="@+id/action_search"
        android:icon="@android:drawable/ic_menu_search"
        app:showAsAction="always|collapseActionView"
        app:actionViewClass="android.support.v7.widget.SearchView"
        android:onClick="goToSearch"
        android:title="Search"/>



    <item android:id="@+id/action_barcode"
        android:icon="@drawable/bar"
        android:title="barcode"
        app:showAsAction="ifRoom"
        android:onClick="scanBarcode"/>



</menu>

单击条形码图标时,会加载条形码扫描片段。我想清理我的工具栏,并没有多个图标。基本上我想要我的搜索图标,点击它时会打开两个功能。

  1. 点击后打开搜索栏。
  2. 长按时,打开我的条形码扫描片段。
  3. 目前排名第一,正在研究如何使用2号。

    这是我的代码看起来像启动条形码扫描片段和搜索。

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

1 个答案:

答案 0 :(得分:0)

操作栏概念不依赖于此要求,因此使用内置功能您将无法实现所需。 但是,您可以在库存操作栏中引入自己的自定义布局,并在那里执行任何操作。在这里查看示例: http://javatechig.com/android/actionbar-with-custom-view-example-in-android