windowSoftInputMode = "AdjustResize" yarı saydam eylem / navbar ile çalışmıyor


130

Yeni Android KitKat (4.4) ve .tml'de yarı saydam işlem çubuğu / gezinme çubuğu ile ilgili sorunlar yaşıyorum windowSoftInputMode="adjustResize".

Normalde AdjustResize için InputMode'u değiştirmek, klavye gösterildiğinde uygulama kendini yeniden boyutlandırmalıdır ... ama burada olmayacak! Şeffaf efekt için satırları silersem, yeniden boyutlandırma çalışıyor.

Yani klavye görünüyorsa, ListView'ım onun altındadır ve son birkaç öğeye erişemiyorum. (Yalnızca klavyeyi manuel olarak gizleyerek)

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="XYZ"
android:versionCode="23"
android:versionName="0.1" >

<uses-sdk
    android:minSdkVersion="9"
    android:targetSdkVersion="19" />

<application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/Theme.XYZStyle" >
    <activity
        android:name="XYZ"
        android:label="@string/app_name"
        android:windowSoftInputMode="adjustResize" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>

</manifest>

değerler v19 / styles.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>

<style name="Theme.XYZStyle" parent="@style/Theme.AppCompat.Light">
    <item name="android:windowTranslucentStatus">true</item>
    <item name="android:windowTranslucentNavigation">true</item>
</style>

</resources>

fragment.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >

<ListView
    android:id="@+id/listView_contacts"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:clipToPadding="false"
    android:divider="@null"
    android:dividerHeight="0dp"
    android:drawSelectorOnTop="true"
    android:fastScrollAlwaysVisible="true"
    android:fastScrollEnabled="true"
    android:paddingBottom="@dimen/navigationbar__height" >
</ListView>

</RelativeLayout>

Bunu düzeltmek için bir fikir var mı?


olası android
mikepenz

Yanıtlar:


185

Aşağıdaki mülkü kaçırıyorsunuz:

android:fitsSystemWindows="true"

kök RelativeLayoutait parça .xml düzeni.

Güncelleme:

Geçen yıl Chris Bane tarafından bunun nasıl çalıştığını ayrıntılı olarak açıklayan ilginç bir konuşma vardı:

https://www.youtube.com/watch?v=_mGDMVRO3iE


5
Sanırım tam ekran politikasına sahip bir şey
Felix.D

1
Adamsın! Ben bu sorun sadece Lollipop sürümünde başıma geldi ve düzeltildi.
David

6
@David Henüz düzeltilmedi, hala hatmi cihazında kırılıyor, bir iletişim kutusu açıp kaydırmayı denerseniz, softkeboard kaydırmayı engelleyecektir
Bytecode

5
Çalışıyor, ancak araç çubuğum ve durum çubuğu özelleştirmemle çakışıyor
Ninja

2
çalışır ancak durum çubuğu artık yarı saydam değildir. Düzenin tüm ekranı kaplamasını istiyorum.
htafoya

34

Burada ilgili bir hata raporu var . Sınırlı testlerden, hile yaptığını hiçbir tepki olmadan yapan bir geçici çözüm buldum. Aşağıdaki mantıkla kökünüzün özel bir uygulamasını ekleyin ViewGroup(neredeyse her zaman kullanıyorum FrameLayout, bu yüzden test ettiğim şey budur). Ardından, bu özel düzeni kök düzeninizin yerine kullanın ve ayarladığınızdan emin olun android:fitsSystemWindows="true". Ardından , düzeninizin geri kalanını, istenirse, sistem eklerini hesaba getInsets()katacak OnPreDrawListenerşekilde ayarlamak için düzenden sonra istediğiniz zaman (örneğin bir ekleyin ) arayabilirsiniz .

import android.content.Context;
import android.graphics.Rect;
import android.os.Build;
import android.util.AttributeSet;
import android.widget.FrameLayout;
import org.jetbrains.annotations.NotNull;

