2014-08-30 5 views
5

Ho utilizzato il modello di Cassetto di navigazione presente in Android Studio. Nel layout della mia attività ho questo codice:Android modifica la larghezza del pannello del cassetto di navigazione a livello di programmazione

<fragment android:id="@+id/navigation_drawer" 
    android:layout_width="@dimen/navigation_drawer_width" 
    android:layout_height="match_parent" 
    android:layout_gravity="start" 
    android:name="com.smedilepaolo.newsfeed.NavigationDrawer.NavigationDrawerFragment" 
    tools:layout="@layout/fragment_navigation_drawer" /> 

cosa ho bisogno è di cambiare a livello di codice la larghezza del pannello. Credo che la zona diritto di cambiare è questo:

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

     mNavigationDrawerFragment = (NavigationDrawerFragment) 
       getFragmentManager().findFragmentById(R.id.navigation_drawer); 
     mTitle = getTitle(); 

.... 

Ma io non riesco a capire come può raggiungere il mio obiettivo.

/* UPDATE */

L'icona del pannello cassetto non viene mostrato nella barra delle operazioni

mDrawerListView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
      mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED); 

      mDrawerListView.post(new Runnable() { 
       @Override 
       public void run() { 
        Resources resources = getResources(); 
        float width = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 240, resources.getDisplayMetrics()); 
        DrawerLayout.LayoutParams params = (DrawerLayout.LayoutParams) mDrawerListView.getLayoutParams(); 
        params.width = (int) (width); 
        mDrawerListView.setLayoutParams(params); 

       } 
      }); 

      selectItem(position); 
     } 
    }); 



    mDrawerListView.post(new Runnable() { 
     @Override 
     public void run() { 
      Resources resources = getResources(); 
      float width = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, resources.getDisplayMetrics().widthPixels-1, resources.getDisplayMetrics()); 
      DrawerLayout.LayoutParams params = (DrawerLayout.LayoutParams) mDrawerListView.getLayoutParams(); 
      params.width = (int) (width); 
      mDrawerListView.setLayoutParams(params); 
      mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED); 
      mDrawerLayout.openDrawer(mFragmentContainerView); 
     } 
    }); 

Questo è il metodo selectItem

private void selectItem(int position) { 
     mCurrentSelectedPosition = position; 
     if (mDrawerListView != null) { 
      mDrawerListView.setItemChecked(position, true); 
     } 
     if (mDrawerLayout != null) { 
      mDrawerLayout.closeDrawer(mFragmentContainerView); 
     } 

.... 

risposta

14

In base al codice generato dal modello del Navigatore, è possibile modificare la larghezza del pannello aggiungendo questo codice al metodo onCreateView() nella Nav igationDrawerFragment.

mDrawerListView.post(new Runnable() { 
     @Override 
     public void run() { 
      Resources resources = getResources(); 
      float width = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 100, resources.getDisplayMetrics()); 
      DrawerLayout.LayoutParams params = (DrawerLayout.LayoutParams) mDrawerListView.getLayoutParams(); 
      params.width = (int) (width); 
      mDrawerListView.setLayoutParams(params); 
     } 
    }); 

Per disattivare gesti pan on DrawerLayout:

// NavigationDrawerFragment

public void setUp(int fragmentId, DrawerLayout drawerLayout) { 
    mDrawerLayout = drawerLayout; 
    mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED); 
} 

per aprire/chiudere DrawerLayout:

mDrawerLayout.openDrawer(mDrawerListView); 
mDrawerLayout.closeDrawer(mDrawerListView); 

Per evitare l'icona del pannello cassetto scompare , cambiare il metodo setOnItemClickListener come segue:

mDrawerListView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
      selectItem(position); 
     } 
}); 

e modificare il metodo ignorato onDrawerClose come segue:

@Override 
public void onDrawerClosed(View drawerView) { 
    super.onDrawerClosed(drawerView); 
    if (!isAdded()) { 
     return; 
    } 

    mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED); 

    Resources resources = getResources(); 
    float width = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 240, resources.getDisplayMetrics()); 
    DrawerLayout.LayoutParams params = (DrawerLayout.LayoutParams) mDrawerListView.getLayoutParams(); 
    params.width = (int) (width); 
    mDrawerListView.setLayoutParams(params); 

    getActivity().invalidateOptionsMenu(); // calls onPrepareOptionsMenu() 
} 
+0

grazie mille! Funziona! Io uso il tuo codice per impostare automaticamente la larghezza al massimo possibile. Dopo il primo clic su un oggetto, riutilizzo il codice per ridimensionare la larghezza a 240 dpi. Ma sfortunatamente rimuove l'icona del menu del cassetto nell'angolo in alto a sinistra della barra laterale ... Non so perché ... Come posso risolvere? È anche possibile aprire automaticamente il menu del cassetto e Disabilitare i movimenti di panoramica (e rendersene conto dopo il primo clic su un elemento) –

+0

Correggo il problema dell'icona utilizzando resources.getDisplayMetrics(). WidthPixels-1 invece di resources.getDisplayMetrics(). widthPixels! quindi le mie restanti domande sono ora 2. È possibile aprire il pannello del cassetto in modo programmatico e disabilitare i movimenti di panoramica? Grazie :) –

+0

Prego! Vedi la mia risposta di modifica :) –