底部 Sheet 向下滑动行为
Bottom Sheet Swipe Down Behavior
我已经在 Fragment
中成功创建了 ListView
。从列表中我也成功地加载了底部 sheet。
如果我点击列表中的第一项 "One",底部 sheet 就会出现。
如果我在底部 sheet 之外点击,底部 sheet 就会消失。
如果我点击列表中的第二个项目 "Two" 底部 sheet 再次出现。
如果我再次执行 1) 然后向下滑动底部 sheet 并尝试执行 3),屏幕保持灰色,就好像底部 sheet仍然显示但不可见... ???
我该如何纠正?
下面是我的代码。
SecondFragment.java
:
/**
* A simple {@link Fragment} subclass.
*/
public class SecondFragment extends Fragment {
public SecondFragment() {
// Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_second, container, false);
String[] faList = {
"One",
"Two",
};
ListView listView = (ListView) view.findViewById(R.id.listFa);
ArrayAdapter<String> listviewAdapter = new ArrayAdapter<String>(
getActivity(),
android.R.layout.simple_list_item_1,
faList
);
listView.setAdapter(listviewAdapter);
// Inflate the layout for this fragment
// return view;
final BottomSheetDialog bottomsheet = new BottomSheetDialog(this.getContext());
View bottomSheetView = inflater.inflate(R.layout.bottom_sheet, null);
bottomsheet.setContentView(bottomSheetView);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
bottomsheet.show();
}
});
return view;
}
}
fragment_second.xml
:
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.ifavaz.talker.SecondFragment">
<!-- TODO: Update blank fragment layout -->
<ListView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/listFa" />
</FrameLayout>
bottom_sheet.xml
:
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="right"
app:layout_behavior="android.support.design.widget.BottomSheetBehavior">
<ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="30dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
android:layout_marginTop="30dp">
<FrameLayout
android:layout_width="280dp"
android:layout_height="wrap_content">
<TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="text is my text is my text text is my text is my text text is my text is my text text is my text is my text "
android:textSize="18sp"
android:textAlignment="textStart"
android:paddingRight="30dp" />
</FrameLayout>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
android:layout_marginTop="30dp">
<FrameLayout
android:layout_width="280dp"
android:layout_height="wrap_content">
<TextView
android:id="@+id/textView3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="text is my text is my text text is my text is my text text is my text is my text text is my text is my text "
android:textSize="18sp"
android:paddingRight="30dp" />
</FrameLayout>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
android:layout_marginTop="30dp">
<FrameLayout
android:layout_width="280dp"
android:layout_height="wrap_content">
<TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="text is my text is my text text is my text is my text text is my text is my text text is my text is my text "
android:textSize="18sp"
android:textAlignment="textStart"
android:paddingRight="30dp" />
</FrameLayout>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
android:layout_marginTop="30dp">
<FrameLayout
android:layout_width="280dp"
android:layout_height="wrap_content">
<TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="text is my text is my text text is my text is my text text is my text is my text text is my text is my text "
android:textSize="18sp"
android:textAlignment="textStart"
android:paddingRight="30dp" />
</FrameLayout>
</LinearLayout>
</LinearLayout>
</ScrollView>
</FrameLayout>
我从这个 post 开始工作,您将需要作为片段内的根布局 / activity 具有行为的 CoordinatorLayout --> "android.support.design.widget.BottomSheetBehavior"
,它的工作方式是扩展 BottomSheetDialogFragment 并从你的 activity / 片段中显示它,就像这样
TutsPlusBottomSheetDialogFragment fragment = new TutsPlusBottomSheetDialogFragment();
fragment.show(getSupportFragmentManager(),bottomSheetDialogFragment.getTag());
这个自定义DialogFragment的实现是:
public class TutsPlusBottomSheetDialogFragment extends BottomSheetDialogFragment {
private BottomSheetBehavior.BottomSheetCallback mBottomSheetBehaviorCallback = new BottomSheetBehavior.BottomSheetCallback() {
@Override
public void onStateChanged(@NonNull View bottomSheet, int newState) {
if (newState == BottomSheetBehavior.STATE_HIDDEN) {
dismiss();
}
}
@Override
public void onSlide(@NonNull View bottomSheet, float slideOffset) {
}
};
@Override
public void setupDialog(Dialog dialog, int style) {
super.setupDialog(dialog, style);
View contentView = View.inflate(getContext(), R.layout.bottom_sheet, null);
dialog.setContentView(contentView);
CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) ((View) contentView.getParent()).getLayoutParams();
CoordinatorLayout.Behavior behavior = params.getBehavior();
if( behavior != null && behavior instanceof BottomSheetBehavior ) {
((BottomSheetBehavior) behavior).setBottomSheetCallback(mBottomSheetBehaviorCallback);
}
}
}
我已经在 Fragment
中成功创建了 ListView
。从列表中我也成功地加载了底部 sheet。
如果我点击列表中的第一项 "One",底部 sheet 就会出现。
如果我在底部 sheet 之外点击,底部 sheet 就会消失。
如果我点击列表中的第二个项目 "Two" 底部 sheet 再次出现。
如果我再次执行 1) 然后向下滑动底部 sheet 并尝试执行 3),屏幕保持灰色,就好像底部 sheet仍然显示但不可见... ???
我该如何纠正?
下面是我的代码。
SecondFragment.java
:
/**
* A simple {@link Fragment} subclass.
*/
public class SecondFragment extends Fragment {
public SecondFragment() {
// Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_second, container, false);
String[] faList = {
"One",
"Two",
};
ListView listView = (ListView) view.findViewById(R.id.listFa);
ArrayAdapter<String> listviewAdapter = new ArrayAdapter<String>(
getActivity(),
android.R.layout.simple_list_item_1,
faList
);
listView.setAdapter(listviewAdapter);
// Inflate the layout for this fragment
// return view;
final BottomSheetDialog bottomsheet = new BottomSheetDialog(this.getContext());
View bottomSheetView = inflater.inflate(R.layout.bottom_sheet, null);
bottomsheet.setContentView(bottomSheetView);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
bottomsheet.show();
}
});
return view;
}
}
fragment_second.xml
:
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.ifavaz.talker.SecondFragment">
<!-- TODO: Update blank fragment layout -->
<ListView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/listFa" />
</FrameLayout>
bottom_sheet.xml
:
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="right"
app:layout_behavior="android.support.design.widget.BottomSheetBehavior">
<ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="30dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
android:layout_marginTop="30dp">
<FrameLayout
android:layout_width="280dp"
android:layout_height="wrap_content">
<TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="text is my text is my text text is my text is my text text is my text is my text text is my text is my text "
android:textSize="18sp"
android:textAlignment="textStart"
android:paddingRight="30dp" />
</FrameLayout>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
android:layout_marginTop="30dp">
<FrameLayout
android:layout_width="280dp"
android:layout_height="wrap_content">
<TextView
android:id="@+id/textView3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="text is my text is my text text is my text is my text text is my text is my text text is my text is my text "
android:textSize="18sp"
android:paddingRight="30dp" />
</FrameLayout>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
android:layout_marginTop="30dp">
<FrameLayout
android:layout_width="280dp"
android:layout_height="wrap_content">
<TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="text is my text is my text text is my text is my text text is my text is my text text is my text is my text "
android:textSize="18sp"
android:textAlignment="textStart"
android:paddingRight="30dp" />
</FrameLayout>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
android:layout_marginTop="30dp">
<FrameLayout
android:layout_width="280dp"
android:layout_height="wrap_content">
<TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="text is my text is my text text is my text is my text text is my text is my text text is my text is my text "
android:textSize="18sp"
android:textAlignment="textStart"
android:paddingRight="30dp" />
</FrameLayout>
</LinearLayout>
</LinearLayout>
</ScrollView>
</FrameLayout>
我从这个 post 开始工作,您将需要作为片段内的根布局 / activity 具有行为的 CoordinatorLayout --> "android.support.design.widget.BottomSheetBehavior" ,它的工作方式是扩展 BottomSheetDialogFragment 并从你的 activity / 片段中显示它,就像这样
TutsPlusBottomSheetDialogFragment fragment = new TutsPlusBottomSheetDialogFragment();
fragment.show(getSupportFragmentManager(),bottomSheetDialogFragment.getTag());
这个自定义DialogFragment的实现是:
public class TutsPlusBottomSheetDialogFragment extends BottomSheetDialogFragment {
private BottomSheetBehavior.BottomSheetCallback mBottomSheetBehaviorCallback = new BottomSheetBehavior.BottomSheetCallback() {
@Override
public void onStateChanged(@NonNull View bottomSheet, int newState) {
if (newState == BottomSheetBehavior.STATE_HIDDEN) {
dismiss();
}
}
@Override
public void onSlide(@NonNull View bottomSheet, float slideOffset) {
}
};
@Override
public void setupDialog(Dialog dialog, int style) {
super.setupDialog(dialog, style);
View contentView = View.inflate(getContext(), R.layout.bottom_sheet, null);
dialog.setContentView(contentView);
CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) ((View) contentView.getParent()).getLayoutParams();
CoordinatorLayout.Behavior behavior = params.getBehavior();
if( behavior != null && behavior instanceof BottomSheetBehavior ) {
((BottomSheetBehavior) behavior).setBottomSheetCallback(mBottomSheetBehaviorCallback);
}
}
}