7

При использовании схемы выдвижного ящика есть способ наложить вид ящика на панель действий? Я не хочу скрывать панель действий, когда отображается ящик. Я хочу, чтобы панель действий просто оставалась на месте, но была отправлена ​​на задний план. Пример этого является Воспроизведение музыки приложения IOS ...DrawerLayout поверх панели действий

enter image description here

Моей текущей кожевенной реализации и показывает панель действий при изменении состояния ящика, но мне не нравится этот пользовательский опыт.

 public void onDrawerClosed(View view) { 
      getActionBar().show(); 
      invalidateOptionsMenu(); 
     } 

     public void onDrawerOpened(View drawerView) { 
      getActionBar().hide(); 
      invalidateOptionsMenu(); 
     } 

ответ

1

Это правильный эффект в настройках по умолчанию для Android. Если вы хотите эмулировать эффект iOS, вам, вероятно, придется это сделать самому, потому что AFAIK компонент ящика библиотеки поддержки не позволяет такие типы конфигураций.

Во всяком случае, каждый раз, когда программист кода много раз, чтобы эмулировать некоторые фантазии (и многое, вероятно, не достойна) IOS эффект в Android, немного кошка умирает ...

+0

Я полностью согласен с вами, но клиент хочет получить такой же опыт на iOS и Android. Похоже, я собираюсь обычай. Благодарю. – MCR

+1

Я понимаю ... Я испытал это раньше, многие клиенты хотят, чтобы версия Android точно такая же, как у iOS, но, поверьте мне, обычно требуется гораздо меньше усилий, чтобы убедить их в том, насколько это плохо, чем на самом деле перекодировать все iOS для Android. – thelawnmowerman

+1

Imho, что «эффект» ничего не нарушает UX. Аргумент «маленькая кошка умирает» - это глупо и полемично ... – WarrenFaith

1

Я не думаю, что вы будете способный сделать это с помощью навигационного ящика Android (не делая что-то действительно взломанного), так как это действительно противоречит шаблонам Android. Если вы хотите, чтобы библиотека выполняла то, что вы ищете, я использовал библиотеку this, прежде чем Android выйдет с ее собственным виджетами и сделает то, что вы ищете.

+0

Спасибо за ссылку на скользящее меню. Я посмотрел на это раньше и исключил это. Теперь, кажется, это хороший вариант. – MCR

0

Вы можете добиться этого с помощью ActionBarSherlock.

http://actionbarsherlock.com/

+4

Использование ActionBarSherlock в наши дни - плохая идея. – thelawnmowerman

+1

Это неплохая идея, просто не лучшая идея. – mass441

+3

Использование сторонней библиотеки, которая обеспечивает почти ту же функциональность, что и официальная библиотека поддержки, предоставленная Google только для достижения анимации, - это, безусловно, плохая идея, извините – thelawnmowerman

0

Вы будете в состоянии сделать это, но ящик будет выглядеть так неловко, что вам не понравится. У меня было такое же требование, и я в конечном итоге использовал кнопки Radio Buttons, настроенные для отображения в виде вкладок. Вы также можете попытаться скрыть вкладки, когда откроется ящик, и наоборот, но это, безусловно, не то, что вы хотите здесь.

Вы можете попробовать использовать ViewPager, индикатор с вкладками, такой как PagerTabStrip и/или TabPageIndicator.

Source.

3

Я искал в Интернете, чтобы найти какое-либо хорошее решение этой проблемы и не нашел. Поэтому я сделал трюк, который сделал это.

Прежде всего нам необходимо запросить функцию наложения панели действий. Таким образом, в onCreate() вашей деятельности, до setContntView() звонок: requestWindowFeature(com.actionbarsherlock.view.Window.FEATURE_ACTION_BAR_OVERLAY);

Это сделает все, в том числе навигационный ящик, тянет за панель действия. Нам это не нужно, поэтому нам нужно установить верхний край нашего FrameLayout, который размещает наши фрагменты в активности с точной высотой панели действий. В файле макет деятельности нам необходимо сделать следующее:

<!-- Framelayout to display Fragments --> 

    <FrameLayout 
     android:id="@+id/frame_container" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:layout_marginTop="?attr/actionBarSize" /> 

Это сделает только панель навигации появляется позади панели действий. Теперь мы скроем панель действий, когда навигационный ящик откроется пополам, и покажет его, когда ящик почти закрыт. Для этого нужно сделать следующее в своей деятельности:

@Override 
    public void onDrawerSlide(View drawerView, float slideOffset) { 
     super.onDrawerSlide(drawerView, slideOffset); 

     if(slideOffset > 0.5){ 
      actionBar.setBackgroundDrawable(null); 
      actionBar.hide(); 
     } else { 
      actionBar.show(); 

      if(slideOffset < 0.1){ 
       actionBar.setBackgroundDrawable(layerDrawable); 
      } 
     }  
    } 

Как вы можете видеть, что я также изменить фон вытяжку из панели действий, чтобы сделать его прозрачным, когда перед тем, как начать, чтобы скрыть его, и изменить его обратно с моим обычным фоном, когда я показываю его обратно.

Мой пользовательский фон - это layerListDrawable, который является прозрачным, но имеет разделитель внизу с некоторой тенью.

И для достижения этой цели я определил следующий слой-лист в формате XML:

<layer-list xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:top="0dp" android:left="0dp" android:bottom="0dp" android:right="0dp"> 
     <shape android:shape="rectangle"> 
      <solid android:color="@android:color/transparent"/> 
     </shape> 
    </item> 

    <item android:top="0dp" android:left="0dp" android:bottom="0dp" android:right="0dp"> 
     <shape android:shape="rectangle"> 
      <solid android:color="#afafaf"/> 
     </shape> 
    </item> 

    <item android:top="0dp" android:left="0dp" android:bottom="0dp" android:right="0dp"> 
     <shape android:shape="rectangle"> 
      <gradient 
       android:angle="270" 
       android:startColor="#88afafaf" 
       android:endColor="#33afafaf" 
      /> 
     </shape> 
    </item>  
</layer-list> 

И чтобы получить фон мне нужно из этого XML я следующее в своей деятельности:

final ActionBar actionBar = getSupportActionBar(); 
     final LayerDrawable layerDrawable = (LayerDrawable) getResources() 
       .getDrawable(R.drawable.shadow_divider); 

     final TypedArray styledAttributes = getTheme().obtainStyledAttributes(
       new int[] { R.attr.actionBarSize }); 
     int topOffset = (int) (styledAttributes.getDimension(0, 0)); 
     styledAttributes.recycle(); 

     layerDrawable.setLayerInset(1, 0, topOffset - 3, 0, 2); 
     layerDrawable.setLayerInset(2, 0, topOffset - 2, 0, 0); 

     actionBar.setBackgroundDrawable(layerDrawable); 

где R.drawable.shadow_divider - это список слоев XML, который я определил ранее.

Это выглядит действительно здорово! Надеюсь, это может помочь кому-то.

EDIT

У меня была небольшая ошибка здесь, которая может быть причиной давки иногда. Вот фиксированный код: `

<FrameLayout 
     android:id="@+id/frame_container" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     **android:paddingTop="?attr/actionBarSize"** />` 

Это должно быть paddingTop не layout_marginTop!

Смежные вопросы