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.

  • Herauszufinden, welches Layout einen Fehler hat
  • Kann der Android-Layout-Ordner Unterordner enthalten?
  • ListView in ScrollView scrollt nicht auf Android
  • Wie kann man lange Pressereignisse für Listview-Item einer ListActivity erfassen?
  • Wie man Schwerkraftfahnen in einer benutzerdefinierten Android-Ansicht überprüft?
  • Hat der Anleger den Kontext der Aktivität?
  • Wiederverwendung von Ansichten in Android Listview mit 2 verschiedenen Layouts
  • Ändern Sie checkMark oder Größe von CheckedTextView
  • DialogFragments mit Geräten api Ebene <11
  • Android App Fehler - Duplizieren ID 0x7f04000f, Tag null oder übergeordneten ID 0x0 mit einem anderen Fragment für com.google.android.gms.maps.SupportMapFragment
  • Fehler beim Aufblasen des Layouts von FloatingActionButton: NoSuchMethodException
  • Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.