web-dev-qa-db-fra.com

DialogFragment pas redimensionner lorsque le clavier est affiché

J'essaie d'utiliser une SherlockDialogFragment pour demander certaines informations à l'utilisateur. Tout fonctionne correctement sur mon téléphone (Galaxy Nexus, 4.2), mais sur un téléphone plus petit (émulateur 2.3.3), lorsque le clavier apparaît, il couvre les deux boutons du DialogFragment, comme ceci:

dialog covered by keyboard

Ma mise en page se trouve dans une ScrollView et je remplace le softInputMode par SOFT_INPUT_ADJUST_RESIZE sur ma onViewCreated. J'ai aussi essayé SOFT_INPUT_ADJUST_PAN, et ça n'a pas fonctionné

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

Et voici ma mise en page:

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>

Alors, pourriez-vous m'aider et me guider sur la manière d'afficher ces boutons? Soit PAN la vue ou laissez-la redimensionner ...

16
MagicMicky

Définissez la propriété windowSoftInputMode sur adjustNothing dans le AndroidManifest.xml des activités qui utilisent le fragment de boîte de dialogue.

<activity
    ...
    Android:windowSoftInputMode="adjustNothing">
...

et onCreateDialog pour masquer la saisie logicielle:

...
Dialog dialog = builder.create();
dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);
return dialog;
}

Pour votre information: https://developer.Android.com/training/keyboard-input/visibility.html#ShowOnStart

23
Daniel De León

Je viens d'utiliser la ligne suivante dans mon DialogFragment:

getDialog().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);

Et rien d'autre, voir ici l'exemple complet:

    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;
    }
}
35
Dirk

Assurez-vous que la disposition est à l'intérieur d'une vue de défilement:

<ScrollView
  xmlns:Android="http://schemas.Android.com/apk/res/Android"
  Android:layout_width="fill_parent"
  Android:layout_height="fill_parent">

  -->your layout here 
</ScrollView>

et suivez commentaire 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;
    }
7
Sara

Cela peut aussi être causé par:

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

Essayez de le supprimer de votre thème.

4
Langusten Gustel

Même s'il est un peu tard pour une réponse, étant donné que la question est dans DialogFragment, le code suivant résout mon problème. 

@Override
public void onCreate(Bundle savedInstanceState) {
    ...

    /** Setting STYLE_NO_FRAME allows popup dialog fragment to resize after keyboard is shown */
    int style = DialogFragment.STYLE_NO_FRAME, theme = R.style.theme_popupdialog_style;
    setStyle(style, theme);
}

@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;
}

En ce qui concerne le thème de style, j'ai appliqué le code suivant

/** must put parent="@Android:style/Theme.Dialog for it to work */
<style name="theme_popupdialog_style" parent="@Android:style/Theme.Dialog">
    <item .... >...</item>
</style>
3
Xavier

Outre les modifications mentionnées dans d'autres réponses, vérifiez également le theme de dialogfragment
D'après mes expériences, l'attribut " Android: windowIsFloating " semble affecter la façon dont la fenêtre réagit à la saisie logicielle. 

Si vous définissez cette option sur false, la fenêtre ne glissera pas lorsque le clavier sera visible.

2
Zain Ali

Comme déjà mentionné, Android:windowSoftInputMode="adjustResize" et dialog.getWindow().setSoftInputMode(WIndowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE); sont le bon moyen de le faire.

MAIS. Si votre vue n'est pas du tout redimensionnable, vos boutons en bas seront toujours masqués. Dans mon cas, ce hack suffisait:

 KEYBOARD HIDDEN

Je règle Android:layout_weight pour les vues de dessus, de sorte que lorsque le clavier est ouvert et que la boîte de dialogue soit redimensionnée, les vues de dessus soient masquées:  KEYBOARD SHOWN

0
soshial