/**
 * @author Kevin
 *         Date Created: 3/7/14
 *
 * https://code.google.com/p/android/issues/detail?id=63777
 * 
 * When using a translucent status bar on API 19+, the window will not
 * resize to make room for input methods (i.e.
 * {@link android.view.WindowManager.LayoutParams#SOFT_INPUT_ADJUST_RESIZE} and
 * {@link android.view.WindowManager.LayoutParams#SOFT_INPUT_ADJUST_PAN} are
 * ignored).
 * 
 * To work around this; override {@link #fitSystemWindows(android.graphics.Rect)},
 * capture and override the system insets, and then call through to FrameLayout's
 * implementation.
 * 
 * For reasons yet unknown, modifying the bottom inset causes this workaround to
 * fail. Modifying the top, left, and right insets works as expected.
 */
public final class CustomInsetsFrameLayout extends FrameLayout {
    private int[] mInsets = new int[4];

    public CustomInsetsFrameLayout(Context context) {
        super(context);
    }

    public CustomInsetsFrameLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public CustomInsetsFrameLayout(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    public final int[] getInsets() {
        return mInsets;
    }

    @Override
    protected final boolean fitSystemWindows(@NotNull Rect insets) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            // Intentionally do not modify the bottom inset. For some reason, 
            // if the bottom inset is modified, window resizing stops working.
            // TODO: Figure out why.

            mInsets[0] = insets.left;
            mInsets[1] = insets.top;
            mInsets[2] = insets.right;

            insets.left = 0;
            insets.top = 0;
            insets.right = 0;
        }

        return super.fitSystemWindows(insets);
    }
}

Yana fitSystemWindowler kaldırıldı geçici çözümü tamamlamak için aşağıdaki, cevaba bakınız.


1
Aslında SOFT_INPUT_ADJUST_PAN, deneyimlerime göre göz ardı edilmiyor gibi görünüyor - odaklanmış görünüm altında sistem çubuğu ve kaydırma klavyesi dahil olmak üzere tüm ekranı yukarı hareket ettirecek.
sealskej

Teşekkürler - SOFT_INPUT_ADJUST_PAN konusunda haklısınız. Bunu parçamda kullandım: getActivity (). GetWindow (). SetSoftInputMode (WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
Simon

Aktivite için ayarResize'a sahip olabilmemin tek yolu buydu (klavye gösterildiğinde görünümün kaydırılması için gerekli), fitSystemWindows doğru olarak ayarlandı, böylece kaydırma gerçekten> = Lollipop'ta ve yarı saydam statusBar'da gerçekleşir. Çok teşekkürler.
Lucas

gerçek çözüm bu
martyglaubitz

Düzeni yukarı itmek zaman alsa bile klavyeyi göstermek ve gizlemek zaman alır. Herhangi bir çözüm ?
Vanjara Sweta

28

@kcoppock yanıtı gerçekten yararlı, ancak fitSystemWindows, API düzeyi 20'de kullanımdan kaldırıldı

API 20'den (KITKAT_WATCH) beri onApplyWindowInsets'i geçersiz kılmalısınız

@Override
public final WindowInsets onApplyWindowInsets(WindowInsets insets) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT_WATCH) {
        return super.onApplyWindowInsets(insets.replaceSystemWindowInsets(0, 0, 0,
                insets.getSystemWindowInsetBottom()));
    } else {
        return insets;
    }
}

Bunu hangi sınıfta geçersiz kılmalıyız?
Ben-J

@ Ben-J, orijinal sınıfını genişleten bir sınıfta
Victor91

Kullanılmadığı zamanlarda mInsets dizi öğelerini neden ayarladığınız hakkında hiçbir fikrim yok, ama işe yarıyor
Buckstabue

1
Sürüm kontrolünüz yerine kullanabilirsinizViewCompat.setOnApplyWindowInsetsListener
2018

Bunu çalışmayı başaramadım, ancak dispatchApplyWindowInsetsonun yerine geçersiz kılma (aynı kod) benim için çalıştı
petter

11

