Bottom Sheet Fragment 自带键盘
Bottom Sheet Fragment comes up with keyboard
我在底部 sheet 片段中有一个编辑文本。当焦点出现在编辑文本上时,布局会上升。我试过了
android:windowSoftInputMode="adjustNothing"
它适用于父级 activity 但不适用于对话框片段。
这是我的屁股sheetclass:
public class CustomBottomSheetDialogFragment extends BottomSheetDialogFragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.content_dialog_bottom_sheet, container, false);
getDialog().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
return v;
}
}
初始状态
当键盘出现时
我希望布局始终位于底部,键盘应位于布局上方。
检查布局
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/bottomSheetLayout"
android:layout_width="match_parent"
android:layout_height="400dp"
android:background="@android:color/holo_blue_light"
android:padding="@dimen/activity_vertical_margin"
app:behavior_hideable="true"
app:behavior_peekHeight="60dp"
app:layout_behavior="@string/bottom_sheet_behavior">
<EditText
android:id="@+id/edt"
android:layout_width="match_parent"
android:layout_height="40dp"
android:background="@android:color/white"
android:padding="10dp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="250dp"
android:layout_below="@+id/edt" />
Use this in your Dialog Fragment
.
getDialog().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
Inside onCreateView
like this.
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.dialog_fragment, container);
//set to adjust screen height automatically, when soft keyboard appears on screen
getDialog().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
return rootView;
}
编辑 1:
I have made some changes with what layout
you are using make it apply in your current layout
.
这里是layout
.
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/bottom_sheet"
android:layout_width="match_parent"
android:layout_height="400dp"
android:layout_gravity="bottom"
android:background="@android:color/holo_blue_light"
android:padding="10dp"
app:behavior_hideable="true"
app:behavior_peekHeight="60dp"
app:layout_behavior="android.support.design.widget.BottomSheetBehavior">
<ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fillViewport="true"
android:isScrollContainer="false"
android:scrollbars="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<EditText
android:id="@+id/edt"
android:layout_width="match_parent"
android:layout_height="40dp"
android:background="@android:color/white"
android:padding="10dp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="250dp"
android:layout_below="@+id/edt" />
</LinearLayout>
</ScrollView>
</FrameLayout>
这里是Fragment
.
public class TestFragment extends BottomSheetDialogFragment {
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.test4, container, false);
return v;
}
编辑 2:
You can try android:elevation="50dp" property for shadow above Bottom Sheet give a try with that in frame layout.
在清单中的 activity 声明中,放置以下代码行:
android:windowSoftInputMode="stateHidden"
android:windowTranslucentNavigation="true"
android:windowTranslucentStatus="true"
替换
中的标志
adjustNothing
到
adjustPan
获取对话框的装饰视图并将底部填充设置为高度 0
或您的对话框高度。
getDialog.getWindow.getDecorView.setpadding(0,0,0,0);
BottomSheetFragment 的 100% 工作公式
在 BottomSheetFragment 的 onCreateDialog 中使用这个
KeyboardUtil(getActivity(), view);
或
片段使用
new KeyboardUtil(this, findViewById(R.id.fragment_container));
通过使用这个 Util class
图片来源:Mikepenz
似乎旧设计版本中存在错误。
我遇到了同样的问题,但是我升级了设计版本后,adjustnothing可以正常工作了。
在gradle中:
com.android.support:design:26.1.0
在您的 BottomSheetDialog 中:
getDialog().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_NOTHING);
getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_NOTHING);
我遇到过同样的情况,我使用的不是 EditText,而是 SearchView.A 当 BottomSheetDialog 进入隐藏状态时,键盘没有隐藏。
只需调用此 search_channel_template.clearFocus();
我将分享我用来隐藏键盘的代码。
search_channel_template = (SearchView) bottomSheetDialog.findViewById(R.id.search_channel_template);
txtVw_template_headerBS_down_id.setOnClickListener(new OnSingleClickListener() {
@Override
public void onSingleClick(View v) {
search_channel_template.clearFocus();
bottomSheetDialog.getBehavior().setState(BottomSheetBehaviorv2.STATE_HIDDEN);
}
});
如果您遇到以下问题
解决方案
sheetDialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
我在底部 sheet 片段中有一个编辑文本。当焦点出现在编辑文本上时,布局会上升。我试过了
android:windowSoftInputMode="adjustNothing"
它适用于父级 activity 但不适用于对话框片段。
这是我的屁股sheetclass:
public class CustomBottomSheetDialogFragment extends BottomSheetDialogFragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.content_dialog_bottom_sheet, container, false);
getDialog().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
return v;
}
}
初始状态
当键盘出现时
我希望布局始终位于底部,键盘应位于布局上方。
检查布局
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/bottomSheetLayout"
android:layout_width="match_parent"
android:layout_height="400dp"
android:background="@android:color/holo_blue_light"
android:padding="@dimen/activity_vertical_margin"
app:behavior_hideable="true"
app:behavior_peekHeight="60dp"
app:layout_behavior="@string/bottom_sheet_behavior">
<EditText
android:id="@+id/edt"
android:layout_width="match_parent"
android:layout_height="40dp"
android:background="@android:color/white"
android:padding="10dp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="250dp"
android:layout_below="@+id/edt" />
Use this in your
Dialog Fragment
.
getDialog().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
Inside
onCreateView
like this.
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.dialog_fragment, container);
//set to adjust screen height automatically, when soft keyboard appears on screen
getDialog().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
return rootView;
}
编辑 1:
I have made some changes with what
layout
you are using make it apply in your currentlayout
.
这里是layout
.
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/bottom_sheet"
android:layout_width="match_parent"
android:layout_height="400dp"
android:layout_gravity="bottom"
android:background="@android:color/holo_blue_light"
android:padding="10dp"
app:behavior_hideable="true"
app:behavior_peekHeight="60dp"
app:layout_behavior="android.support.design.widget.BottomSheetBehavior">
<ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fillViewport="true"
android:isScrollContainer="false"
android:scrollbars="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<EditText
android:id="@+id/edt"
android:layout_width="match_parent"
android:layout_height="40dp"
android:background="@android:color/white"
android:padding="10dp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="250dp"
android:layout_below="@+id/edt" />
</LinearLayout>
</ScrollView>
</FrameLayout>
这里是Fragment
.
public class TestFragment extends BottomSheetDialogFragment {
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.test4, container, false);
return v;
}
编辑 2:
You can try android:elevation="50dp" property for shadow above Bottom Sheet give a try with that in frame layout.
在清单中的 activity 声明中,放置以下代码行:
android:windowSoftInputMode="stateHidden"
android:windowTranslucentNavigation="true"
android:windowTranslucentStatus="true"
替换
中的标志adjustNothing
到
adjustPan
获取对话框的装饰视图并将底部填充设置为高度 0
或您的对话框高度。
getDialog.getWindow.getDecorView.setpadding(0,0,0,0);
BottomSheetFragment 的 100% 工作公式
在 BottomSheetFragment 的 onCreateDialog 中使用这个
KeyboardUtil(getActivity(), view);
或
片段使用
new KeyboardUtil(this, findViewById(R.id.fragment_container));
通过使用这个 Util class
图片来源:Mikepenz
似乎旧设计版本中存在错误。 我遇到了同样的问题,但是我升级了设计版本后,adjustnothing可以正常工作了。
在gradle中:
com.android.support:design:26.1.0
在您的 BottomSheetDialog 中:
getDialog().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_NOTHING);
getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_NOTHING);
我遇到过同样的情况,我使用的不是 EditText,而是 SearchView.A 当 BottomSheetDialog 进入隐藏状态时,键盘没有隐藏。
只需调用此 search_channel_template.clearFocus();
我将分享我用来隐藏键盘的代码。
search_channel_template = (SearchView) bottomSheetDialog.findViewById(R.id.search_channel_template);
txtVw_template_headerBS_down_id.setOnClickListener(new OnSingleClickListener() {
@Override
public void onSingleClick(View v) {
search_channel_template.clearFocus();
bottomSheetDialog.getBehavior().setState(BottomSheetBehaviorv2.STATE_HIDDEN);
}
});
如果您遇到以下问题
解决方案
sheetDialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);