Поле ввода не центрируется при появлении клавиатуры

Эффект центрирования фокуса на поле ввода пропадает при появлении клавиатуры, а клавиатура закрывает поле ввода и текст, введенный пользователем, не виден. Пожалуйста, помогите решить эту проблему.

AndroidManifest

<activity
            android:name=".BrowserActivity"
            android:theme="@style/Theme.Game"
            android:exported="true"
            android:resizeableActivity="true"
            android:launchMode="singleTask"
            android:configChanges="keyboardHidden|orientation|screenSize"
            android:windowSoftInputMode="adjustResize"
            android:screenOrientation="sensor">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
            <intent-filter>
                <data android:scheme="http" />
                <data android:scheme="https" />
            </intent-filter>
        </activity>

themes

<resources xmlns:tools="http://schemas.android.com/tools">
    <!-- Base application theme. -->
    <style name="Theme.Game" parent="Theme.AppCompat.Light.NoActionBar">
        <item name="android:forceDarkAllowed" tools:targetApi="q">false</item>
        <item name="android:windowLayoutInDisplayCutoutMode">
            shortEdges
        </item>
        <item name="colorPrimary">@color/purple_500</item>
        <item name="colorPrimaryVariant">@color/purple_700</item>
        <item name="colorOnPrimary">@color/white</item>
        <!-- Secondary brand color. -->
        <item name="colorSecondary">@color/teal_200</item>
        <item name="colorSecondaryVariant">@color/teal_700</item>
        <item name="colorOnSecondary">@color/black</item>
        <!-- Status bar color. -->
        <item name="android:statusBarColor" tools:targetApi="21">?attr/colorPrimaryVariant</item>
        <!-- Customize your theme here. -->
    </style>

    <style name="AlertDialogTheme" parent="Theme.AppCompat.DayNight.Dialog.Alert">
        <item name="android:textColor">@color/colorText</item>
        <item name="buttonBarButtonStyle">@style/AlertDialogButtonTheme</item>
    </style>

    <style name="AlertDialogButtonTheme" parent="Widget.AppCompat.Button.ButtonBar.AlertDialog">
        <item name="android:textColor">@color/colorFg</item>
    </style>

    <style name="EditTextTheme" parent="Theme.AppCompat.DayNight.DarkActionBar">
        <item name="colorControlNormal">@color/colorText</item>
        <item name="colorControlActivated">@color/colorFg</item>
        <item name="colorControlHighlight">@color/colorAccent</item>
        <item name="editTextColor">@color/colorText</item>
        <item name="android:textColorHighlight">@color/colorTextHighlight</item>
    </style>
</resources>

activity_main

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".BrowserActivity">
        <WebView
            android:id="@+id/webView"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_alignParentTop="true"
            android:layout_alignParentLeft="true"
            android:layout_alignParentRight="true" />
</RelativeLayout>

BrowserActivity

public class BrowserActivity extends Activity {

    private WebView webView;
    public WebSettings webSettings;
    private GestureDetector gestureDetector;
    private ProgressDialog progressDialog;
    private static final int LONG_SWIPE_DISTANCE = 1000;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        View decorView = getWindow().getDecorView();
        int uiOptions = View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
                | View.SYSTEM_UI_FLAG_FULLSCREEN
                | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;
        decorView.setSystemUiVisibility(uiOptions);

