2013-06-01 10 views
7

Attualmente sto cercando di implementare il nuovo NavigationDrawer secondo le linee guida di Google IO 2013. Sto usando ActionbarSherlock. Il codice funziona bene. L'unico problema è che non sono in grado di attivare il cursore "su" accanto all'icona della mia app quando il cassetto di navigazione è estratto. Sto incollando il mio intero codice qui sotto. Gentilmente aiuto.Non è possibile modificare il cursore Up accanto all'icona dell'app nell'ActionBar nel mio cassetto di navigazione

public class MainActivity extends SherlockFragmentActivity { 
    private DrawerLayout mDrawerLayout; 
    private ListView mDrawerList; 
    private ActionBarDrawerToggle mDrawerToggle; 

    private CharSequence mDrawerTitle; 
    private CharSequence mTitle; 
    private String[] mPlanetTitles; 

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

     mTitle = mDrawerTitle = getTitle(); 
     mPlanetTitles = getResources().getStringArray(R.array.planets_array); 
     mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); 
     mDrawerList = (ListView) findViewById(R.id.drawer); 

     mDrawerLayout.setDrawerShadow(R.drawable.drawer_shadow, GravityCompat.START); 
     mDrawerList.setAdapter(new ArrayAdapter<String>(this, R.layout.drawer_list_item, mPlanetTitles)); 
     mDrawerList.setOnItemClickListener(new DrawerItemClickListener()); 

     mDrawerToggle = new ActionBarDrawerToggle(this, /* host Activity */ 
     mDrawerLayout, /* DrawerLayout object */ 
     R.drawable.ic_drawer, /* nav drawer image to replace 'Up' caret */ 
     R.string.drawer_open, /* "open drawer" description for accessibility */ 
     R.string.drawer_close /* "close drawer" description for accessibility */ 
    ) { 
     public void onDrawerClosed(View view) { 
      getSupportActionBar().setTitle(mTitle); 
      supportInvalidateOptionsMenu(); 
     } 

     public void onDrawerOpened(View drawerView) { 
      getSupportActionBar().setTitle(mDrawerTitle); 
      supportInvalidateOptionsMenu(); 
     } 
     }; 

     getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
     getSupportActionBar().setHomeButtonEnabled(true); 


     mDrawerLayout.setDrawerListener(mDrawerToggle); 

     if (savedInstanceState == null) { 
     selectItem(0); 
     } 

     new Thread(new Runnable() { 

     @Override 
     public void run() { 
      prefs = getPreferences(MODE_PRIVATE); 
      opened = prefs.getBoolean(OPENED_KEY, false); 
      if(opened == false) 
      { 
        mDrawerLayout.openDrawer(mDrawerList); 
      } 
     } 
    }).start(); 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     MenuInflater inflater = getSupportMenuInflater(); 
     inflater.inflate(R.menu.main, menu); 
     return super.onCreateOptionsMenu(menu); 
    } 

    @Override 
    public boolean onPrepareOptionsMenu(Menu menu) { 
     boolean drawerOpen = mDrawerLayout.isDrawerOpen(mDrawerList); 
     menu.findItem(R.id.action_websearch).setVisible(!drawerOpen); 
     return super.onPrepareOptionsMenu(menu); 
    } 

    @Override 
    public boolean onOptionsItemSelected(final MenuItem item) { 
     if (mDrawerToggle.onOptionsItemSelected(getMenuItem(item))) { 
     return true; 
     } 

     switch (item.getItemId()) { 
     case R.id.action_websearch: 
      Intent intent = new Intent(Intent.ACTION_WEB_SEARCH); 
      intent.putExtra(SearchManager.QUERY, getSupportActionBar().getTitle()); 
      if (intent.resolveActivity(getPackageManager()) != null) { 
       startActivity(intent); 
      } else { 
       Toast.makeText(this, R.string.app_not_available, Toast.LENGTH_LONG).show(); 
      } 
      return true; 
     default: 
      return super.onOptionsItemSelected(item); 
     } 
    } 

    private android.view.MenuItem getMenuItem(final MenuItem item) { 
     return new android.view.MenuItem() { 
     @Override 
     public int getItemId() { 
      return item.getItemId(); 
     } 

     public boolean isEnabled() { 
      return true; 
     } 

     @Override 
     public boolean collapseActionView() { 
      return false; 
     } 

     @Override 
     public boolean expandActionView() { 
      return false; 
     } 

     @Override 
     public ActionProvider getActionProvider() { 
      return null; 
     } 

     @Override 
     public View getActionView() { 

      return null; 
     } 

     @Override 
     public char getAlphabeticShortcut() { 

      return 0; 
     } 

     @Override 
     public int getGroupId() { 

      return 0; 
     } 

     @Override 
     public Drawable getIcon() { 

      return null; 
     } 

     @Override 
     public Intent getIntent() { 

      return null; 
     } 

     @Override 
     public ContextMenuInfo getMenuInfo() { 

      return null; 
     } 

     @Override 
     public char getNumericShortcut() { 

      return 0; 
     } 

     @Override 
     public int getOrder() { 

      return 0; 
     } 

     @Override 
     public SubMenu getSubMenu() { 

      return null; 
     } 

     @Override 
     public CharSequence getTitle() { 

      return null; 
     } 

     @Override 
     public CharSequence getTitleCondensed() { 

      return null; 
     } 

     @Override 
     public boolean hasSubMenu() { 

      return false; 
     } 

     @Override 
     public boolean isActionViewExpanded() { 

      return false; 
     } 

     @Override 
     public boolean isCheckable() { 

      return false; 
     } 

     @Override 
     public boolean isChecked() { 

      return false; 
     } 

     @Override 
     public boolean isVisible() { 

      return false; 
     } 

     @Override 
     public android.view.MenuItem setActionProvider(ActionProvider actionProvider) { 

      return null; 
     } 

     @Override 
     public android.view.MenuItem setActionView(View view) { 

      return null; 
     } 

     @Override 
     public android.view.MenuItem setActionView(int resId) { 

      return null; 
     } 

     @Override 
     public android.view.MenuItem setAlphabeticShortcut(char alphaChar) { 

      return null; 
     } 

     @Override 
     public android.view.MenuItem setCheckable(boolean checkable) { 

      return null; 
     } 

     @Override 
     public android.view.MenuItem setChecked(boolean checked) { 

      return null; 
     } 

     @Override 
     public android.view.MenuItem setEnabled(boolean enabled) { 

      return null; 
     } 

     @Override 
     public android.view.MenuItem setIcon(Drawable icon) { 

      return null; 
     } 

     @Override 
     public android.view.MenuItem setIcon(int iconRes) { 

      return null; 
     } 

     @Override 
     public android.view.MenuItem setIntent(Intent intent) { 

      return null; 
     } 

     @Override 
     public android.view.MenuItem setNumericShortcut(char numericChar) { 

      return null; 
     } 

     @Override 
     public android.view.MenuItem setOnActionExpandListener(OnActionExpandListener listener) { 

      return null; 
     } 

     @Override 
     public android.view.MenuItem setOnMenuItemClickListener(OnMenuItemClickListener menuItemClickListener) { 

      return null; 
     } 

     @Override 
     public android.view.MenuItem setShortcut(char numericChar, char alphaChar) { 

      return null; 
     } 

     @Override 
     public void setShowAsAction(int actionEnum) { 


     } 

     @Override 
     public android.view.MenuItem setShowAsActionFlags(int actionEnum) { 

      return null; 
     } 

     @Override 
     public android.view.MenuItem setTitle(CharSequence title) { 

      return null; 
     } 

     @Override 
     public android.view.MenuItem setTitle(int title) { 

      return null; 
     } 

     @Override 
     public android.view.MenuItem setTitleCondensed(CharSequence title) { 

      return null; 
     } 

     @Override 
     public android.view.MenuItem setVisible(boolean visible) { 

      return null; 
     } 
     }; 
    } 

    /* The click listner for ListView in the navigation drawer */ 
    private class DrawerItemClickListener implements ListView.OnItemClickListener { 
     @Override 
     public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
     selectItem(position); 
     } 
    } 

    private void selectItem(int position) { 
     // update the main content by replacing fragments 
     Fragment fragment = new PlanetFragment(); 
     Bundle args = new Bundle(); 
     args.putInt(PlanetFragment.ARG_PLANET_NUMBER, position); 
     fragment.setArguments(args); 

     FragmentManager fragmentManager = getSupportFragmentManager(); 
     fragmentManager.beginTransaction().replace(R.id.content_frame, fragment).commit(); 

     // update selected item and title, then close the drawer 
     mDrawerList.setItemChecked(position, true); 
     setTitle(mPlanetTitles[position]); 
     mDrawerLayout.closeDrawer(mDrawerList); 
    } 

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

    /** 
    * When using the ActionBarDrawerToggle, you must call it during 
    * onPostCreate() and onConfigurationChanged()... 
    */ 

    @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 toggls 
     mDrawerToggle.onConfigurationChanged(newConfig); 
    } 

    /** 
    * Fragment that appears in the "content_frame", shows a planet 
    */ 
    public static class PlanetFragment extends SherlockFragment { 
     public static final String ARG_PLANET_NUMBER = "planet_number"; 

     public PlanetFragment() { 
     // Empty constructor required for fragment subclasses 
     } 

     @Override 
     public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View rootView = inflater.inflate(R.layout.fragment_planet, container, false); 
     int i = getArguments().getInt(ARG_PLANET_NUMBER); 
     String planet = getResources().getStringArray(R.array.planets_array)[i]; 

     // change int imageId = getResources().getIdentifier(planet.toLowerCase(Locale.getDefault()), "drawable", getActivity().getPackageName()); 
     int imageId = getResources().getIdentifier("tempmap", "drawable", getActivity().getPackageName()); 
     // change ((ImageView) rootView.findViewById(R.id.image)).setImageResource(imageId); 
     ((ImageView) rootView.findViewById(R.id.image)).setImageResource(imageId); 
     // change getActivity().setTitle(planet); 
     getActivity().setTitle("MapView"); 
     return rootView; 
     } 
    } 
} 

