我想打开一个底部工作表(深度链接方式),但在它内部而不是共享选项或只是一个布局,我想要一个带有布局的 Activity 或一个带有布局的 fragment 。
打开底页的已知库如 Flipboard/BottomSheet可以打开布局,而不是整个 Activity 。
有没有可能通过协调器布局来实现?
我在 Bottom Sheet Component Page 上找到了一张 Google 的照片这显示了我的想法。谷歌的描述说:
The app on the right displays a bottom sheet containing content from the app on the left. This allows the user to view content from another app without leaving their current app.
最佳答案
我不是专家,但经过一些研究,我找到了一种简单的方法来做到这一点。首先在您的 activity_main.xml
中,确保您的根布局是 android.support.design.widget.CoordinatorLayout
。
就在 CoodrdinatorLayout
内部,将包含添加到您的底部工作表布局中:
<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"
表示 View 在折叠(但不隐藏)时高度为 64dp。
此 View 有 3 个主要阶段:
展开(
STATE_EXPANDED
):当底部工作表完全打开时。Collapsed (
STATE_COLLAPSED
):当用户只看到 View 顶部的一小部分时。app:behavior_peekHeight
属性决定了这个高度。Hidden(
STATE_HIDDEN
):当它完全隐藏时(惊喜哈哈!)。
我们还有 STATE_SETTLING
和 STATE_DRAGGING
,它们是暂时的,但它们并不那么重要。
现在,如果您运行您的应用程序(您不必编写任何 JAVA 代码),您将看到如果您向上滑动将出现在布局底部的标题,工作表将展开,另一个相同方式。
但是您可能会注意到,如果您单击底部工作表,则没有任何反应。您可以使用一些 Java 代码来管理 Bottom Sheet 的状态:
声明 View :LinearLayout bottomSheet = (LinearLayout)findViewById(R.id.bottomSheet);
声明行为“经理”:
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);
}});
它就在那里!
您还可以使用模态底部表,它可以让您创建一个底部表,就像它是一个 fragment 一样。
关于android - 使用底部表深层链接打开 Activity 或 fragment ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34243928/