Bu, yarı saydam durum çubuğuna sahip olmam ve parçada yeniden boyutlandırmam için çalıştı:

  1. @ Victor91 ve @kcoppock'ın dediği gibi özel bir RelativeLayout oluşturun.

  2. CustomRelativeLayout'u parçanızın üst düzeni olarak kullanın.

  3. Android ile temayı bildirin: windowTranslucentStatus = true

  4. Kapsayıcı Etkinliği, Manifest'te android ile bildirilmelidir: windowSoftInputMode = "AdjustResize" ve bildirilen temayı kullanın

  5. Lütfen parça kök düzeninde fitsSystemWindows kullanın!

    public class CustomRelativeLayout extends RelativeLayout {
    
        private int[] mInsets = new int[4];
    
        public CustomRelativeLayout(Context context) {
            super(context);
        }
    
        public CustomRelativeLayout(Context context, AttributeSet attrs) {
            super(context, attrs);
        }
    
        public CustomRelativeLayout(Context context, AttributeSet attrs, int defStyleAttr) {
            super(context, attrs, defStyleAttr);
        }
    
        public CustomRelativeLayout(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
            super(context, attrs, defStyleAttr, defStyleRes);
        }
    
        @Override
        public final WindowInsets onApplyWindowInsets(WindowInsets insets) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT_WATCH) {
                mInsets[0] = insets.getSystemWindowInsetLeft();
                mInsets[1] = insets.getSystemWindowInsetTop();
                mInsets[2] = insets.getSystemWindowInsetRight();
                return super.onApplyWindowInsets(insets.replaceSystemWindowInsets(0, 0, 0,
                        insets.getSystemWindowInsetBottom()));
            } else {
                return insets;
            }
        }
    }

Sonra xml'de,

<com.blah.blah.CustomRelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:app="http://schemas.android.com/apk/res-auto"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     android:fitsSystemWindows="true">
</com.blah.blah.CustomRelativeLayout>

1
Şimdiye kadarki en iyi cevap bu ve bir süredir çözüm arıyorum. Mükemmel çalışıyor, ancak araç çubuğunuza fazladan dolgu eklemeniz gerekiyor, bu olmadan araç çubuğunuz üst üste binen durum çubuğu olacaktır
Paulina

WindowTranslucentNavigation ne olacak? bunda yardım edebilir misin?
V-rund Puro-hit

10

Ekleri özelleştirmek istiyorsanız ve API düzeyi> = 21'i hedefliyorsanız, bunu özel bir görünüm grubu oluşturmanıza gerek kalmadan gerçekleştirebilirsiniz. Yalnızca ayarlayarak fitsSystemWindows, kapsayıcı görünümünüze varsayılan olarak uygulanacak ve bunu istemeyebilirsiniz.

Sürüm kontrolleri bu yönteme dahil edilmiştir ve sadece> = 21 cihazları lambda içindeki kodu çalıştıracaktır. Kotlin örneği:

ViewCompat.setOnApplyWindowInsetsListener(container) { view, insets ->
  insets.replaceSystemWindowInsets(0, 0, 0, insets.systemWindowInsetBottom).apply {
    ViewCompat.onApplyWindowInsets(view, this)
  }
}

Düzeninizin hala fitsSystemWindowsbayrağı ayarladığından emin olun, aksi takdirde pencere ekleri dinleyicisi çağrılmaz.

<FrameLayout
    android:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
    />

Bu kaynaklar faydalıdır:

https://medium.com/google-developers/why-would-i-want-to-fitssystemwindows-4e26d9ce1eec https://medium.com/@azizbekian/windowinsets-24e241d4afb9


1
Bu hala en iyi yaklaşımdır, çünkü bunu sizin BaseFragmentile birlikte uygulayabilirsiniz view.fitsSystemWindows = trueve gerçek XML düzenlerinde veya View alt sınıflarında herhangi bir değişiklik yapmadan çalışır.
Bogdan Zurac

5

Aynı sorunu yaşadım, Etkinliğimde kök görünümü olarak bir ScrollView vardı ve yarı saydam durum çubuğu etkinleştirildiğinde, klavye gösterildiğinde doğru şekilde yeniden boyutlandırmadı ... ve sonuç olarak ekran, giriş görünümlerini gizleyerek kaydırılmadı.

Çözüm: Her şeyi (düzen ve etkinlik mantığı) yeni bir Parçanın içine taşıdı. Ardından Aktivite yalnızca bu Parçayı içerecek şekilde değiştirildi. Şimdi her şey beklendiği gibi çalışıyor!

Bu, aktivitenin düzenidir:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
    xmlns:android="http://schemas.android.com/apk/res/android"

    android:id="@+id/contentView"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true" />

