validar teclado tapar tapa studio salto que personalizar ocultar mascara linea edittext con android view android-edittext android-softkeyboard

android - tapar - Empuje el contenido excepto alguna vista cuando se muestra el teclado



teclado tapa edittext android (8)

Tengo un diseño que contiene 5 EditText y un Button y un TextView en la parte inferior. Ahora cuando EditText se EditText el teclado y toda mi View se levantará.

Ahora no quiero presionar mi TextView y Button en el teclado de arriba, solo quiero presionar todo EditText dentro de ScrollView al teclado de arriba.

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/activity_main" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <ScrollView android:layout_width="match_parent" android:layout_height="match_parent" android:layout_weight="1" android:background="#ff0" > <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" > <EditText android:layout_marginTop="30dp" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="EditText 1" /> <EditText android:layout_marginTop="30dp" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="EditText 2" /> <EditText android:layout_marginTop="30dp" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="EditText 3" /> <EditText android:layout_marginTop="30dp" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="EditText 4" /> <EditText android:layout_marginTop="30dp" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="EditText 5" android:inputType="textNoSuggestions" /> </LinearLayout> </ScrollView> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:text="Button" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:textColor="#000" android:text="I don''t want to push this TextView and Button to above keyboard when keyboard is shown. Just obly want to push the ScrollView that contain all EditText" /> </LinearLayout>

Tengo una idea es. Cuando lo escucharé cuando el teclado se muestre y se oculte. Cuando se muestre el teclado, estableceré el margen inferior de ScrollView = altura del teclado, cuando hide el teclado estableceré este margen = 0.
¿Hay alguna manera más fácil de manejar mi caso? Cualquier ayuda o sugerencia sería muy apreciada.

ACTUALIZAR
Si uso windowSoftInputMode=adjustPan => no todo EditText es push up al teclado de arriba
Si uso windowSoftInputMode=adjustResize => Button , TextView y todo EditText es push up al teclado de arriba


Debes agregar android:windowSoftInputMode="adjustPan" en tu Manifest y funcionará como un profesional:

<activity android:name=".your_activity_name" android:windowSoftInputMode="adjustPan"> .............. </activity>


Intente agregar este diseño,

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/activity_main" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <ScrollView android:layout_width="match_parent" android:layout_height="match_parent" android:layout_weight="1" android:background="#ff0" > <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" > <EditText android:layout_marginTop="30dp" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="EditText 1" /> <EditText android:layout_marginTop="30dp" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="EditText 2" /> <EditText android:layout_marginTop="30dp" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="EditText 3" /> <EditText android:layout_marginTop="30dp" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="EditText 4" /> <EditText android:layout_marginTop="30dp" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="EditText 5" android:inputType="textNoSuggestions" /> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:text="Button" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:textColor="#000" android:text="any text" /> </LinearLayout> </ScrollView> </LinearLayout>


No funcionará: no hay una API confiable para detectar cuándo se muestra el teclado. Verá "soluciones" en este sitio, pero tienen falsos positivos y negativos. Pero parece que lo mejor para usted es configurar el SoftInputMode para ajustarPan. Esto hará que el sistema operativo recorra toda la pantalla en la cantidad mínima necesaria para hacer que el cursor sea visible sobre el teclado. (toda la aplicación que pasa por encima del teclado se debe al modo adjustResize).


Dar id a todos editText, botón y textview: -

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/activity_main" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <ScrollView android:layout_width="match_parent" android:layout_height="match_parent" android:layout_weight="1" android:background="#ff0"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" > <EditText android:layout_marginTop="30dp" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="EditText 1" android:id="@+id/et1" /> <EditText android:layout_marginTop="30dp" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="EditText 2" android:id="@+id/et2"/> <EditText android:layout_marginTop="30dp" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="EditText 3" android:id="@+id/et3"/> <EditText android:layout_marginTop="30dp" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="EditText 4" android:id="@+id/et4"/> <EditText android:layout_marginTop="30dp" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="EditText 5" android:inputType="textNoSuggestions" android:id="@+id/et5"/> </LinearLayout> </ScrollView> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:text="Button" android:id="@+id/btn"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:textColor="#000" android:text="I don''t want to push this TextView and Button to above keyboard when keyboard is shown. Just obly want to push the ScrollView that contain all EditText" android:id="@+id/tv"/> </LinearLayout>

En tu Manifiesto: -

android:windowSoftInputMode="adjustResize|stateHidden"

En tu actividad: -

