Подтвердить что ты не робот

Откройте действие или фрагмент с глубоким связыванием нижнего листа

Я хочу открыть нижний лист (Deep Linking way), но внутри него вместо опций совместного доступа или только макета я хочу иметь активность с ее макетом или фрагментом с его макетом.

Известные библиотеки, которые открывают нижний лист Like Flipboard/BottomSheet, могут открывать макет не всю активность.

Есть ли возможность достичь этого с помощью макета координатора?

Я нашел страницу Google Фото на странице компонентов нижнего листа, которая показывает, что именно я имею в виду. В описании Google говорится:

В приложении справа отображается нижний лист, содержащий контент из приложения слева. Это позволяет пользователю просматривать контент из другого приложения, не выходя из своего текущего приложения.

введите описание изображения здесь

4b9b3361

Ответ 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);
}});

И вот оно!

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