Benim için bir cazibe gibi çalışıyor
imike

2

Joseph Johnson'ın Android'deki geçici çözümüne dayalıdır Yazılım klavyesi göründüğünde Tam Ekran Modunda düzen nasıl ayarlanır?

Bunu aktivitenizden onCreate()sonra arayın setContentView().

AndroidBug5497Workaround.assistActivity(this);

orijinalden litte farklı yerini return (r.bottom - r.top);ile return r.bottom;decomputeUsableHeight()

bazı nedenlerden dolayı etkinlik fitsSystemWindowsözniteliğimi olarak ayarlamam gerekiyor false.

bu geçici çözüm beni kurtardı. benim için iyi çalışıyor. umarım sana yardım edebilir.

uygulama sınıfı:

public class AndroidBug5497Workaround {

// For more information, see https://code.google.com/p/android/issues/detail?id=5497
// To use this class, simply invoke assistActivity() on an Activity that already has its content view set.

public static void assistActivity (Activity activity) {
    new AndroidBug5497Workaround(activity);
}

private View mChildOfContent;
private int usableHeightPrevious;
private FrameLayout.LayoutParams frameLayoutParams;

private AndroidBug5497Workaround(Activity activity) {
    FrameLayout content = (FrameLayout) activity.findViewById(android.R.id.content);
    mChildOfContent = content.getChildAt(0);
    mChildOfContent.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
        public void onGlobalLayout() {
            possiblyResizeChildOfContent();
        }
    });
    frameLayoutParams = (FrameLayout.LayoutParams) mChildOfContent.getLayoutParams();
}

private void possiblyResizeChildOfContent() {
    int usableHeightNow = computeUsableHeight();
    if (usableHeightNow != usableHeightPrevious) {
        int usableHeightSansKeyboard = mChildOfContent.getRootView().getHeight();
        int heightDifference = usableHeightSansKeyboard - usableHeightNow;
        if (heightDifference > (usableHeightSansKeyboard/4)) {
            // keyboard probably just became visible
            frameLayoutParams.height = usableHeightSansKeyboard - heightDifference;
        } else {
            // keyboard probably just became hidden
            frameLayoutParams.height = usableHeightSansKeyboard;
        }
        mChildOfContent.requestLayout();
        usableHeightPrevious = usableHeightNow;
    }
}

private int computeUsableHeight() {
    Rect r = new Rect();
    mChildOfContent.getWindowVisibleDisplayFrame(r);
    return r.bottom;
}

}


0

AndroidBug5497Workaround.java bellek sızıntısına dikkat edin. aşağıdaki koda ihtiyacım var

getViewTreeObserver().removeOnGlobalLayoutListener(listener);

Activity'in yaşam döngüsünde onPause () olduğunda otomatik olarak removeOnGlobalLayoutListener () 'i çağıran RxJava kullanan örneğim

public class MyActivity extends RxAppCompatActivity {
    // ...

protected void onStart(){
    super.onStart();

        TRSoftKeyboardVisibility
            .changes(this) // activity
            .compose(this.<TRSoftKeyboardVisibility.ChangeEvent>bindUntilEvent(ActivityEvent.PAUSE))
            .subscribe(keyboardEvent -> {
                FrameLayout content = (FrameLayout) findViewById(android.R.id.content);
                View firstChildView = content.getChildAt(0);
                firstChildView.getLayoutParams().height = keyboardEvent.viewHeight();
                firstChildView.requestLayout();

                // keyboardEvent.isVisible      = keyboard visible or not
                // keyboardEvent.keyboardHeight = keyboard height
                // keyboardEvent.viewHeight     = fullWindowHeight - keyboardHeight
            });
   //...
}





package commonlib.rxjava.keyboard;

import android.app.Activity;
import android.view.View;
import android.widget.FrameLayout;
import kr.ohlab.android.util.Assert;
import rx.Observable;

public class TRSoftKeyboardVisibility {

    public static Observable<ChangeEvent> changes(Activity activity) {
        Assert.notNull(activity, "activity == null");
        FrameLayout content = (FrameLayout) activity.findViewById(android.R.id.content);
        View childOfContent = content.getChildAt(0);
        return Observable.create(
            new TRSoftKeyboardVisibilityEventOnSubscribe(childOfContent));
    }