        webView = findViewById(R.id.webView);
        gestureDetector = new GestureDetector(this, new CustomGestureListener());
        progressDialog = new ProgressDialog(this);
        progressDialog.setMessage("Update...");
        setupWebView();
    }

    private void setupWebView() {
        webView.setWebViewClient(new GameWebViewClient(this));

        webView.setWebChromeClient(new GameWebChromeClient(this));

        WebSettings webSettings = webView.getSettings();
        webSettings.setJavaScriptEnabled(true);
        webSettings.setDomStorageEnabled(true);
        webSettings.setDatabaseEnabled(true);

        webSettings.setAllowFileAccess(true);
        webSettings.setSupportMultipleWindows(true);

        CookieManager cookieManager = CookieManager.getInstance();
        cookieManager.setAcceptCookie(true);

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            cookieManager.setAcceptThirdPartyCookies(webView,true);
        }

        String ua = webSettings.getUserAgentString()
                .replace("; wv", "");

        int uaIndex = ua.indexOf("Version");

        ua = ua.substring(0, uaIndex)
                .concat(getString(R.string.app_name))
                .concat(ua.substring(uaIndex));

        webSettings.setUserAgentString(ua);

        webView.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View view, MotionEvent motionEvent) {
                return gestureDetector.onTouchEvent(motionEvent);
            }
        });

        webView.loadUrl("");
    }

    @Override
    public void onWindowFocusChanged(boolean hasFocus) {
        super.onWindowFocusChanged(hasFocus);
        if (hasFocus) {
            View decorView = getWindow().getDecorView();
            int uiOptions = View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                    | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                    | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                    | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
                    | View.SYSTEM_UI_FLAG_FULLSCREEN
                    | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;
            decorView.setSystemUiVisibility(uiOptions);
        }
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        gestureDetector.onTouchEvent(event);
        return super.onTouchEvent(event);
    }


    private class CustomGestureListener extends GestureDetector.SimpleOnGestureListener {
        @Override
        public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
            final int SWIPE_THRESHOLD = 100;
            final int SWIPE_VELOCITY_THRESHOLD = 100;
            float diffX = e2.getX() - e1.getX();
            float diffY = e2.getY() - e1.getY();
            if (Math.abs(diffY) > Math.abs(diffX) && diffY > LONG_SWIPE_DISTANCE && webView.getScrollY() == 0) {
                refreshWebView();
                return true;
            }

            if (Math.abs(diffX) > Math.abs(diffY) && Math.abs(diffX) > SWIPE_THRESHOLD && Math.abs(velocityX) > SWIPE_VELOCITY_THRESHOLD) {
                if (diffX > 0) {
                    if (webView.canGoBack()) {
                        webView.goBack();
                    }
                } else {
                    if (webView.canGoForward()) {
                        webView.goForward();
                    }
                }

                return true;
            }
            return false;
        }
    }

    private void refreshWebView() {
        progressDialog.show();

        webView.reload();

        webView.setWebViewClient(new WebViewClient() {
            @Override
            public void onPageFinished(WebView view, String url) {
                super.onPageFinished(view, url);
                progressDialog.dismiss();
            }
        });
    }

    @Override
    public void onBackPressed() {
        if (webView.canGoBack()) {
            webView.goBack();
        } else {
            super.onBackPressed();
        }
    }

    @Override
    public void onConfigurationChanged(@NonNull Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {}
    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putString("webViewUrl", webView.getUrl());
    }

    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);
        String savedUrl = savedInstanceState.getString("webViewUrl");
        if (savedUrl != null) {
            webView.loadUrl(savedUrl);
        }
    }
}

При удалении из кода:

View decorView = getWindow().getDecorView();
        int uiOptions = View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
                | View.SYSTEM_UI_FLAG_FULLSCREEN
                | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;
        decorView.setSystemUiVisibility(uiOptions);

...................................................

@Override
    public void onWindowFocusChanged(boolean hasFocus) {
        super.onWindowFocusChanged(hasFocus);
        if (hasFocus) {
            View decorView = getWindow().getDecorView();
            int uiOptions = View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                    | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                    | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                    | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
                    | View.SYSTEM_UI_FLAG_FULLSCREEN
                    | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;
            decorView.setSystemUiVisibility(uiOptions);
        }
    }

Все работает.

Приложение должно быть полностью полноэкранным. То есть панель инструментов и нижняя часть с кнопками должны быть скрыты.

