我想打开一个底部工作表(深层链接方式)但是在它内部而不是共享选项或仅仅是一个布局我希望有一个活动及其布局或片段及其布局。
打开像Flipboard/BottomSheet这样的底部工作表的已知库可以打开布局而不是整个活动。
是否有可能通过协调员布局实现这一目标?
我在Bottom Sheet Component Page上找到了一张Google照片,其中显示了我的想法。谷歌的描述说:
右侧的应用程序显示一个底部工作表,其中包含左侧应用程序的内容。这允许用户在不离开当前应用的情况下查看来自其他应用的内容。
答案 0 :(得分:1)
我不是专家,但经过一些研究后我发现了一种简单的方法。在activity_main.xml
中,首先确保您的根布局为android.support.design.widget.CoordinatorLayout
。
在CoodrdinatorLayout
内部添加一个包含到底部工作表布局:
<include layout="@layout/bottom_sheet_main" />
然后,这可能是最重要的一步,您需要指定底部工作表布局的行为,所以这里是一个示例代码:
<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高。
这种观点有三种主要状态:
扩展(STATE_EXPANDED
):底部工作表完全打开时。
折叠(STATE_COLLAPSED
):当用户只看到视图顶部的一小部分时。属性app:behavior_peekHeight
确定此高度。
隐藏(STATE_HIDDEN
):当完全隐藏时(惊喜哈哈!)。
我们还有STATE_SETTLING
和STATE_DRAGGING
这些是暂时的,但它们并不重要。
现在,如果您运行您的应用程序(您不必编写任何JAVA代码),您将看到如果您向上滑动将出现在布局底部的标题,则工作表将展开,而在另一个中则相同方式。
但您可能会注意到,如果您单击底部工作表,则不会发生任何事情。您可以使用一些Java代码来管理底部表的状态:
声明视图: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);
}});
就是这样!
您还可以使用“模态底部工作表”,它可以让您创建底部工作表,就好像它是片段一样。
答案 1 :(得分:0)
要进行创建,您需要具有BottomSheetDialogFragment
库中的com.google.android.material
,如下所示:
public class FragmentBottomSheetDialogFull extends BottomSheetDialogFragment {
private BottomSheetBehavior mBehavior;
private AppBarLayout app_bar_layout;
@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
final BottomSheetDialog dialog = (BottomSheetDialog) super.onCreateDialog(savedInstanceState);
final View view = View.inflate(getContext(), R.layout.fragment_bottom_sheet_dialog_full, null);
dialog.setContentView(view);
mBehavior = BottomSheetBehavior.from((View) view.getParent());
mBehavior.setPeekHeight(BottomSheetBehavior.PEEK_HEIGHT_AUTO);
mBehavior.setBottomSheetCallback(new BottomSheetBehavior.BottomSheetCallback() {
@Override
public void onStateChanged(@NonNull View bottomSheet, int newState) {
if (BottomSheetBehavior.STATE_EXPANDED == newState) {
// View is expended
}
if (BottomSheetBehavior.STATE_COLLAPSED == newState) {
// View is collapsed
}
if (BottomSheetBehavior.STATE_HIDDEN == newState) {
dismiss();
}
}
@Override
public void onSlide(@NonNull View bottomSheet, float slideOffset) {
}
});
return dialog;
}
@Override
public void onStart() {
super.onStart();
mBehavior.setState(BottomSheetBehavior.STATE_COLLAPSED);
}
}
然后在您的活动中调用以打开
// display sheet
FragmentBottomSheetDialogFull fragment = new FragmentBottomSheetDialogFull();
fragment.show(getSupportFragmentManager(), fragment.getTag());