wake-up-neo.com

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 platziere ein Fragment in den <FrameLayout>, abhängig von dem sich öffnenden Dialog. Die Aktivität, die den Dialog steuert, sieht folgendermaßen aus:

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

Wenn Sie auf einen Bearbeitungstext innerhalb des Dialogs klicken, wird die Größenänderung leider nicht vorgenommen. Die Variable windowSoftInputMode macht buchstäblich keinen Unterschied, da die Funktionalität mit dem Pan-Modus identisch ist.

Dokumentation sagt "Dies funktioniert natürlich nur für Anwendungen, die einen veränderbaren Bereich haben, der verkleinert werden kann, um genügend Speicherplatz zu schaffen", sagt aber nicht, was es bedeutet, wenn es sich um einen veränderbaren Bereich handelt Wie habe ich nicht einen anpassbaren Bereich?

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

EDIT

Wenn Sie den Dialog so umgeben, ändert sich 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 übergeordnetes Element hilft auch nicht:

<?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>
26
Graeme

Ich habe ein neues Projekt erstellt, um zu versuchen, die grundlegenden Funktionen für die Größenänderung von Fenstern zu nutzen, und das Projekt wurde langsam in Richtung des Ziels meines Projekts verschoben. Dabei habe ich das Problem so verfolgt:

In meiner Themenhierarchie hatte ich folgende Eigenschaft:

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

die auf der Ebene von Theme.Black.NoTitleBar.FullScreen - einem Vorfahren meines benutzerdefinierten Designs begraben wurde.

Die Dokumentation schlägt vor, dass dies ein "Flag ist, das anzeigt, ob dieses Fenster den gesamten Bildschirm ausfüllen soll". Das hört sich nach einer guten Sache an, wenn Sie eine App haben, die den gesamten Bildschirm einnimmt ... Außer sie nimmt immer noch den gesamten Bildschirm ohne Fahne in Anspruch.

Sobald Sie dies herausgenommen haben, ändert sich die App überhaupt nicht. Abgesehen von adjustResize funktioniert das jetzt einwandfrei.

46
Graeme

Vor einiger Zeit hatte ich auch das gleiche Problem in einer Bibliothek, die ich erstellt habe. ( MaterialDrawer )

Soweit ich sehen kann, dass alle bereitgestellten Antworten das Hauptproblem nicht lösen, weisen sie einfach darauf hin, das Vollbildflag (Android:windowFullscreen) zu entfernen, was für viele da draußen keine Lösung ist.

Das oben erwähnte "Problem" wird nur in Android-Versionen angezeigt, die mit API Level 19 (KitKat) beginnen, da sie das Verhalten geändert haben. Um richtig zu sein, ist es kein Problem, es funktioniert wie beabsichtigt. Siehe den Kommentar eines Android-Mitarbeiters ( Android-Ausgabe ).


Also fing ich an, die Android-Quelle zu durchforsten, und kam zu der folgenden Lösung, indem ich den ViewTreeObserver.OnGlobalLayoutListener verwendete und reagierte, wenn die Tastatur angezeigt/oder ausgeblendet wird. Wenn die Tastatur angezeigt wird, füge ich die Auffüllung am unteren Rand der Containeransicht hinzu, die dann genauso emuliert wird wie adjustResize.


Lösung

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

/**
 * 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 Ihrem Fragment verwenden, indem Sie folgende Schritte ausführen:

//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 gesamte util-Klasse wird in der oben genannten Bibliothek MaterialDrawer verwendet und ist hier KeyboardUtil zu finden. Diese enthält immer die neueste Version. (wenn es Verbesserungen gibt)

44
mikepenz

Es scheint, dass das Problem bei FrameLayout liegt, da es sich so verhält, dass jedes Kind den sichtbaren Bereich dieses Frames belegt und daher keine Anpassung an die Größe von Kindern erforderlich ist. Versuchen Sie, RelativeLayout zu verwenden. Es sollte funktionieren.

2
ACM64

Sie könnenResize programmgesteuert anpassen. Fügen Sie dies in onCreate () Ihrer Aktivität hinzu.

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
0
Naimish Vinchhi

Ich weiß nicht warum, aber wenn Sie <item name="Android:windowTranslucentNavigation">true</item> in Ihrem Design haben, ändern Sie es in false. Und es wird anfangen zu arbeiten. Wirklich seltsam.

0
Nastromo

Ohne eine ScrollView als Elternteil zu verwenden, habe ich gerade Android:fitsSystemWindows="true" zu meiner übergeordneten Ansicht hinzugefügt (was eine RelativeLayout und adjustResize für das Manifest der Aktivität war und es hat funktioniert.

0
Josh Laird

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

0
Cata

Ich musste einstellen 

<item name="Android:windowFullscreen">false</item> 

Trotzdem habe ich es nie auf "wahr" gesetzt und die App war eigentlich nicht im Vollbildmodus.

0
F0G