    public static final class ChangeEvent {
        private final int keyboardHeight;
        private final boolean visible;
        private final int viewHeight;

        public static ChangeEvent create(boolean visible, int keyboardHeight,
            int windowDisplayHeight) {
            return new ChangeEvent(visible, keyboardHeight, windowDisplayHeight);
        }

        private ChangeEvent(boolean visible, int keyboardHeight, int viewHeight) {
            this.keyboardHeight = keyboardHeight;
            this.visible = visible;
            this.viewHeight = viewHeight;
        }

        public int keyboardHeight() {
            return keyboardHeight;
        }

        public boolean isVisible() {
            return this.visible;
        }

        public int viewHeight() {
            return viewHeight;
        }

        @Override
        public boolean equals(Object o) {
            if (this == o) return true;
            if (!(o instanceof ChangeEvent)) return false;

            ChangeEvent that = (ChangeEvent) o;

            if (keyboardHeight != that.keyboardHeight) return false;
            if (visible != that.visible) return false;
            return viewHeight == that.viewHeight;
        }

        @Override
        public int hashCode() {
            int result = keyboardHeight;
            result = 31 * result + (visible ? 1 : 0);
            result = 31 * result + viewHeight;
            return result;
        }

        @Override
        public String toString() {
            return "ChangeEvent{" +
                "keyboardHeight=" + keyboardHeight +
                ", visible=" + visible +
                ", viewHeight=" + viewHeight +
                '}';
        }
    }
}


package commonlib.rxjava.keyboard;

import android.graphics.Rect;
import android.view.View;
import android.view.ViewTreeObserver;
import kr.ohlab.android.util.Assert;
import rx.Observable;
import rx.Subscriber;
import rx.android.MainThreadSubscription;
import timber.log.Timber;

public class TRSoftKeyboardVisibilityEventOnSubscribe
    implements Observable.OnSubscribe<TRSoftKeyboardVisibility.ChangeEvent> {
    private final View mTopView;
    private int mLastVisibleDecorViewHeight;
    private final Rect mWindowVisibleDisplayFrame = new Rect();

    public TRSoftKeyboardVisibilityEventOnSubscribe(View topView) {
        mTopView = topView;
    }

    private int computeWindowFrameHeight() {
        mTopView.getWindowVisibleDisplayFrame(mWindowVisibleDisplayFrame);
        return (mWindowVisibleDisplayFrame.bottom - mWindowVisibleDisplayFrame.top);
    }

    private TRSoftKeyboardVisibility.ChangeEvent checkKeyboardVisibility() {
        int windowFrameHeightNow = computeWindowFrameHeight();
        TRSoftKeyboardVisibility.ChangeEvent event = null;
        if (windowFrameHeightNow != mLastVisibleDecorViewHeight) {
            int mTopViewHeight = mTopView.getHeight();
            int heightDiff = mTopViewHeight - windowFrameHeightNow;
            Timber.e("XXX heightDiff=" + heightDiff);
            if (heightDiff > (mTopViewHeight / 4)) {
                event = TRSoftKeyboardVisibility.ChangeEvent.create(true, heightDiff, windowFrameHeightNow);
            } else {
                event = TRSoftKeyboardVisibility.ChangeEvent.create(false, 0, windowFrameHeightNow);
            }
            mLastVisibleDecorViewHeight = windowFrameHeightNow;
            return event;
        }

        return null;
    }

    public void call(final Subscriber<? super TRSoftKeyboardVisibility.ChangeEvent> subscriber) {
        Assert.checkUiThread();

        final ViewTreeObserver.OnGlobalLayoutListener listener =
            new ViewTreeObserver.OnGlobalLayoutListener() {
                @Override
                public void onGlobalLayout() {
                    TRSoftKeyboardVisibility.ChangeEvent event = checkKeyboardVisibility();
                    if( event == null)
                        return;
                    if (!subscriber.isUnsubscribed()) {
                        subscriber.onNext(event);
                    }
                }
            };

        mTopView.getViewTreeObserver().addOnGlobalLayoutListener(listener);

        subscriber.add(new MainThreadSubscription() {
            @Override
            protected void onUnsubscribe() {
                mTopView.getViewTreeObserver().removeOnGlobalLayoutListener(listener);
            }
        });
    }
}

0

Bir problemim vardı.

WindowDrawsSystemBarBackgrounds'u 'true' olarak ayarladım ve uygulamam durum çubuğunun altında görünmeli.

Bu benim etkinlik temam.

<item name="android:windowTranslucentStatus" tools:targetApi="KITKAT">false</item>
<item name="android:windowDrawsSystemBarBackgrounds">true</item>
<item name="android:windowTranslucentNavigation">true</item>
<item name="android:statusBarColor">@android:color/transparent</item>

ve jianshu'nun blogundan yardım aldım . benim gibi kod okuyabilirsin ama metin. Birkaç kod daha ekliyorum.

public final class ZeroInsetsFrameLayout extends FrameLayout {
    private int[] mInsets = new int[4];

