it-swarm.com.ru

Панель инструментов Android перемещается вверх, когда появляется клавиатура

Я создаю экран пользовательского интерфейса на основе чата, где у меня есть панель инструментов и окно просмотра сообщений чата, и я отвечаю на макет сообщения.

Всякий раз, когда текст редактирования получает фокус, он перемещается вверх по панели инструментов. Вместо этого я хотел бы изменить размеры вьюблера.

некоторые из ответов stackoverflow предлагают разместить empty scrollview ниже toolbar, но это не сработало.

        <activity
            Android:name=".PostMessageActivity"
            Android:label="@string/title_activity_post_message"
            Android:windowSoftInputMode="stateVisible|adjustResize"
            >
        </activity>

Я устанавливаю windowSoftInputMode в stateVisible|adjustPan в файле манифеста. 

<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="com.pasonet.yokibu.PostMessageActivity"
>
<include
    Android:id="@+id/toolbar_home"
    layout="@layout/toolbar_home"
    Android:elevation="5dp"
    />

<ScrollView
    Android:layout_width="match_parent"
    Android:layout_height="match_parent">
</ScrollView>


<LinearLayout
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    Android:layout_below="@+id/toolbar_home"
    Android:orientation="vertical"
    Android:layout_above="@+id/add_post_layout"
    >
    <Android.support.v7.widget.RecyclerView
        Android:layout_width="match_parent"
        Android:layout_height="match_parent"
        Android:id="@+id/post_msg_recyclerview"
        >
    </Android.support.v7.widget.RecyclerView>


</LinearLayout>

<LinearLayout
    Android:orientation="horizontal"
    Android:layout_width="fill_parent"
    Android:layout_height="wrap_content"
    Android:layout_alignParentBottom="true"
    Android:layout_centerHorizontal="true"
    Android:padding="5dp"
    Android:id="@+id/add_post_layout"
    Android:background="#ffffff"
    Android:layout_alignParentLeft="true"
    Android:layout_alignParentRight="true"
    Android:elevation="5dp"
    Android:layout_margin="0pt"
   >

    <EditText
        Android:layout_width="0dp"
        Android:layout_height="match_parent"
        Android:id="@+id/messageText"
        Android:layout_gravity="bottom"
        Android:layout_weight="1"
        Android:maxLines="4"
        Android:scrollbars="vertical"
        Android:background="@color/trasnperant"
        Android:hint="Type your message"
        Android:layout_marginBottom="4dp"
        />
    <ImageButton
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:src="@drawable/ic_send_black_36dp"
        Android:id="@+id/sendButton"
        Android:background="@drawable/abc_btn_default_mtrl_shape"
        Android:onClick="addPost"
        />
</LinearLayout>

enter image description here

27
AlgoCoder

Проблема заключалась в том, что я использовал <item name="Android:windowTranslucentStatus">true</item> в styles.xml

Чтобы включить adjustResize, добавьте Android:fitsSystemWindows="true" в родительский макет вашей активности

15
AlgoCoder

Или добавьте эту строку в манифест. Android:windowSoftInputMode="adjustResize"

12
user5311329

Если вы не хотите, чтобы ваш Toolbar был выдвинут, вам не следует использовать adjustPan. Использование adjustResize без каких-либо других вещей (без добавления каких-либо дополнительных Views) должно быть достаточно.

9
Bartek Lipinski

В моем случае мое приложение по умолчанию использовало Coordinator Layout для корневого элемента. Даже то, что было описано выше, не решило мою проблему. Тогда я сделал следующее:

  1. Изменен макет корня с Layout Coordinator на RelativeLayout
  2. Включен Android:fitsSystemWindows="true" в корневой макет
  3. Включен Android:windowSoftInputMode="adjustResize|stateAlwaysHidden" в тег манифеста активности.
5
Lucas Coelho

Вы должны добавить Android: fitsSystemWindows = "true" в корневой макет панели инструментов. Если вы добавите его в родительский макет своей деятельности, над панелью инструментов появится странная строка (с высотой строки состояния).

4
Tsiogas P.
<include
    Android:id="@+id/toolbar_home"
    layout="@layout/toolbar_home"
    Android:elevation="5dp"
Android:layout_alignParentTop="true"
    />
2
user5311329

