web-dev-qa-db-ja.com

キーボードが表示されているときにDialogFragmentのサイズが変更されない

ユーザーからの入力を求めるためにSherlockDialogFragmentを使用しようとしています。私の電話(Galaxy Nexus、4.2)ではすべて正常に動作しますが、小型の電話(エミュレータ2.3.3)では、キーボードが表示されると、次のようにDialogFragmentの2つのボタンが覆われます。

dialog covered by keyboard

私のレイアウトは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ビューを変更するか、ビューのサイズを変更してください...

21
MagicMicky

ダイアログフラグメントを使用するアクティビティの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

27
Daniel De León

私は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;
    }
}
43
Dirk

少し遅れますが、質問は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>
8
Xavier

レイアウトがスクロールビュー内にあることを確認します。

<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;
    }
6
Sara

これは次の原因でも発生します。

<item name="Android:windowTranslucentStatus">true</item>

テーマから削除してみてください。

3

他の回答で言及されている変更とは別に、dialogfragmentのthemeも確認してください
私の実験から、「Android:windowIsFloating "属性は、ウィンドウがソフトに反応する方法に影響を与えるようです入力。

これをfalseに設定すると、キーボードが表示されてもウィンドウは上にスライドしません。

3
Zain Ali

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:windowIsFloatingfalseである必要があります

Android:windowSoftInputModeadjustResizeでなければなりません。

<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()
        }
    }
}

すでに述べたように、_Android:windowSoftInputMode="adjustResize"_およびdialog.getWindow().setSoftInputMode(WIndowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);はこれを行う正しい方法です。

だが。ビューのサイズを変更できない場合でも、下部のボタンは非表示のままです。私の場合、このハックで十分でした:

KEYBOARD HIDDEN

トップビューに_Android:layout_weight_を設定して、キーボードが開いてダイアログのサイズが変更されると、トップビューが非表示になるようにします: KEYBOARD SHOWN

0
soshial