    public ZeroInsetsFrameLayout(Context context) {
        super(context);
    }

    public ZeroInsetsFrameLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public ZeroInsetsFrameLayout(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    public final int[] getInsets() {
        return mInsets;
    }

    @Override
    public WindowInsets computeSystemWindowInsets(WindowInsets in, Rect outLocalInsets) {
        outLocalInsets.left = 0;
        outLocalInsets.top = 0;
        outLocalInsets.right = 0;

        return super.computeSystemWindowInsets(in, outLocalInsets);
    }

    @Override
    protected final boolean fitSystemWindows(@NonNull Rect insets) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            // Intentionally do not modify the bottom inset. For some reason,
            // if the bottom inset is modified, window resizing stops working.
            // TODO: Figure out why.

            mInsets[0] = insets.left;
            mInsets[1] = insets.top;
            mInsets[2] = insets.right;

            insets.left = 0;
            insets.top = 0;
            insets.right = 0;
        }

        return super.fitSystemWindows(insets);
    }
}

Bu benim parça düzenim.

<com.dhna.widget.ZeroInsetsFrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
    android:background="@color/white">

    <!-- your xml code -->

</ZeroInsetsFrameLayout>

Sana yardımcı olmasını istiyorum. iyi şanslar!


Klavyeyi gizlemek ve göstermek zaman alır ve ayrıca düzeni yukarı itmek de zaman alır. Herhangi bir çözüm ? Nasıl yönetilir?
Vanjara Sweta

0
  • Tüm forumda araştırma yaptıktan sonra. bu yollar işaret etmeye yardımcı olamaz. Bu şekilde yapmayı denediğimde şanslıyım. Sorunu çözmeme yardımcı oluyor

XML

<RelativeLayout 
      xmlns:android="http://schemas.android.com/apk/res/android"
      android:layout_width="match_parent"
      android:layout_height="match_parent"
      android:fitsSystemWindows="true">
       <!-- Your xml -->
    </RelativeLayout>

Aktivite

@Override
protected void onCreate(Bundle savedInstanceState) {
   super.onCreate(savedInstanceState);
   setContentView("Your Activity");
   setAdjustScreen();

}

Oluşturulan Func

protected void setAdjustScreen(){
        getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
        getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
        /*android:windowSoftInputMode="adjustPan|adjustResize"*/
}

Sonunda ana festivalinize birkaç satır ekledik

 <activity
     android:name="Your Activity"
     android:windowSoftInputMode="adjustPan|adjustResize"
     android:screenOrientation="portrait"></activity>

0

Ben de aynı sorunu yaşadım. Koordinatör düzenini kullanarak çözdüm

activity.main.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout
    android:layout_height="match_parent" android:layout_width="match_parent"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:android="http://schemas.android.com/apk/res/android">


    <android.support.design.widget.AppBarLayout
    android:layout_height="wrap_content"
    android:layout_width="match_parent"
    android:theme="@style/AppTheme.AppBarOverlay">

    <android.support.v7.widget.Toolbar
        android:layout_height="?attr/actionBarSize"
        android:layout_width="match_parent"
        app:popupTheme="@style/AppTheme.PopupOverlay"
        android:background="?attr/colorPrimary"
        android:id="@+id/toolbar"/>

