键盘显示时禁用对话框片段
问题描述:
粉红色的是DialogFragment。当键盘显示时,它正在上升并重叠工具栏。我怎样才能使对话框片段保持不变,只有edittext上升。
我用SOFT_INPUT_ADJUST_PAN或SOFT_INPUT_ADJUST_RESIZE但仍然片段上去
SOFT_INPUT_ADJUST_NOTHING:对话框和编辑文本保持不变,但我想编辑文本上去
任何帮助将不胜感激?
MainActivity.java:
public class HelloDialogFragment extends DialogFragment {
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.dialog_fragment, container, false);
return v;
}
@Override
public void onStart() {
super.onStart();
Dialog dialog = getDialog();
if (dialog != null && dialog.getWindow() != null) {
Window window = dialog.getWindow();
TypedValue tv = new TypedValue();
getContext().getTheme().resolveAttribute(android.R.attr.actionBarSize, tv, true);
int actionBarHeight = getResources().getDimensionPixelSize(tv.resourceId);
int statusBarHeight = (int) getResources().getDimension(R.dimen.status_bar_height);
window.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
window.setFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL,
WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL);
window.clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);
WindowManager.LayoutParams params = window.getAttributes();
params.gravity = Gravity.LEFT | Gravity.TOP;
params.x = 200 + 2 * Utils.dpToPx(8);
params.y = statusBarHeight + actionBarHeight + Utils.dpToPx(8);
params.width = Utils.screenWidth()/3;
params.height = Utils.screenHeight() - statusBarHeight - actionBarHeight - 2 * Utils.dpToPx(8);
window.setAttributes(params);
dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
}
}
static class Utils {
public static int screenWidth() {
return Resources.getSystem().getDisplayMetrics().widthPixels;
}
public static int screenHeight() {
return Resources.getSystem().getDisplayMetrics().heightPixels;
}
public static int dpToPx(int dp) {
return (int) (dp * Resources.getSystem().getDisplayMetrics().density);
}
}
}
dialog_fragment.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#f2f"
android:orientation="vertical">
<View
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_weight="1"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#E8E8E8"
android:gravity="center_vertical"
android:orientation="horizontal">
<EditText
android:id="@+id/chatEditText"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_margin="8dp"
android:layout_weight="1"
android:background="#fff"
android:hint="Enter"
android:padding="8dp"
android:textColor="#B0B0B0"
android:textDirection="locale"/>
<Button
android:id="@+id/sendButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginRight="8dp"
android:background="@color/colorPrimary"
android:padding="8dp"
android:text="SEND"
android:textColor="#fff"/>
</LinearLayout>
</LinearLayout>
答
最后,我发现了一个棘手的实现它 首先,使对话片段高度匹配父 其次,在顶部添加的透明视图的包裹元件的代码视图(高度等于工具栏)。所以,当键盘显示时,对话框将被调整大小,但不会向上移动并重叠工具栏
答
只给我的想法。
你有没有尝试通过另一种布局,如FrameLayout
然后设置paddingTop
等于或大于ToolBar
或
大小设置根元素相等或更大的marginTop
大包装的元素都在dialog_fragment.xml
比尺寸大ToolBar
我不这样做会有帮助。
这里是由FrameLayout
<FrameLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:android:paddingTop=toolBarSize/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#f2f"
android:orientation="vertical">
<View
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_weight="1"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#E8E8E8"
android:gravity="center_vertical"
android:orientation="horizontal">
<EditText
android:id="@+id/chatEditText"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_margin="8dp"
android:layout_weight="1"
android:background="#fff"
android:hint="Enter"
android:padding="8dp"
android:textColor="#B0B0B0"
android:textDirection="locale"/>
<Button
android:id="@+id/sendButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginRight="8dp"
android:background="@color/colorPrimary"
android:padding="8dp"
android:text="SEND"
android:textColor="#fff"/>
</LinearLayout>
</LinearLayout>
</FrameLayout>
感谢您的帮助,但它不起作用 – maphongba008
如何使用'FrameLayout'封装所有布局并设置padding top然后设置'LayoutParams'这样 'window.setFlags(WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.MATCH_PARENT);' –
我的对话框必须具有固定的位置,宽度/高度,所以无论该亲本是的LinearLayout或的FrameLayout,这如果softInputMode是SOFT_INPUT_ADJUST_PAN或SOFT_INPUT_ADJUST_RESIZE – maphongba008