Spostare i layout verso l'alto quando viene visualizzata la tastiera virtuale?


139

Ho alcuni elementi in un RelativeView con l'attributo di allineamento inferiore impostato, quando viene visualizzata la tastiera software gli elementi vengono nascosti dalla tastiera software.

Vorrei che si spostassero in alto in modo che se lo spazio sullo schermo fosse sufficiente fossero mostrati sopra la tastiera o per rendere scorrevole la sezione sopra la tastiera in modo che l'utente potesse ancora vedere gli elementi.

Qualche idea su come affrontare questo?


Riferimento aggiornato dal blog degli sviluppatori Android
Jayabal,

@Dinedal Come si imposta l'allineamento dell'attributo inferiore su RelativeView ???
KJEjava48,

Risposte:



95

Puoi anche usare questo codice nel onCreate()metodo:

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);

11
Per me, anche se ho impostato AdjustPan screnn, ho spostato solo il testo di modifica su cui ho fatto clic, ma non l'intero layout
Murt


22

Apporta modifiche all'attività del tuo file manifest come

windowSoftInputMode="adjustResize"

O

Apporta modifiche al tuo onCreate()metodo nella classe di attività come

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);

11
Perché usi bandiere diverse?
CoolMind,

La versione corrente richiede il prefisso Android: android: windowSoftInputMode = "AdjustResize"
Andrea Leganza

21

problema simile che stavo affrontando con il mio layout che consisteva nella vista di scorrimento all'interno. Ogni volta che provo a selezionare il testo in EditText, la barra delle azioni Copia / Taglia / Incolla viene spostata verso l'alto con il codice sottostante in quanto tale non ridimensiona il layout

android:windowSoftInputMode="adjustPan"

Modificandolo come di seguito

1) AndroidManifest.xml

android:windowSoftInputMode="stateVisible|adjustResize"

2) file style.xml, in stile attività

<item name="android:windowActionBarOverlay">true</item>

Ha funzionato.!!!!!!!!!!!!


18

In AndroidManifest.xml, non dimenticare di impostare:

 android:windowSoftInputMode="adjustResize"

e per RelativeLayout all'interno di ScrollView, impostare:

 android:layout_gravity="center" or android:layout_gravity="bottom" 

andrà bene


android: layout_gravity = "center" ha funzionato, grazie! :) ora EditText si sposta sulla tastiera come volevo
Pavel Biryukov il

11

per Attività nel suo metodo oncreate inserire sotto la riga

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);

e per frammenti nel suo metodo onCreate

getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);

10

Ci sono 3 passaggi da seguire per scorrere verso l'alto.

  1. Scrivi nel file manifest per la tua attività:

Android: windowSoftInputMode = "adjustResize"

  1. Aggiungi la seguente riga nel metodo oncreate () della tua attività

. GetWindow () setSoftInputMode (WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE | WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);

  1. Quindi posizionare l'intera vista in "Scrollview" nel file XML come:
<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:background="@drawable/bg"
    android:layout_height="match_parent" 
    > 
    <RelativeLayout
         android:layout_width="fill_parent"
        android:layout_height="match_parent"
        android:layout_gravity="center" >
        <TextView />
         .........
        <TextView />
        <EditText >
            <requestFocus />
        </EditText>
        <Button />
    </RelativeLayout>
 </ScrollView>

PS Non dimenticare di aggiungere android: layout_gravity = "center" nel layout relativo parent.


6

Ho provato un metodo di Diego Ramírez, funziona. In AndroidManifest:

    <activity
        android:name=".MainActivity"
        android:windowSoftInputMode="stateHidden|adjustResize">
        ...
    </activity>

In activity_main.xml:

<LinearLayout ...
    android:orientation="vertical">

<Space
    android:layout_width="wrap_content"
    android:layout_height="0dp"
    android:layout_weight="1" />

<EditText
    android:id="@+id/edName"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:ems="10"
    android:hint="@string/first_name"
    android:inputType="textPersonName" />

<EditText ...>
...
</LinearLayout>

6
<activity name="ActivityName"
    android:windowSoftInputMode="adjustResize">
    ...
</activity>

Aggiungi NestedScrollView attorno al layout che desideri scorrere, funzionerà perfettamente


3

Ho trovato una soluzione ai miei problemi che è abbastanza uguale alla tua.

