Android: windowSoftInputMode = "adjustResize" macht keinen Unterschied?

Ich habe einen Faux-Dialog, der dieses Layout verwendet:

<?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_height="match_parent" android:layout_width="match_parent" android:id="@+id/containerPageConatiner"> <FrameLayout android:id="@+id/dialogHolder" android:layout_height="wrap_content" android:layout_width="wrap_content" android:padding="15dp" android:layout_gravity="center" android:background="@drawable/panel_picture_frame_bg_focus_blue"/> </FrameLayout> 

Ich <FrameLayout> ein Fragment in die <FrameLayout> je nach dem Dialog, der sich öffnet – Die Aktivität, die den Dialog kontrolliert, sieht so aus:

 <activity android:label="@string/app_name" android:name=".activity.DialogActivity" android:theme="@style/CustomTheme.Screen.Transparent" android:windowSoftInputMode="adjustResize"> 

Leider, wenn Sie auf einen Bearbeitungstext innerhalb des Dialogs klicken, erfolgt keine Größenänderung. Der windowSoftInputMode macht buchstäblich keinen Unterschied, da die Funktionalität der gleiche ist wie der Pan-Modus.

Die Dokumentation sagt, dass das natürlich nur für Anwendungen funktioniert, die eine verkleinerbare Fläche haben, die reduziert werden kann, um genügend Platz zu schaffen ", aber sagt Ihnen nicht, was es bedeutet," ein resizeable Bereich "und lässt mich denken, dass in irgendeiner Weise ich don ' T haben eine veränderbare Fläche?

Wenn jemand weiß, was los ist, können sie mir helfen?

BEARBEITEN

Um den Dialog zu umgehen, ändert sich das nichts:

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/containerPageConatiner" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <View android:layout_width="0dp" android:layout_height="0dp" android:layout_weight="1" /> <FrameLayout android:id="@+id/dialogHolder" android:layout_height="wrap_content" android:layout_width="wrap_content" android:padding="15dp" android:layout_gravity="center" android:background="@drawable/panel_picture_frame_bg_focus_blue"/> <View android:layout_width="0dp" android:layout_height="0dp" android:layout_weight="1" /> </LinearLayout> 

EDIT2

Scrollview als übergeordneter nicht hilft entweder:

 <?xml version="1.0" encoding="utf-8"?> <ScrollView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/containerPageConatiner" android:layout_width="match_parent" android:layout_height="match_parent" > <FrameLayout android:id="@+id/dialogHolder" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:padding="15dp" /> </ScrollView> 

7 Solutions collect form web for “Android: windowSoftInputMode = "adjustResize" macht keinen Unterschied?”

Ich habe ein neues Projekt erstellt, um zu versuchen, die grundlegenden Funktionen für die Größenänderung zu bekommen und die langsam bewegte es auf die Ziel-Peice meines Projekts. Auf diese Weise habe ich das Problem aufgespürt:

In meiner Themenhierarchie hatte ich diese Eigenschaft:

 <item name="android:windowFullscreen">true</item> 

Die auf der Ebene von Theme.Black.NoTitleBar.FullScreen – Ein Ahne von meinem benutzerdefinierten Thema.

Die Dokumentation deutet darauf hin, dass dies ein "Flag" ist, der angibt, ob dieses Fenster den gesamten Bildschirm füllen soll ". Das klingt wie eine gute Sache zu haben, wenn man eine App hat, die den ganzen Bildschirm aufnimmt … Außer es nimmt immer noch den ganzen Bildschirm ohne die Fahne.

In der Tat, sobald Sie dies herausgenommen haben, gibt es absolut keine Änderung in der App überhaupt … abgesehen von adjustResize funktioniert jetzt perfekt.

Eine Weile zurück hatte ich auch das gleiche Problem in einer Bibliothek, die ich erstellt habe. ( MaterialDrawer )

Soweit ich sehen kann, alle bereitgestellten Antworten nicht lösen das Hauptproblem, sie nur Punkt, um die Vollbild-Flagge ( android:windowFullscreen ) zu entfernen, die keine Lösung für viele da draußen ist.

Die oben genannte "Ausgabe" erscheint nur in Android-Versionen, beginnend mit API Level 19 (KITKAT), weil sie das Verhalten geändert haben. Um richtig zu sein, ist es kein Problem, es funktioniert wie beabsichtigt. Sehen Sie den Kommentar von einem Android-Mitarbeiter ( Android-Issue ).


Also habe ich angefangen zu graben um die Android-Quelle und kam zu der folgenden Lösung, indem Sie die ViewTreeObserver.OnGlobalLayoutListener und reagieren, wenn die Tastatur angezeigt / oder ausgeblendet wird. Wenn die Tastatur angezeigt wird, füge ich die Polsterung an die Unterseite der Containeransicht hinzu, die dann das gleiche wie das adjustResize emulieren würde.


Lösung

