نقل التخطيطات لأعلى عندما يتم عرض لوحة المفاتيح اللينة؟

StackOverflow https://stackoverflow.com/questions/1964789

سؤال

لديّ بعض العناصر في مقابلة نسبية مع مجموعة السمات القاع المحاذاة ، عندما تظهر لوحة المفاتيح الناعمة ، يتم إخفاء العناصر بواسطة لوحة المفاتيح الناعمة.

أود أن يتحركوا لأعلى بحيث إذا كان هناك مساحة كافية للشاشة يتم عرضها فوق لوحة المفاتيح ، أو لجعل القسم أعلى لوحة المفاتيح القابلة للتمرير حتى يتمكن المستخدم من رؤية العناصر.

أي أفكار حول كيفية التعامل مع هذا؟

هل كانت مفيدة؟

المحلول

نعم ، تحقق من هذه المقالة على موقع مطوري Android الذي يصف كيف يعالج الإطار لوحة المفاتيح الناعمة التي تظهر.

ال Android: WindowsoftInputMode يمكن استخدام السمة لتحديد ما يحدث على أساس كل عام: ما إذا كان التخطيط قد تم تغيير حجمه أو ما إذا كان يتم تمريره وما إلى ذلك.

نصائح أخرى

يمكنك أيضًا استخدام هذا الرمز في onCreate() طريقة:

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

أضف AndroidManifest.xml لنشاطك:

android:windowSoftInputMode="adjustPan|adjustResize"

قم بإجراء تغييرات في نشاط ملف البيان الخاص بك مثل

windowSoftInputMode="adjustResize"

أو

قم بإجراء تغييرات في onCreate() الطريقة في فئة النشاط مثل

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

قضية مماثلة كنت أواجهها مع تخطيطي والذي يتكون من عرض التمرير في الداخل. كلما حاولت تحديد نص في EditText ، يتم نقل شريط الإجراءات/القطع/الصق مع الرمز أدناه ، حيث لا يتم تغيير حجم التخطيط

android:windowSoftInputMode="adjustPan"

عن طريق تعديله على النحو التالي

1) Androidmanifest.xml

android:windowSoftInputMode="stateVisible|adjustResize"

2) ملف style.xml ، في نمط النشاط

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

انها عملت.!!!!!!!!!!!!

في Androidmanifest.xml ، لا تنسى أن تضع:

 android:windowSoftInputMode="adjustResize"

وللأشخاص Relativelayout داخل Scrollview ، تعيين:

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

سيكون بخير

للنشاط في إدراج الميثود oncreate الخاص به أسفل الخط

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

ولأشظاق في طريقة oncreate

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

هناك 3 خطوات لمتابعة شاشة التمرير لأعلى.

  1. اكتب في ملف واضح لنشاطك:

Android: WindowsoftInputMode = "adjustresize"

  1. إضافة السطر التالي في طريقة onCreate () لنشاطك

getWindow ().

  1. ثم ضع عرضك بالكامل في "Scrollview" في ملف XML مثل:
<?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>

ملاحظة: لا تنس إضافة Android: Layout_gravity = "المركز" في التصميم النسبي للأصل.

جربت طريقة دييغو راميريز ، فهي تعمل. في Androidmanifest:

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

في 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>

لقد وجدت حلاً لمشاكلي بأنه نفسه تمامًا مثل مشاكلي.

بادئ ذي بدء ، لا يوجد لدي سوى خطية مع عنصرين ، ويحتوي ImageView و linearlayout على edittext وزر واحد ، لذلك كنت بحاجة إلى إبقائهما منفصلين في ملء الشاشة بدون لوحة المفاتيح ، وعندما تظهر لوحة المفاتيح ، يجب أن تبدو أقرب.

لذلك أضفت العرض بينهما مع سمة الارتفاع في 0dp و Weight 1 ، والتي تتيح لي إبقاء آرائي تفصل بين بعضها البعض. وعندما يطبر لوحة المفاتيح ، حيث لا يملكون ارتفاع الإصلاح ، فإنهم فقط تغيير حجمهم ويحافظون على الجانب.

هاهو! إن تغيير حجم التصميم والمسافة بين وجهات نظراتي هي نفسها عندما تكون لوحة المفاتيح موجودة أو غير موجودة.

هنا رمز واضح كامل

<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>

إذا كنت في شظايا ، فعليك إضافة الكود أدناه إلى oncreate الخاص بك على نشاطك ، فإنه يحل المشكلة بالنسبة لي

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

في ملف البيان الخاص بك أضف السطر أدناه. سوف تعمل

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

حسنًا ، هذا متأخر جدًا ، ومع ذلك اكتشفت أنه إذا قمت بإضافة طريقة عرض قائمة ضمن نص التحرير الخاص بك ، فستنقل لوحة المفاتيح جميع التخطيطات تحت هذا edittext دون تحريك 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**

هذا هو الحل الوحيد الذي نجح بالنسبة لي.

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

لقد أضفت للتو السطر التالي إلى تخطيط المستوى الأعلى وكان كل شيء يعمل:

android:fitsSystemWindows="true"
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top