Prima di tutto, ho solo un LinearLayout con 2 elementi, un ImageView e un LinearLayout che contiene 2 EditText e un pulsante, quindi dovevo tenerli separati a schermo intero senza tastiera e quando appare la tastiera dovrebbero guardare più da vicino.

Quindi ho aggiunto la vista tra loro con l'attributo height in 0dp e weight 1, che mi ha permesso di mantenere le mie viste separate l'una dall'altra. e quando la tastiera viene visualizzata, poiché non hanno un'altezza fissa, si limitano a ridimensionare e mantenere l'aspetto.

Ecco! Il ridimensionamento del layout e la distanza tra le mie viste è la stessa quando la tastiera è presente o meno.


6
Perché non pubblichi il codice, per una migliore comprensione?
johnkarka,

Ho pubblicato un codice di esempio sopra: stackoverflow.com/a/31994697/2914140 .
CoolMind,

puoi ottenerlo in un modo meno confuso usando a ConstraintLayoute appuntando una sezione in alto e una in basso. Quando la tastiera si apre si ridimensionerà naturalmente schiacciando lo spazio nel mezzo (se si utilizza adjustResize)
hmac

2
If user want this task using manifest then add this line in manifest
In manifest add this line: - android:windowSoftInputMode="adjustPan"
    e.g.
     <activity
           android:name=".ui.home.HomeActivity"
           android:screenOrientation="portrait"
           android:windowSoftInputMode="adjustPan">
     </activity>


    In Java File or Kotlin File(Programically) : - If user want this using Activity then add below line in onCreate Method

    activity!!.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);

Ciao e benvenuto su StackOverflow e grazie per la risposta. Piuttosto che pubblicare un blocco di codice, puoi dare una breve spiegazione di ciò che il problema è stato risolto e come lo hai risolto? Ciò aiuterà le persone che troveranno questa domanda in futuro a comprendere meglio il problema e come affrontarlo.
Plutian,

1

Ecco il codice manifest completo

<activity
        android:name=".activities.MainActivity"
        android:windowSoftInputMode="adjustResize"
        android:label="@string/app_name">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

1

se sei in frammenti, devi aggiungere il codice seguente a onCreate sulla tua attività che risolve il problema per me

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN | WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);

1

Nel tuo file manifest aggiungi la riga seguente. Funzionerà

<activity name="MainActivity"
    android:windowSoftInputMode="stateVisible|adjustResize">
    ...
</activity>

1

Ho appena aggiunto la seguente riga al layout di livello superiore e tutto ha funzionato:

android:fitsSystemWindows="true"

@ yash786 è forse il pulsante Mostra sotto edittext che riceve un focus? Seconda domanda: puoi condividere il tuo file di layout o rispondermi come aggiungi edittext in cima alla tastiera?
Heroes84

funziona per me evento senza Android: windowSoftInputMode = "stateVisible | AdjustResize"
zoom

0

Va bene, è molto tardi, tuttavia ho scoperto che se aggiungi una visualizzazione elenco sotto il testo di modifica, la tastiera sposta tutti i layout in tale edittext senza spostare ListView

<EditText
android:id="@+id/et"
android:layout_height="match_parent"
android:layout_width="match_parent"



/>

<ListView
    android:layout_width="match_parent"
    android:layout_height="match_parent"//can make as 1dp
    android:layout_below="@+id/et" // set to below editext
    android:id="@+id/view"
    >
**<any layout**

Questa è l'unica soluzione che ha funzionato per me.


0

Nessun singolo consiglio risolve il mio problema. Regola panoramica è quasi come lavorare Regola ridimensiona . Se imposto Regola nulla oltre il layout non si sposta in alto ma nasconde il mio edittext di fondo che sto scrivendo correttamente. Quindi dopo 24 ore di ricerca continua ho trovato questa fonte e risolve il mio problema.


0

Potrebbe essere tardi ma voglio aggiungere alcune cose. In Android Studio versione 4.0.1 e Gradle versione 6.1.1, windowSoftInputMode non funzionerà come previsto se si aggiungono i seguenti flag nella propria attività:

getWindow().setFlags(
                WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS,
                WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS
        );

Dopo aver perso molto tempo, ho scoperto che l'hack. Affinché adjustResizeo AdjustPano qualsiasi altro attributo windowSoftInputModefunzioni correttamente, è necessario rimuoverlo dall'attività.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.