ユーザーからの入力を求めるためにSherlockDialogFragment
を使用しようとしています。私の電話(Galaxy Nexus、4.2)ではすべて正常に動作しますが、小型の電話(エミュレータ2.3.3)では、キーボードが表示されると、次のようにDialogFragmentの2つのボタンが覆われます。
私のレイアウトはScrollView内にあり、onViewCreated
でsoftInputModeをSOFT_INPUT_ADJUST_RESIZE
に変更しています。私もSOFT_INPUT_ADJUST_PAN
を試しましたが、うまくいきませんでした
MyCustomDialog.Java
public class AddTaskDialog extends SherlockDialogFragment implements OnDateSetListener{
//...
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
getDialog().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
}
public Dialog onCreateDialog(Bundle savedInstanceState) {
// Use the Builder class for convenient dialog construction
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
this.inflater = getActivity().getLayoutInflater();
View mainView =inflater.inflate(R.layout.custom_dialog, null);
builder.setView(mainView);
this.taskNote = (EditText) mainView.findViewById(R.id.ET_taskNote);
this.taskText = (EditText) mainView.findViewById(R.id.ET_taskText);
this.taskValue = (EditText) mainView.findViewById(R.id.ET_taskValue);
/*
* Other stuff
*/
builder.setTitle(getString(R.string.new_task, hType.toString()))
.setPositiveButton(R.string.dialog_confirm_button, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
//...
}
})
.setNegativeButton(R.string.dialog_cancel_button, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
// User cancelled the dialog
}
});
// Create the AlertDialog object and return it
return builder.create();
}
}
そして、これが私のレイアウトです:
custom_dialog.xml
<LinearLayout
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:orientation="vertical"
Android:background="@color/abs__background_holo_light">
<LinearLayout
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:paddingLeft="@dimen/activity_vertical_margin"
Android:paddingRight="@dimen/activity_vertical_margin">
<TextView
Android:id="@+id/TV_taskText"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:text="@string/task_text"
Android:textAppearance="?android:attr/textAppearanceLarge" />
<EditText
Android:id="@+id/ET_taskText"
Android:layout_width="0dip"
Android:layout_height="wrap_content"
Android:layout_weight="1"
Android:ems="10"
Android:hint="@string/create_task_hint"
Android:inputType="textNoSuggestions"
Android:singleLine="true" />
</LinearLayout>
<LinearLayout
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:paddingLeft="@dimen/activity_vertical_margin"
Android:paddingRight="@dimen/activity_vertical_margin" >
<TextView
Android:id="@+id/TV_taskNote"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:text="@string/task_note"
Android:textAppearance="?android:attr/textAppearanceLarge" />
<EditText
Android:id="@+id/ET_taskNote"
Android:layout_width="0dip"
Android:layout_height="wrap_content"
Android:minLines="2"
Android:layout_weight="1"
Android:ems="10"
Android:inputType="textMultiLine"
Android:hint="@string/task_note_hint">
</EditText>
</LinearLayout>
<LinearLayout
Android:id="@+id/repeat_days"
Android:layout_width="wrap_content"
Android:layout_height="48dp"
Android:layout_gravity="top"
Android:orientation="horizontal"
Android:visibility="gone"
Android:paddingLeft="@dimen/activity_vertical_margin"
Android:paddingRight="@dimen/activity_vertical_margin">
<!-- Day buttons are put here programatically -->
</LinearLayout>
</LinearLayout>
それで、あなたは私を助けて、それらのボタンを表示する方法について私を導きますか? PANビューを変更するか、ビューのサイズを変更してください...
ダイアログフラグメントを使用するアクティビティのAndroidManifest.xml
で、windowSoftInputMode
プロパティをadjustNothing
に設定します。
<activity
...
Android:windowSoftInputMode="adjustNothing">
...
ソフト入力を非表示にするonCreateDialog
:
...
Dialog dialog = builder.create();
dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);
return dialog;
}
参考: https://developer.Android.com/training/keyboard-input/visibility.html#ShowOnStart
私はDialogFragmentで次の行を使用します:
getDialog().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
そして他に何もない、ここで完全な例を見てください:
public class TextEditor extends DialogFragment {
public TextEditor () {
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_text_editor, container);
//set to adjust screen height automatically, when soft keyboard appears on screen
getDialog().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
//[add more custom code...]
return view;
}
}
少し遅れますが、質問はDialogFragmentにあるため、次のコードで問題が解決します。
@Override
public void onCreate(Bundle savedInstanceState) {
...
// Setting STYLE_NO_FRAME allows popup dialog fragment to resize after keyboard is shown
setStyle(DialogFragment.STYLE_NO_FRAME, R.style.theme_popupdialog_style);
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
final Dialog dialog = super.onCreateDialog(savedInstanceState);
dialog.setCanceledOnTouchOutside(false);
dialog.getWindow().requestFeature(Window.FEATURE_NO_TITLE);
dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
return dialog;
}
スタイルのテーマについては、次のコードを適用しました
/** must put parent="@Android:style/Theme.Dialog for it to work */
<style name="theme_popupdialog_style" parent="@Android:style/Theme.Dialog">
<item .... >...</item>
</style>
レイアウトがスクロールビュー内にあることを確認します。
<ScrollView
xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="fill_parent"
Android:layout_height="fill_parent">
-->your layout here
</ScrollView>
従う Dirkコメント :
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_text_editor, container);
//add this line
getDialog().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
//[add more custom code...]
return view;
}
これは次の原因でも発生します。
<item name="Android:windowTranslucentStatus">true</item>
テーマから削除してみてください。
他の回答で言及されている変更とは別に、dialogfragmentのthemeも確認してください
私の実験から、「Android:windowIsFloating "属性は、ウィンドウがソフトに反応する方法に影響を与えるようです入力。
これをfalseに設定すると、キーボードが表示されてもウィンドウは上にスライドしません。
BottomSheetDialogで同様の問題が発生している場合。このソリューションは魅力のように機能します。
内側のスタイル:
<style name="BottomSheetDialogTheme" parent="Theme.Design.Light.BottomSheetDialog">
<item name="bottomSheetStyle">@style/AppModalStyle</item>
<item name="Android:windowIsFloating">false</item>
<item name="Android:windowSoftInputMode">adjustResize</item>
<item name="Android:statusBarColor">@Android:color/transparent</item>
</style>
Android:windowIsFloatingはfalse
である必要があります
Android:windowSoftInputModeはadjustResize
でなければなりません。
<style name="AppModalStyle" parent="Widget.Design.BottomSheet.Modal">
<item name="Android:background">@drawable/rounded_corner_dialog</item>
</style>
NestedScrollView内でレイアウトをラップする
<androidx.core.widget.NestedScrollView
Android:layout_width="match_parent"
Android:layout_height="wrap_content">
<--Rest of the layout-->
</androidx.core.widget.NestedScrollView>
一部のデバイスでは、このソリューションでは不十分でした。これをコードに追加すると、私の問題は完全に解決されました。
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
dialog?.setOnShowListener {
val dialog = it as BottomSheetDialog
val bottomSheet = dialog.findViewById<View>(R.id.design_bottom_sheet)
bottomSheet?.let { sheet ->
dialog.behavior.state = BottomSheetBehavior.STATE_EXPANDED
sheet.parent.parent.requestLayout()
}
}
}