Использование Android:windowSoftInputMode="adjustNothing" для активности в манифесте работало для меня.

1
saswanb

попробуй это,

Android:windowSoftInputMode="adjustPan"

в вашем manifest.xml в теге активности.

1
Ganpat Kaliya

Я пробовал много способов сохранить панель инструментов фиксированной, не изменяя размер и не сжимая макет с помощью Android: windowSoftInputMode = "AdjustResize", что не является правильным.

Это возможно только по схеме Координатора,

<Android.support.design.widget.CoordinatorLayout 
xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:card_view="http://schemas.Android.com/apk/res-auto"
Android:layout_width="match_parent"
Android:layout_height="match_parent">

<Android.support.design.widget.AppBarLayout
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content">

    <Android.support.design.widget.CollapsingToolbarLayout
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content">

        <Android.support.v7.widget.Toolbar 
           xmlns:Android="http://schemas.Android.com/apk/res/Android"
           xmlns:ripple="http://schemas.Android.com/apk/res-auto"
           Android:id="@+id/tv_toolbar"
           Android:layout_width="match_parent"
           Android:layout_height="50dp"
           Android:background="#fff"
           ripple:contentInsetStart="0dp">
        </Android.support.v7.widget.Toolbar>

    </Android.support.design.widget.CollapsingToolbarLayout>
</Android.support.design.widget.AppBarLayout>

<ScrollView
    Android:id="@+id/coordinate_container"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    Android:marginTop="56dp">
</ScrollView>

Сохранить структуру как

 Coordinator layout
  |-->Toolbar    (Android:id="@+id/toolbar")
  |-->ScrollView (Android:layout_below="@id/toolbar")
   |-->Child
   |-->Child
   |-->Child
0
Anuraag Patil

Я использую CoordinatorLayout в качестве корневого макета для панели инструментов. У меня была та же проблема, но я решил ее, установив панель инструментов в:

app:layout_scrollFlags="enterAlways" 

вместо:

app:layout_scrollFlags="scroll|enterAlways"

и добавление:

Android:windowSoftInputMode="adjustNothing"

в деятельности в манифесте.

0
sebkes

 enter image description here

Here is the solution for this fix
- Android:windowSoftInputMode="adjustResize" in Manifest File
- Make a class "CommentKeyBoardFix.Java" and copy and paste the below code.

public class CommentKeyBoardFix
{
private View mChildOfContent;
private int usableHeightPrevious;
private FrameLayout.LayoutParams frameLayoutParams;
private Rect contentAreaOfWindowBounds = new Rect();

public CommentKeyBoardFix(Activity activity)
{
    FrameLayout content = activity.findViewById(Android.R.id.content);
    mChildOfContent = content.getChildAt(0);
    mChildOfContent.getViewTreeObserver().addOnGlobalLayoutListener(this::possiblyResizeChildOfContent);
    frameLayoutParams = (FrameLayout.LayoutParams) mChildOfContent.getLayoutParams();
}

private void possiblyResizeChildOfContent()
{
    int usableHeightNow = computeUsableHeight();
    if (usableHeightNow != usableHeightPrevious)
    {
        int heightDifference = 0;
        if (heightDifference > (usableHeightNow /4))
        {
            // keyboard probably just became visible
            frameLayoutParams.height = usableHeightNow - heightDifference;
        }
        else
        {
            // keyboard probably just became hidden
            frameLayoutParams.height = usableHeightNow;
        }
        mChildOfContent.layout(contentAreaOfWindowBounds.left, contentAreaOfWindowBounds.top, contentAreaOfWindowBounds.right, contentAreaOfWindowBounds.bottom);
        mChildOfContent.requestLayout();
        usableHeightPrevious = usableHeightNow;
    }
}

private int computeUsableHeight()
{
    mChildOfContent.getWindowVisibleDisplayFrame(contentAreaOfWindowBounds);
    return contentAreaOfWindowBounds.height();
}
}

And then call this class in your Activity or Fragment
setContentView(R.layout.your_comments_layout)
CommentKeyBoardFix(this) ---> For Kotlin
or
new CommentKeyBoardFix(this) ---> For Java
0
yash786

Пожалуйста, проверьте WindowsSoftInputMode в Android Manifest Попробуйте установить AdjustResize или AdjsutPan

0
Ashish Agrawal