2014-08-30 6 views
5

Я использовал шаблон навигационного ящика, представленный в Android Studio. В макете моей деятельности у меня есть этот следующий код:Android меняет ширину панели панели навигации программно

<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" /> 

Что мне нужно программно изменить ширину панели. Я думаю, что правая зона, чтобы изменить это так:

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

.... 

Но я не могу понять, как можно достичь своей цели.

/* UPDATE */

значок панели ящика не предъявляется в панели действий

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

Это метод SelectItem

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

.... 

ответ

14

на основе кода созданный из шаблона навигационного ящика, вы можете изменить ширину панели, добавив этот код к методу onCreateView() в 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); 
     } 
    }); 

Чтобы отключить панорамирование жесты DrawerLayout:

// NavigationDrawerFragment

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

Для открытия/закрытия DrawerLayout:

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

Чтобы предотвратить значок панели ящика исчезает , измените метод setOnItemClickListener следующим образом:

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

И изменить преодолено onDrawerClose метод следующим образом:

@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

Спасибо так много! оно работает! Я использую ваш код для автоматической установки ширины на максимальную возможную. После первого щелчка на элементе я повторно использую ваш код для изменения ширины до 240 дп. Но, к сожалению, он удаляет значок меню ящика в верхнем углу левого окна боковой панели ... Я не знаю, почему ... Как я могу исправить? Также возможно автоматическое открытие меню выдвижного ящика и Отключить жест жесткости (и использовать его после первого щелчка на элементе). –

+0

Исправлена ​​проблема с иконкой, используя resources.getDisplayMetrics(). WidthPixels-1 вместо resources.getDisplayMetrics(). widthPixels! , поэтому мои оставшиеся вопросы теперь 2. Возможно ли открыть панель ящика программно и отключить жесты? Спасибо :) –

+0

Добро пожаловать! См. Мой ответ на редактирование :) –