public class Main2Activity extends AppCompatActivity { EditText e1,e2,e3,e4,e5; Button button; TextView textView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main2); e1=(EditText)findViewById(R.id.et1); e2=(EditText)findViewById(R.id.et2); e3=(EditText)findViewById(R.id.et3); e4=(EditText)findViewById(R.id.et4); e5=(EditText)findViewById(R.id.et5); textView=(TextView)findViewById(R.id.tv); button=(Button)findViewById(R.id.btn); e1.setOnFocusChangeListener(new View.OnFocusChangeListener() { @Override public void onFocusChange(View view, boolean b) { hideKeyBoard(); } }); e2.setOnFocusChangeListener(new View.OnFocusChangeListener() { @Override public void onFocusChange(View view, boolean b) { hideKeyBoard(); } }); e3.setOnFocusChangeListener(new View.OnFocusChangeListener() { @Override public void onFocusChange(View view, boolean b) { hideKeyBoard(); } }); e4.setOnFocusChangeListener(new View.OnFocusChangeListener() { @Override public void onFocusChange(View view, boolean b) { hideKeyBoard(); } }); e5.setOnFocusChangeListener(new View.OnFocusChangeListener() { @Override public void onFocusChange(View view, boolean b) { hideKeyBoard(); } }); } private void hideKeyBoard(){ final View activityRootView = findViewById(R.id.activity_main); activityRootView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { int heightDiff = activityRootView.getRootView().getHeight() - activityRootView.getHeight(); if (heightDiff > dpToPx(Main2Activity.this, 200)) { // if more than 200 dp, it''s probably a keyboard... // ... do something here button.setVisibility(View.GONE); textView.setVisibility(View.GONE); } else { button.setVisibility(View.VISIBLE); textView.setVisibility(View.VISIBLE); } } }); } public static float dpToPx(Context context, float valueInDp) { DisplayMetrics metrics = context.getResources().getDisplayMetrics(); return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, valueInDp, metrics); } }

Aquí estoy comprobando si el teclado está visible o no. Y si es visible, entonces se oculta el botón y la vista de texto.


Use un Relavtive Layout como primario con dos Relavtive Layout lineales como secundarios y coloque la vista de desplazamiento en el primer LinearLayout mientras que el botón con la vista de texto en otro.

Usa este código Lo han probado, funcionará como espera.

<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/activity_main" android:layout_width="match_parent" android:layout_height="match_parent" > <LinearLayout android:id="@+id/linear" android:layout_width="match_parent" android:layout_height="wrap_content"> <ScrollView android:layout_width="match_parent" android:layout_height="match_parent" android:layout_weight="1" android:background="#ff0" > <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" > <EditText android:layout_marginTop="30dp" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="EditText 1" /> <EditText android:layout_marginTop="30dp" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="EditText 2" /> <EditText android:layout_marginTop="30dp" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="EditText 3" /> <EditText android:layout_marginTop="30dp" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="EditText 4" /> <EditText android:layout_marginTop="30dp" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="EditText 5" android:inputType="textNoSuggestions" /> </LinearLayout> </ScrollView> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" android:layout_below="@id/linear"> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:text="Button" /> <TextView android:id="@+id/text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textColor="#000" android:text="I don''t want to push this TextView and Button above keyboard" /> </LinearLayout> </RelativeLayout>


  1. Probado en todos los dispositivos móviles y tabletas de Nexus. Funciona bien. Estoy usando su código xml de diseño y he agregado solo id a las vistas.

  2. Estoy usando la biblioteca de abajo en mi aplicación de producción y es muy prometedor. Para lograr lo mismo y agregar la siguiente línea en la aplicación gradle: ''net.yslibrary.keyboardvisibilityevent: keyboardvisibilityevent: 2.0.1'' Aquí está el enlace para la misma .

  3. Consulte la siguiente información para obtener el resto del código: código de manifiesto, código de actividad, código de diseño de la actividad .


primer cambio de diseño

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/activity_main" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <ScrollView android:layout_width="match_parent" android:layout_height="match_parent" android:layout_weight="1" android:background="#ff0"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <EditText android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="30dp" android:hint="EditText 1" /> <EditText android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="30dp" android:hint="EditText 2" /> <EditText android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="30dp" android:hint="EditText 3" /> <EditText android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="30dp" android:hint="EditText 4" /> <EditText android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="30dp" android:hint="EditText 5" android:inputType="textNoSuggestions" /> </LinearLayout> </ScrollView> <RelativeLayout android:id="@+id/rlBtm" android:layout_width="match_parent" android:layout_height="wrap_content"> <Button android:id="@+id/btn" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Button" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/btn" android:text="I don''t want to push this TextView and Button to above keyboard when keyboard is shown. Just obly want to push the ScrollView that contain all EditText" android:textColor="#000" /> </RelativeLayout> </LinearLayout>

luego agrega clase

public class KeyboardUtil { public static void setKeyboardVisibilityListener(Activity activity, final KeyboardVisibilityListener keyboardVisibilityListener) { final View contentView = activity.findViewById(android.R.id.content); contentView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { private int mPreviousHeight; @Override public void onGlobalLayout() { int newHeight = contentView.getHeight(); if (mPreviousHeight != 0) { if (mPreviousHeight > newHeight) { // Height decreased: keyboard was shown keyboardVisibilityListener.onKeyboardVisibilityChanged(true); } else if (mPreviousHeight < newHeight) { // Height increased: keyboard was hidden keyboardVisibilityListener.onKeyboardVisibilityChanged(false); } else { // No change } } mPreviousHeight = newHeight; } }); } }

Y de actividades en Crea

KeyboardUtil.setKeyboardVisibilityListener(this, new KeyboardVisibilityListener() { @Override public void onKeyboardVisibilityChanged(boolean keyboardVisible) { rlBtm.setVisibility(keyboardVisible ? View.GONE : View.VISIBLE); } });

encontrar id para rlBtm.


Puede usar el código siguiente (Pero en este caso, su botón y su vista de texto estaban al final de la pantalla. De lo contrario, puede administrarlo con diseño lineal. Si desea mostrar el botón y la vista de texto, pls pregunte.

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <ScrollView android:id="@+id/sw1" android:layout_width="match_parent" android:layout_height="match_parent"> <LinearLayout android:id="@+id/ll1" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <EditText android:layout_width="match_parent" android:layout_height="70dp" android:layout_marginBottom="10dp" android:layout_marginTop="100dp" android:background="#ff009988" android:padding="10dp" android:textColor="#ffffff" /> <EditText android:layout_width="match_parent" android:layout_height="70dp" android:layout_marginBottom="10dp" android:background="#ff009988" android:padding="10dp" android:textColor="#ffffff" /> <RelativeLayout android:id="@+id/btmbar" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentBottom="true"> <Button android:id="@+id/button2" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Button" /> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@+id/button2" android:text="Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry''s standard dummy text ever since the 1500s, " /> </RelativeLayout> </LinearLayout> </ScrollView>