Вот диалоговое окно используемое для авторизации и когда открывается метод ввода, то клавиатура закрывает поле ввода.

 <?xml version="1.0" encoding="utf-8"?>
        <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
            xmlns:app="http://schemas.android.com/apk/res-auto"
            android:id="@+id/webDialogLayout"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="@color/colorBg"
            android:windowSoftInputMode="adjustPan"
            android:orientation="vertical">
        
            <androidx.constraintlayout.widget.ConstraintLayout
                android:id="@+id/dialogTitleBar"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:background="@color/colorBgAlt"
                android:orientation="horizontal"
                android:padding="8dp">
        
                <TextView
                    android:id="@+id/dialogTitle"
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:layout_marginStart="12dp"
                    android:layout_marginEnd="12dp"
                    android:text="Dialog Title"
                    android:textColor="@color/colorFgAlt"
                    android:textSize="16sp"
                    app:layout_constraintBottom_toBottomOf="parent"
                    app:layout_constraintEnd_toStartOf="@id/btDialogClose"
                    app:layout_constraintStart_toStartOf="parent"
                    app:layout_constraintTop_toTopOf="parent" />
    
            <ImageButton
                android:id="@+id/btDialogClose"
                android:layout_width="40dp"
                android:layout_height="40dp"
                android:background="?attr/actionBarItemBackground"
                android:contentDescription="Close"
                android:padding="4dp"
                android:scaleType="fitCenter"
                android:src="@drawable/icon_cancel"
                android:tint="@color/colorFgAlt"
                app:layout_constraintEnd_toEndOf="parent"
                app:layout_constraintStart_toEndOf="@id/dialogTitle"
                app:layout_constraintTop_toTopOf="parent" />
    
        </androidx.constraintlayout.widget.ConstraintLayout>
    
        <ProgressBar
            android:id="@+id/progressBar"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:padding="64dp" />
    
        <WebView
            android:id="@+id/dialogWebView"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />
    
    </LinearLayout>
@SuppressLint("SetJavaScriptEnabled")
    @Override
    public boolean onCreateWindow(WebView view, boolean isDialog, boolean isUserGesture, Message resultMsg) {
        if (isDialog) {
            LayoutInflater inflater = browserActivity.getLayoutInflater();
            View dialogView = inflater.inflate(R.layout.web_dialog, browserActivity.findViewById(R.id.webDialogLayout));
            dialogView.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT));

            TextView dialogTitle = dialogView.findViewById(R.id.dialogTitle);
            ImageButton btClose = dialogView.findViewById(R.id.btDialogClose);
            dialogWebView = dialogView.findViewById(R.id.dialogWebView);
            dialogWebView.setVerticalScrollBarEnabled(false);
            dialogWebView.setHorizontalScrollBarEnabled(false);
            dialogWebView.setWebViewClient(new DialogWebViewClient());
            dialogWebView.setWebChromeClient(new DialogWebChromeClient());
            WebSettings webSettings = dialogWebView.getSettings();
            webSettings.setDomStorageEnabled(true);
            webSettings.setJavaScriptEnabled(true);

            String title = view.getTitle();
            if (title == null) {
                Uri uri = Uri.parse(view.getUrl());
                title = uri.getHost();
            }

            dialogTitle.setText(title);

            btClose.setOnClickListener(v -> {
                onFalse();
                dialogWebView.destroy();
                dialog.dismiss();
            });

            dialog = new AlertDialog.Builder(browserActivity).create();

            dialog.setTitle("");
            dialog.setView(dialogView);
            dialog.show();

            Window dialogWindow = dialog.getWindow();
            assert dialogWindow != null;
            dialogWindow.setLayout(WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.WRAP_CONTENT);
            dialogWindow.clearFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);

            CookieManager cookieManager = CookieManager.getInstance();
            cookieManager.setAcceptCookie(true);
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                cookieManager.setAcceptThirdPartyCookies(dialogWebView, true);
            }
            WebView.WebViewTransport transport = (WebView.WebViewTransport) resultMsg.obj;
            transport.setWebView(dialogWebView);
            resultMsg.sendToTarget();
            return true;
        }

        return true;
    }

И у web_dialog.xml ставлю android:windowSoftInputMode="adjustPan" не работает.


Ответы (1 шт):

Автор решения: Котлетка еее

Мне в AndroidManifest.xml нравится ставить так: android:windowSoftInputMode="adjustPan"
Тогда интерфейс не сжимается при появлении клавиатуры, но поле для ввода остаётся видимым.

→ Ссылка