2017-01-12 4 views
2

Моя активность использования CollapsingToolbarLayout и я удалить успешно в StatusBar делает это:StatusBar показывает, когда клавиатура появляется

View decorView = getWindow().getDecorView(); 
// Hide the status bar. 
int uiOptions = View.SYSTEM_UI_FLAG_FULLSCREEN; 
decorView.setSystemUiVisibility(uiOptions); 

Проблема заключается в том, что, когда softkeyboard всплывает вверх, StatusBar появляются снова, потребляя драгоценное пространство.

Как удержать его постоянно на ?

Если я установил его в FullScreen, он работает, но я потерял параметр SOFT_INPUT_ADJUST_RESIZE. Главное окно прокручивается, когда появляется softkeyboard, вместо того, чтобы изменять размер по мере необходимости.

Обновление:

<?xml version="1.0" encoding="utf-8"?> 
<android.support.design.widget.CoordinatorLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    android:fitsSystemWindows="true" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <android.support.design.widget.AppBarLayout 
     android:id="@+id/my_appar" 
     android:fitsSystemWindows="false" 
     android:layout_height="wrap_content" 
     android:layout_width="match_parent" 
     android:background="@color/white"> 

     <android.support.design.widget.CollapsingToolbarLayout 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      app:toolbarId="@+id/collapsetoolbar" 
      app:layout_scrollFlags="scroll|enterAlways|enterAlwaysCollapsed" 
      app:layout_scrollInterpolator="@android:anim/decelerate_interpolator" 
      app:contentScrim="?attr/colorPrimary"> 

      <android.support.v7.widget.Toolbar 
       android:id="@+id/my_toolbar" 
       android:elevation="4dp" 
       android:layout_height="wrap_content" 
       android:layout_width="match_parent"> 
      </android.support.v7.widget.Toolbar> 

     </android.support.design.widget.CollapsingToolbarLayout> 
    </android.support.design.widget.AppBarLayout> 
    <RelativeLayout 
     xmlns:android="http://schemas.android.com/apk/res/android" 
     xmlns:tools="http://schemas.android.com/tools" 
     xmlns:app="http://schemas.android.com/apk/res-auto" 
     android:id="@+id/activity_id" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     tools:context="... .MyActivity" 
     android:orientation="vertical" 
     > 

     <FrameLayout 
      android:id="@+id/yt_frame" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content"> 

      <fragment 
      ... 
     </FrameLayout> 

     <com.byte_artisan.mchat.compoundViews.chatview.ChatView 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:layout_below="@id/fragment1" 
      android:id="@+id/chat_view_id"> 
     </com.byte_artisan.mchat.compoundViews.chatview.ChatView> 
    </RelativeLayout> 
</android.support.design.widget.CoordinatorLayout> 

Код:

protected void onCreate(Bundle savedInstanceState) {   
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_mchat); 

    this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE); 
.. 
} 


@Override 
protected void onResume() { 
    super.onResume(); 

    View decorView = getWindow().getDecorView(); 
    // Hide the status bar. 
    int uiOptions = View.SYSTEM_UI_FLAG_FULLSCREEN; 
    decorView.setSystemUiVisibility(uiOptions); 
} 

Активность использует схему NoActionBar (объявленный на манифест).

+0

размещать код макета – Jayanth

ответ

2

Добавьте эту строку в ваших стилей стиль деятельности

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

Если вы не обернуть содержание деятельности с ScrollView вы не можете использовать SOFT_INPUT_ADJUST_RESIZE в полноэкранном режиме активности в

Для того, чтобы работать, вы должны обернуть содержание вашего макета внутри ScrollView

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:fillViewport="true"> 

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

    <!-- everything you already have --> 

</LinearLayout> 

скажите мне, если он работает ..

+0

Работает, но он теряет параметр SOFT_INPUT_ADJUST_RESIZE. – ByteArtisan

+0

Я не использую ScroolView.Я выложу макет. – ByteArtisan

+0

см. Обновленный ответ – Jayanth

1

Очки следует отметить: -

1) После того, как флаги пользовательского интерфейса были удалены (например, путем перехода от деятельности), ваше приложение должно сбросить если вы хотите снова скрыть панели. См. Responding to UI Visibility Изменения для обсуждения того, как прослушивать изменения видимости пользовательского интерфейса, чтобы ваше приложение могло соответствующим образом реагировать.

2) Где вы устанавливаете флаги интерфейса, имеет значение. Если вы спрячете системные бары в методе onCreate() вашего действия и пользователь нажмет на Home, системные панели снова появятся. Когда пользователь снова открывает активность, onCreate() не будет вызван, поэтому системные панели останутся видимыми. Если вы хотите, чтобы изменения в системном пользовательском интерфейсе сохранялись, когда пользователь переходит в вашу активность и выходит из нее, установите флаги пользовательского интерфейса в onResume() или onWindowFocusChanged().

3) Метод setSystemUiVisibility() действует только в том случае, если вид, который вы его вызываете, виден.

4) При перемещении в сторону от объекта отображаются флаги, установленные с помощью setSystemUiVisibility() для очистки.

Вы должны добавить этот код на создание

View decorView = getWindow().getDecorView(); 
decorView.setOnSystemUiVisibilityChangeListener 
     (new View.OnSystemUiVisibilityChangeListener() { 
    @Override 
    public void onSystemUiVisibilityChange(int visibility) { 
     // Note that system bars will only be "visible" if none of the 
     // LOW_PROFILE, HIDE_NAVIGATION, or FULLSCREEN flags are set. 
     if ((visibility & View.SYSTEM_UI_FLAG_FULLSCREEN) == 0) { 
      // TODO: The system bars are visible. Make any desired 
      // adjustments to your UI, such as showing the action bar or 
      // other navigational controls. 
// again hide it 
     } else { 
      // TODO: The system bars are NOT visible. Make any desired 
      // adjustments to your UI, such as hiding the action bar or 
      // other navigational controls. 
     } 
    } 
});