Я искал в Интернете, чтобы найти какое-либо хорошее решение этой проблемы и не нашел. Поэтому я сделал трюк, который сделал это.
Прежде всего нам необходимо запросить функцию наложения панели действий. Таким образом, в 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!
Я полностью согласен с вами, но клиент хочет получить такой же опыт на iOS и Android. Похоже, я собираюсь обычай. Благодарю. – MCR
Я понимаю ... Я испытал это раньше, многие клиенты хотят, чтобы версия Android точно такая же, как у iOS, но, поверьте мне, обычно требуется гораздо меньше усилий, чтобы убедить их в том, насколько это плохо, чем на самом деле перекодировать все iOS для Android. – thelawnmowerman
Imho, что «эффект» ничего не нарушает UX. Аргумент «маленькая кошка умирает» - это глупо и полемично ... – WarrenFaith