Поле ввода не центрируется при появлении клавиатуры
Эффект центрирования фокуса на поле ввода пропадает при появлении клавиатуры, а клавиатура закрывает поле ввода и текст, введенный пользователем, не виден. Пожалуйста, помогите решить эту проблему.
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"
Тогда интерфейс не сжимается при появлении клавиатуры, но поле для ввода остаётся видимым.