</android.support.design.widget.AppBarLayout>

    <include layout="@layout/content_main2"/>

</android.support.design.widget.CoordinatorLayout>

content_main2.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:app="http://schemas.android.com/apk/res-auto">


    <android.support.v7.widget.RecyclerView
        android:layout_height="match_parent"
        android:layout_width="match_parent"
        android:layout_marginTop="30dp"
        android:layout_marginBottom="30dp"
        app:layout_scrollFlags="scroll|exitUntilCollapsed"
        android:id="@+id/post_msg_recyclerview">
    </android.support.v7.widget.RecyclerView>

    <EditText
        android:layout_width="match_parent"
        android:layout_height="50dp"
        app:layout_constraintBottom_toBottomOf="parent"
        android:background="@color/colorPrimary"


        />

</android.support.constraint.ConstraintLayout>

MainActivity.java

şimdi bu satırı linearLayoutManager.setStackFromEnd (true) ekleyin;

 LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
        linearLayoutManager.setStackFromEnd(true);
        recyclerView.setLayoutManager(linearLayoutManager);
        Adapter adapter1=new Adapter(arrayList);
        recyclerView.setAdapter(adapter1);

0
<androidx.constraintlayout.widget.ConstraintLayout
  android:fitsSystemWindows="true">

  <androidx.coordinatorlayout.widget.CoordinatorLayout>
    <com.google.android.material.appbar.AppBarLayout>

      <com.google.android.material.appbar.CollapsingToolbarLayout/>

    </com.google.android.material.appbar.AppBarLayout>

    <androidx.core.widget.NestedScrollView>
    <Editext/>
    <androidx.core.widget.NestedScrollView/>

  </androidx.coordinatorlayout.widget.CoordinatorLayout>

</androidx.constraintlayout.widget.ConstraintLayout>

0

Bunu önce kök düzeninize ekleyin.

android:fitsSystemWindows="true"

Bu yaklaşımı kullandığınızda, uygulamanızın kullanıcı arayüzünün kritik bölümlerinin (örneğin, bir Haritalar uygulamasındaki yerleşik kontroller) sistem çubukları tarafından kapatılmamasını sağlamak sizin sorumluluğunuz olur. Bu, uygulamanızı kullanılamaz hale getirebilir. Çoğu durumda bunu, android: fitsSystemWindows özniteliğini XML düzen dosyanıza true olarak ayarlayarak ekleyerek halledebilirsiniz. Bu, sistem pencereleri için alan bırakmak üzere üst ViewGroup'un dolgusunu ayarlar. Çoğu uygulama için bu yeterlidir.

Ancak bazı durumlarda, uygulamanız için istenen düzeni elde etmek için varsayılan dolguyu değiştirmeniz gerekebilir. İçeriğinizin sistem çubuklarına (pencerenin "içerik ekleri" olarak bilinen bir alanı kaplar) göre nasıl yerleştirileceğini doğrudan değiştirmek için fitSystemWindows'u (Rect insets) geçersiz kılın. FitSystemWindows () yöntemi, pencerenin içeriğini buna göre ayarlamasına izin vermek için, bir pencerenin içerik girintileri değiştiğinde görünüm hiyerarşisi tarafından çağrılır. Bu yöntemi geçersiz kılarak, ekleri (ve dolayısıyla uygulamanızın düzenini) istediğiniz gibi işleyebilirsiniz.

https://developer.android.com/training/system-ui/status#behind

Ana pencere tesisatçısı olmak istiyorsanız, lütfen android geliştiricisinin videosunu izleyin. https://www.youtube.com/watch?v=_mGDMVRO3iE


-1

En iyi uygulama, klavye gösterildiğinde kullanıcının içeriği kaydırmasına izin verir. Bu işlevi eklemek için kök düzeninizi içine koymanız ScrollViewve kullanmanız gerekir.windowSoftInputMode="adjustResize" etkinlik yöntemini .

Ancak bu işlevi birlikte kullanmak istiyorsanız <item name="android:windowTranslucentStatus">true</item> Android 5 üzerinde bayrakla içeriği kaydırılamaz ve klavye ile örtüşür.

Bu sorunu çözmek için bu cevabı kontrol edin

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.