risposta

3

Ho avuto lo stesso problema e ha fatto alcune ricerche su questo argomento. Sembra che non sia facile far funzionare correttamente il caret sugli SDK precedenti. Per farla breve, c'è un ragazzo che ha un esempio di implementazione in esecuzione che si basa sulla riflessione:

https://github.com/nicolasjafelle/SherlockNavigationDrawer

ho testato e funziona perfettamente per me, anche su Android 2.x!

0

Ho rimosso il segno di omissione nei dispositivi 4.x, ma non per i dispositivi 2.x. Il repository è qui se ne hai bisogno: https://github.com/bcrider/NavigationDrawerSherlocked

È semplicemente il campione fornito da Google che ho modificato utilizzando ActionBarSherlock come hai fatto anche tu. Ho risolto un problema con un metodo (onOptionsItemSelected) nell'esempio che inizialmente impediva all'icona TAPpata di fare qualcosa dopo l'integrazione di ActionBarSherlock nell'app.

Spero che questo aiuti!

+0

Grazie Brian. Ma non sono riuscito a capire quali modifiche sono state apportate al metodo onOptionsItemSelected in grado di risolvere il problema che sto affrontando. Si prega di spiegare. Ho anche sostituito il mio metodo onOptionsItemSelected con il tuo. Ma questo non ha risolto il problema neanche per me. Grazie – ambit

