Ответ 1
Я не эксперт, но после некоторых исследований я нашел простой способ сделать это. В activity_main.xml
сначала убедитесь, что ваш корневой макет - android.support.design.widget.CoordinatorLayout
.
Только внутри CoodrdinatorLayout
добавьте include в свой макет нижнего листа:
<include layout="@layout/bottom_sheet_main" />
Затем, и это, вероятно, самый важный шаг, вам нужно указать поведение макета Bottom Sheet, так что вот пример кода:
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/bottomSheet"
android:layout_width="match_parent"
android:layout_height="300dp"
android:orientation="vertical"
android:background="#FFFFFF"
app:layout_behavior="@string/bottom_sheet_behavior"
app:behavior_hideable="true"
app:behavior_peekHeight="64dp" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="@style/TextAppearance.AppCompat.Title"
android:padding="16dp"
android:text="BOTTOM SHEET" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="@style/TextAppearance.AppCompat.Body1"
android:padding="16dp"
android:text="Here goes text" />
</LinearLayout>
Хорошо, так что это был весь XML-код. Обратите внимание, что мы применили app:layout_behavior
, чтобы у него были необходимые свойства. Еще одна важная вещь - указать app:behavior_hideable="true"
, если мы хотим иметь возможность скрывать весь макет. Атрибут app:behavior_peekHeight="64dp"
означает, что представление будет 64dp высоким, когда оно свернуто (но не скрыто).
В этом представлении есть 3 основных состояния:
-
Развернутый (
STATE_EXPANDED
): когда нижний лист полностью открыт. -
Свернуто (
STATE_COLLAPSED
): когда пользователь видит только небольшую часть из верхней части представления. Атрибутapp:behavior_peekHeight
определяет эту высоту. -
Скрытый (
STATE_HIDDEN
): Когда он полностью скрыт (SURPRISE HAHA!).
Мы также имеем STATE_SETTLING
и STATE_DRAGGING
, которые являются временными, но они не так важны.
Теперь, если вы запустите свое приложение (вам не нужно писать какой-либо JAVA-код), вы увидите, что если вы проверите заголовок, который будет отображаться в нижней части вашего макета, лист будет расширяться, а тот же в другой путь.
Но вы можете заметить, что если вы нажмете на нижний лист, ничего не произойдет. Вы можете играть с некоторым кодом Java для управления состоянием нижнего листа:
Объявить представление: LinearLayout bottomSheet = (LinearLayout)findViewById(R.id.bottomSheet);
Объявить поведение "manager":
final BottomSheetBehavior bsb = BottomSheetBehavior.from(bottomSheet);
И затем вы можете получить изменения состояния:
bsb.setBottomSheetCallback(new BottomSheetBehavior.BottomSheetCallback() {
@Override
public void onStateChanged(@NonNull View bottomSheet, int newState) {
String strNewState = "";
switch(newState) {
case BottomSheetBehavior.STATE_COLLAPSED:
strNewState = "STATE_COLLAPSED";
break;
case BottomSheetBehavior.STATE_EXPANDED:
strNewState = "STATE_EXPANDED";
break;
case BottomSheetBehavior.STATE_HIDDEN:
strNewState = "STATE_HIDDEN";
break;
case BottomSheetBehavior.STATE_DRAGGING:
strNewState = "STATE_DRAGGING";
break;
case BottomSheetBehavior.STATE_SETTLING:
strNewState = "STATE_SETTLING";
break;
}
Log.i("BottomSheets", "New state: " + strNewState);
}
@Override
public void onSlide(@NonNull View bottomSheet, float slideOffset) {
Log.i("BottomSheets", "Offset: " + slideOffset);
}});
И вот оно!
Вы также можете использовать Модальный нижний лист, который позволяет создавать нижний лист, как если бы он был фрагментом.