Um die Nutzung zu vereinfachen, habe ich das Ganze in einer einfachen KeyboardUtil Helper-Klasse verpackt.

 /** * Created by mikepenz on 14.03.15. * This class implements a hack to change the layout padding on bottom if the keyboard is shown * to allow long lists with editTextViews * Basic idea for this solution found here: http://stackoverflow.com/a/9108219/325479 */ public class KeyboardUtil { private View decorView; private View contentView; public KeyboardUtil(Activity act, View contentView) { this.decorView = act.getWindow().getDecorView(); this.contentView = contentView; //only required on newer android versions. it was working on API level 19 (Build.VERSION_CODES.KITKAT) if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { decorView.getViewTreeObserver().addOnGlobalLayoutListener(onGlobalLayoutListener); } } public void enable() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { decorView.getViewTreeObserver().addOnGlobalLayoutListener(onGlobalLayoutListener); } } public void disable() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { decorView.getViewTreeObserver().removeOnGlobalLayoutListener(onGlobalLayoutListener); } } //a small helper to allow showing the editText focus ViewTreeObserver.OnGlobalLayoutListener onGlobalLayoutListener = new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { Rect r = new Rect(); //r will be populated with the coordinates of your view that area still visible. decorView.getWindowVisibleDisplayFrame(r); //get screen height and calculate the difference with the useable area from the r int height = decorView.getContext().getResources().getDisplayMetrics().heightPixels; int diff = height - r.bottom; //if it could be a keyboard add the padding to the view if (diff != 0) { // if the use-able screen height differs from the total screen height we assume that it shows a keyboard now //check if the padding is 0 (if yes set the padding for the keyboard) if (contentView.getPaddingBottom() != diff) { //set the padding of the contentView for the keyboard contentView.setPadding(0, 0, 0, diff); } } else { //check if the padding is != 0 (if yes reset the padding) if (contentView.getPaddingBottom() != 0) { //reset the padding of the contentView contentView.setPadding(0, 0, 0, 0); } } } }; /** * Helper to hide the keyboard * * @param act */ public static void hideKeyboard(Activity act) { if (act != null && act.getCurrentFocus() != null) { InputMethodManager inputMethodManager = (InputMethodManager) act.getSystemService(Activity.INPUT_METHOD_SERVICE); inputMethodManager.hideSoftInputFromWindow(act.getCurrentFocus().getWindowToken(), 0); } } } 

Sie können es dann in Ihrer Aktivität oder Fragment verwenden, indem Sie Folgendes tun:

 //initialize the KeyboardUtil (you can do this global) KeyboardUtil keyboardUtil = new KeyboardUtil(activity, getContent().getChildAt(0)); //enable it keyboardUtil.enable(); //disable it keyboardUtil.disable(); 

Die ganze Gebrauchsklasse wird in der oben genannten Bibliothek MaterialDrawer verwendet und kann hier gefunden werden KeyboardUtil . Dies wird immer die neueste Version enthalten. (Wenn es Verbesserungen gibt)

Es scheint, dass das Problem mit FrameLayout ist, da es sich so verhält, dass jedes Kind sichtbaren Raum dieses Rahmens einnimmt, also keine Notwendigkeit, die Größe zu ändern, um Kinder zu passen. Versuchen Sie, RelativeLayout zu verwenden. Es sollte funktionieren.

Versuchen Sie, Ihre LinearLayout auf eine ScrollView , die für mich einmal gearbeitet hat.

Ohne eine ScrollView als meine Eltern zu verwenden, habe ich nur android:fitsSystemWindows="true" hinzugefügt android:fitsSystemWindows="true" zu meiner adjustResize (was war ein RelativeLayout und adjustResize zum Manifest für die Aktivität und es funktionierte.

Als ursprüngliches Poster entdeckt, wenn das Vollbild-Flag einer Aktivität zugeordnet ist, wird das android: windowFullscreen-Attribut nicht funktionieren und so wird dein Fenster nicht die Größe ändern, wenn die Soft-Tastatur sichtbar ist und es nicht scrollbar ist.

Einfach das Entfernen der Vollbild-Flagge zu entfernen und nicht mit einem Fullscreen-Thema wird das Scrollen, wenn die Soft-Tastatur sichtbar ist.

Stellen Sie sicher, dass Sie windowTranslucentStatus auf false in Ihren Stilen setzen.

  • AutoCompleteTextView - wie man Dropdown deaktiviert, wenn wir eine genaue Übereinstimmung nach der Filterung haben?
  • Android: EditText neben ImageView - EditText so weit wie möglich
  • ListView innerhalb von LinearLayout wird nicht wachsen, um alle Kinder zu zeigen
  • Cardview Schatten erscheint nicht in Lutscher?
  • Android-Skala Animation auf angegebene Größe
  • View Inflation und benutzerdefinierte Ansichten
  • Ändern der Navigationselemente, wenn der Benutzer angemeldet ist
  • Wie man HTML-Code in Android-App einbetten?
  • So erstellen Sie einen Count-Up-Effekt für ein TextView in Android
  • Icon mit Text innen - wie man im Layout definiert?
  • Marquee Text funktioniert nicht im Widget
  • Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.