2016-12-24 3 views
0

Я не понимаю, почему это происходит с моим scrollview. Когда редактируемый текст не фокусируется, макет, как представляется, выглядит нормально, как показано на рисунке ниже.ScrollView закрывается панелью инструментов

enter image description here

но когда пользователь оказывается в одном из редактирования текстовых полей, а затем на панели инструментов и раскладка клавиатуры принять все пространство скрывая Scrollview позади, как показано здесь

enter image description here

макет для этого:

<?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" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:id="@+id/activity_meal_viewer" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:background="@color/light_gray" 
    android:orientation="vertical"> 


    <include 
     android:id="@+id/tool_bar" 
     layout="@layout/toolbar" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" /> 

    <LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:orientation="vertical"> 

     <android.support.v7.widget.CardView 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:layout_margin="@dimen/activity_horizontal_margin" 
      android:background="@android:color/white"> 

      <LinearLayout 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:orientation="vertical" 
       android:padding="@dimen/activity_horizontal_margin"> 


       <EditText 
        android:id="@+id/person_name" 
        android:layout_width="match_parent" 
        android:layout_height="wrap_content" 
        android:layout_marginBottom="@dimen/activity_horizontal_margin" 
        android:background="@drawable/generic_shape_rect" 
        android:drawableLeft="@drawable/ic_people" 
        android:drawablePadding="@dimen/activity_horizontal_margin" 
        android:drawableStart="@drawable/ic_people" 
        android:gravity="center_vertical" 
        android:hint="@string/full_name" 
        android:inputType="textPersonName" 
        android:maxLines="1" 
        android:typeface="serif" /> 

       <EditText 
        android:id="@+id/person_address" 
        android:layout_width="match_parent" 
        android:layout_height="wrap_content" 
        android:background="@drawable/generic_shape_rect" 
        android:drawableLeft="@drawable/ic_pin" 
        android:drawablePadding="@dimen/activity_horizontal_margin" 
        android:drawableStart="@drawable/ic_pin" 
        android:gravity="center_vertical" 
        android:hint="@string/address" 
        android:inputType="text" 
        android:maxLines="1" 
        android:typeface="serif" /> 

      </LinearLayout> 
     </android.support.v7.widget.CardView> 

     <android.support.v7.widget.CardView 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:layout_marginBottom="@dimen/activity_horizontal_margin" 
      android:layout_marginLeft="@dimen/activity_horizontal_margin" 
      android:layout_marginRight="@dimen/activity_horizontal_margin" 
      android:layout_marginTop="0dp" 
      android:background="@android:color/white" 
      app:cardCornerRadius="2dp"> 


      <LinearLayout 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:orientation="vertical" 
       android:padding="@dimen/activity_horizontal_margin"> 

       <EditText 
        android:id="@+id/person_email" 
        android:layout_width="match_parent" 
        android:layout_height="wrap_content" 
        android:layout_marginBottom="@dimen/activity_horizontal_margin" 
        android:background="@drawable/generic_shape_rect" 
        android:drawableLeft="@drawable/ic_email" 
        android:drawablePadding="@dimen/activity_horizontal_margin" 
        android:drawableStart="@drawable/ic_email" 
        android:ems="10" 
        android:hint="@string/email" 
        android:inputType="textEmailAddress" 
        android:maxLines="1" 
        android:typeface="serif" /> 


       <EditText 
        android:id="@+id/person_phone" 
        android:layout_width="match_parent" 
        android:layout_height="wrap_content" 
        android:background="@drawable/generic_shape_rect" 
        android:drawableLeft="@drawable/ic_telephone" 
        android:drawablePadding="@dimen/activity_horizontal_margin" 
        android:drawableStart="@drawable/ic_telephone" 
        android:ems="10" 
        android:hint="@string/phone" 
        android:inputType="phone" 
        android:typeface="serif" /> 
      </LinearLayout> 


     </android.support.v7.widget.CardView> 

     <android.support.v7.widget.CardView 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:layout_marginBottom="@dimen/activity_horizontal_margin" 
      android:layout_marginLeft="@dimen/activity_horizontal_margin" 
      android:layout_marginRight="@dimen/activity_horizontal_margin" 
      android:layout_marginTop="0dp" 
      android:background="@android:color/white" 
      app:cardCornerRadius="2dp"> 


      <LinearLayout 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:orientation="vertical" 
       android:padding="@dimen/activity_horizontal_margin"> 


       <EditText 
        android:id="@+id/person_initial_fund" 
        android:layout_width="match_parent" 
        android:layout_height="wrap_content" 
        android:background="@drawable/generic_shape_rect" 
        android:drawableLeft="@drawable/ic_dollar" 
        android:drawablePadding="@dimen/activity_horizontal_margin" 
        android:drawableStart="@drawable/ic_dollar" 
        android:ems="10" 
        android:hint="@string/initial_fund" 
        android:inputType="numberSigned" 
        android:maxLines="1" 
        android:typeface="serif" /> 
      </LinearLayout> 


     </android.support.v7.widget.CardView> 

     <ImageButton 
      android:layout_width="48dp" 
      android:layout_height="48dp" 
      android:layout_gravity="center" 
      android:layout_marginBottom="@dimen/activity_horizontal_margin" 
      android:layout_marginLeft="@dimen/activity_horizontal_margin" 
      android:layout_marginRight="@dimen/activity_horizontal_margin" 
      android:layout_marginTop="0dp" 
      android:background="@drawable/selector_button_accent" 
      android:contentDescription="@string/done" 
      android:onClick="handlePeople" 
      android:src="@drawable/ic_action_done" /> 
    </LinearLayout> 