+0

Oh scusa, questo ha risolto un problema in cui toccando il carato e l'icona non funzionava più quando ActionBarSherlock era integrato nel codice. Speravo che questo avrebbe almeno risolto il problema sui dispositivi 4.x ma 2.x lo ha ancora. Non è il peggiore perché è più o meno uno standard, ma posso vedere dove sarebbe bello averlo rimosso. –

11

Se non avete bisogno le 3 linee di muoversi (come in Gmail), si può solo aggiungere:

<item name="homeAsUpIndicator">@drawable/ic_drawer</item> 
<item name="android:homeAsUpIndicator">@drawable/ic_drawer</item> 

nel tema della vostra attività. Preferisco che usi un'altra libreria nella mia app.

ic_drawer può essere scaricato da qui: http://developer.android.com/training/implementing-navigation/nav-drawer.html

+0

Giusto per ripetere, questo va nella dichiarazione del tema principale e non in alcuna dichiarazione di stile ActionBar personalizzata che si possa avere. Rif: [http://stackoverflow.com/questions/13168843/actionbarsherlock-changing-homeasupindicator-doesnt-work] –

+0

Il trucco qui è gli attributi specchiati, come richiesto in ActionBarSherlock: http://actionbarsherlock.com/theming.html . –

+0

Questo è eccellente. – prakharsingh95

11

tenta di chiamare syncState sul cassetto di commutazione in questo modo:

@Override 
protected void onPostCreate(Bundle savedInstanceState) { 
    super.onPostCreate(savedInstanceState); 

//your ActionBarDrawerToggle is below 
    mDrawerToggle.syncState(); 
} 

o solo subito dopo si crea un'istanza di esso.

Problemi correlati