</LinearLayout> 

и файл раскладки панель инструментов:

<?xml version="1.0" encoding="utf-8"?> 
<android.support.v7.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="?attr/actionBarSize" 
    android:fitsSystemWindows="true" 
    android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" /> 

Примечание: я также пытался NestesScrollView, но это не сработало

ответ

2

По умолчанию, когда fitsSystemWindows используются на взгляде, WindowInsets, обеспечиваемая система потребляется View как обивка, поэтому ваша панель инструментов имеют дополнительное пространство сверху, система добавить topPadding к это когда он получает WindowInsets из-за прозрачной строки состояния.

Но, когда клавиатура появляется, система выдает новые WindowInsets с высотой клавиатуры как нижние вставки. И, поскольку ваша панель инструментов будет реагировать на эти новые WindowInsets, панель инструментов добавит высоту клавиатуры как нижнее дополнение, следовательно, будет расти, как на вашем скриншоте.

У вас есть 2 решения, если вы хотите обойти эту проблему: Во-первых, сделайте клавиатуру охватом содержимого активности вместо изменения размера Activity. Вы можете сделать это, установив в явной записи вашей деятельности в:

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

Это сделает клавиатуру толкать все содержимое верхних убедиться, что EditText еще виден, когда клавиатура вверх. Но это может вызвать панель инструментов за пределами окна, когда клавиатура вверх. Это ваш звонок, чтобы решить, с тобой все в порядке.

Если вы не в порядке, вы можете написать некоторый код для ручного управления WindowInset, чтобы применить только верхнее дополнение к панели инструментов и игнорировать нижнюю вставку. Вы можете сделать что-то вроде:

ViewCompat.setOnApplyWindowInsetsListener(toolbar, new OnApplyWindowInsetsListener() { 
    @Override 
    public WindowInsetsCompat onApplyWindowInsets(
     View v, WindowInsetsCompat insets 
    ) { 
     v.setPadding(0, insets.getSystemWindowInsetTop(), 0, 0); 
     insets.consumeSystemWindowInsets(); 
     return insets; 
    } 
}); 

Но следует помнить, что даже если этот код будет компилироваться и работать на любом уровне API (он использует материал от поддержки-v4), это будет эффективным только на API 21 и после , когда они изменили способ работы WindowInsets. Если вы используете transparentStatusBar из API 19, вам нужно написать больше кода, чтобы сделать то же самое с устаревшим API ... Я, как правило, игнорирую это и допускаю прозрачностьStatusBar только начиная с API 21, это правильно, если честно.

Надеюсь, это поможет.

1

Может быть, вы должны использовать CoordinatorLayout вместо LinearLayout от дизайна поддержки Google. И добавьте панель инструментов AppBarLayout. документации чтения this

Смежные вопросы