web-dev-qa-db-ja.com

キーボードが表示されているときに一部のビューを除いてコンテンツをプッシュアップ

下部に5つのEditTextButtonTextViewを含むレイアウトがあります。 EditTextを押すと、キーボードが表示され、all私のViewは腕立て伏せになります。

TextViewButtonをキーボードの上にプッシュするのではなく、すべてをプッシュするEditTextScrollView内からキーボードの上まで。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:id="@+id/activity_main"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    Android:orientation="vertical"
    >

    <ScrollView
        Android:layout_width="match_parent"
        Android:layout_height="match_parent"
        Android:layout_weight="1"
        Android:background="#ff0"
        >

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

            <EditText
                Android:layout_marginTop="30dp"
                Android:layout_width="match_parent"
                Android:layout_height="wrap_content"
                Android:hint="EditText 1"

                />

            <EditText
                Android:layout_marginTop="30dp"
                Android:layout_width="match_parent"
                Android:layout_height="wrap_content"
                Android:hint="EditText 2"
                />

            <EditText
                Android:layout_marginTop="30dp"
                Android:layout_width="match_parent"
                Android:layout_height="wrap_content"
                Android:hint="EditText 3"
                />

            <EditText
                Android:layout_marginTop="30dp"
                Android:layout_width="match_parent"
                Android:layout_height="wrap_content"
                Android:hint="EditText 4"
                />

            <EditText
                Android:layout_marginTop="30dp"
                Android:layout_width="match_parent"
                Android:layout_height="wrap_content"
                Android:hint="EditText 5"
                Android:inputType="textNoSuggestions"
                />

        </LinearLayout>

    </ScrollView>

    <Button
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        Android:layout_alignParentBottom="true"
        Android:text="Button"
        />
    <TextView
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:textColor="#000"
        Android:text="I don't want to Push this TextView and Button to above keyboard when keyboard is shown. Just obly want to Push the ScrollView that contain all EditText"
        />
</LinearLayout>

enter image description here

私は考えを持っています。キーボードの表示と非表示をいつ聞くか。キーボードを表示するときは、ScrollView =キーボードの高さの下マージンを設定し、キーボードを非表示にするときは、このマージン= 0を設定します。
私のケースをより簡単に処理する方法はありますか?どんな助けや提案も大歓迎です。

[〜#〜]更新[〜#〜]
windowSoftInputMode=adjustPan =>を使用した場合、すべてのEditTextがキーボードの上まで押し上げられるわけではありません
windowSoftInputMode=adjustResize => ButtonTextViewを使用し、すべてのEditTextがキーボードの上まで押し上げられた場合

19
Phan Van Linh

動作しません-キーボードが表示されたときに検出する信頼できるAPIがありません。このサイトには「解決策」がありますが、誤検知と誤検知があります。しかし、softInputModeをadjustPanに設定するのが最善のようです。これにより、OSは、カーソルがキーボードの上に表示されるのに必要な最小限の量だけ画面全体をスクロールします。 (アプリ全体がキーボードの上にあるのは、adjustResizeモードによるものです)。

5
Gabe Sechan
  1. すべてのNexusモバイルおよびタブレットデバイスでテスト済み。それはうまくいきます。私はあなたのレイアウトxmlコードを使用しており、ビューにIDのみを追加しました。

  2. 私は本番アプリケーションで以下のライブラリを使用していますが、これは非常に有望です。同じことを実現し、アプリgradleに次の行を追加するには: 'net.yslibrary.keyboardvisibilityevent:keyboardvisibilityevent:2.0.1' これが同じリンクです

  3. 残りのコードについては、以下の要点を参照してください: マニフェストコード、アクティビティコード、アクティビティレイアウトコード

5
Anurag Singh

ManifestAndroid:windowSoftInputMode="adjustPan"を追加する必要があります。これは、プロのように機能します。

<activity Android:name=".your_activity_name"
        Android:windowSoftInputMode="adjustPan">
    ..............

</activity>
3
W4R10CK

使う Relavtive Layout親として2つの線形レイアウトを子として、スクロールビューを最初のLinearLayoutに配置し、テキストビューのボタンをもう1つに配置します。

このコードを使用してください。それをテストしました、あなたが期待するように動作します。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:id="@+id/activity_main"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    >

    <LinearLayout
        Android:id="@+id/linear"
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content">

    <ScrollView
        Android:layout_width="match_parent"
        Android:layout_height="match_parent"
        Android:layout_weight="1"
        Android:background="#ff0"
        >

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

            <EditText
                Android:layout_marginTop="30dp"
                Android:layout_width="match_parent"
                Android:layout_height="wrap_content"
                Android:hint="EditText 1"

                />

            <EditText
                Android:layout_marginTop="30dp"
                Android:layout_width="match_parent"
                Android:layout_height="wrap_content"
                Android:hint="EditText 2"
                />

            <EditText
                Android:layout_marginTop="30dp"
                Android:layout_width="match_parent"
                Android:layout_height="wrap_content"
                Android:hint="EditText 3"
                />

            <EditText
                Android:layout_marginTop="30dp"
                Android:layout_width="match_parent"
                Android:layout_height="wrap_content"
                Android:hint="EditText 4"
                />

            <EditText
                Android:layout_marginTop="30dp"
                Android:layout_width="match_parent"
                Android:layout_height="wrap_content"
                Android:hint="EditText 5"
                Android:inputType="textNoSuggestions"
                />

        </LinearLayout>

    </ScrollView>
    </LinearLayout>

    <LinearLayout
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        Android:orientation="vertical"
        Android:layout_below="@id/linear">
        <Button
            Android:layout_width="match_parent"
            Android:layout_height="wrap_content"
            Android:layout_alignParentBottom="true"
            Android:text="Button"
            />
        <TextView
            Android:id="@+id/text"
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:textColor="#000"
            Android:text="I don't want to Push this TextView and Button above keyboard"
            />
    </LinearLayout>
</RelativeLayout>
3
Darshan Miskin

すべてのeditText、button、textviewにIDを指定します:-

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:id="@+id/activity_main"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    Android:orientation="vertical"
    >

    <ScrollView
        Android:layout_width="match_parent"
        Android:layout_height="match_parent"
        Android:layout_weight="1"
        Android:background="#ff0">

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

            <EditText
                Android:layout_marginTop="30dp"
                Android:layout_width="match_parent"
                Android:layout_height="wrap_content"
                Android:hint="EditText 1"
                Android:id="@+id/et1"
                />

            <EditText
                Android:layout_marginTop="30dp"
                Android:layout_width="match_parent"
                Android:layout_height="wrap_content"
                Android:hint="EditText 2"
                Android:id="@+id/et2"/>

            <EditText
                Android:layout_marginTop="30dp"
                Android:layout_width="match_parent"
                Android:layout_height="wrap_content"
                Android:hint="EditText 3"
                Android:id="@+id/et3"/>

            <EditText
                Android:layout_marginTop="30dp"
                Android:layout_width="match_parent"
                Android:layout_height="wrap_content"
                Android:hint="EditText 4"
                Android:id="@+id/et4"/>

            <EditText
                Android:layout_marginTop="30dp"
                Android:layout_width="match_parent"
                Android:layout_height="wrap_content"
                Android:hint="EditText 5"
                Android:inputType="textNoSuggestions"
                Android:id="@+id/et5"/>

        </LinearLayout>

    </ScrollView>

    <Button
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        Android:layout_alignParentBottom="true"
        Android:text="Button"
        Android:id="@+id/btn"/>
    <TextView
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:textColor="#000"
        Android:text="I don't want to Push this TextView and Button to above keyboard when keyboard is shown. Just obly want to Push the ScrollView that contain all EditText"
        Android:id="@+id/tv"/>
</LinearLayout>

マニフェストで:-

Android:windowSoftInputMode="adjustResize|stateHidden"

あなたの活動では:-

public class Main2Activity extends AppCompatActivity {
    EditText e1,e2,e3,e4,e5;
    Button button;
    TextView textView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);
        e1=(EditText)findViewById(R.id.et1);
        e2=(EditText)findViewById(R.id.et2);
        e3=(EditText)findViewById(R.id.et3);
        e4=(EditText)findViewById(R.id.et4);
        e5=(EditText)findViewById(R.id.et5);
        textView=(TextView)findViewById(R.id.tv);
        button=(Button)findViewById(R.id.btn);
        e1.setOnFocusChangeListener(new View.OnFocusChangeListener() {
            @Override
            public void onFocusChange(View view, boolean b) {
                hideKeyBoard();
            }
        });
        e2.setOnFocusChangeListener(new View.OnFocusChangeListener() {
            @Override
            public void onFocusChange(View view, boolean b) {
                hideKeyBoard();
            }
        });
        e3.setOnFocusChangeListener(new View.OnFocusChangeListener() {
            @Override
            public void onFocusChange(View view, boolean b) {
                hideKeyBoard();
            }
        });
        e4.setOnFocusChangeListener(new View.OnFocusChangeListener() {
            @Override
            public void onFocusChange(View view, boolean b) {
                hideKeyBoard();
            }
        });
        e5.setOnFocusChangeListener(new View.OnFocusChangeListener() {
            @Override
            public void onFocusChange(View view, boolean b) {
                hideKeyBoard();
            }
        });

    }
    private void hideKeyBoard(){
        final View activityRootView = findViewById(R.id.activity_main);
        activityRootView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
            @Override
            public void onGlobalLayout() {
                int heightDiff = activityRootView.getRootView().getHeight() - activityRootView.getHeight();
                if (heightDiff > dpToPx(Main2Activity.this, 200)) { // if more than 200 dp, it's probably a keyboard...
                    // ... do something here
                    button.setVisibility(View.GONE);
                    textView.setVisibility(View.GONE);
                }
                else {
                    button.setVisibility(View.VISIBLE);
                    textView.setVisibility(View.VISIBLE);
                }
            }
        });
    }
    public static float dpToPx(Context context, float valueInDp) {
        DisplayMetrics metrics = context.getResources().getDisplayMetrics();
        return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, valueInDp, metrics);
    }

}

ここでは、キーボードが表示されているかどうかを確認しています。そして、それが表示されている場合は、ボタンとテキストビューを非表示にします。

2
Nainal

最初のレイアウト変更

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:id="@+id/activity_main"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    Android:orientation="vertical">

    <ScrollView
        Android:layout_width="match_parent"
        Android:layout_height="match_parent"
        Android:layout_weight="1"
        Android:background="#ff0">

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

            <EditText
                Android:layout_width="match_parent"
                Android:layout_height="wrap_content"
                Android:layout_marginTop="30dp"
                Android:hint="EditText 1"

                />

            <EditText
                Android:layout_width="match_parent"
                Android:layout_height="wrap_content"
                Android:layout_marginTop="30dp"
                Android:hint="EditText 2" />

            <EditText
                Android:layout_width="match_parent"
                Android:layout_height="wrap_content"
                Android:layout_marginTop="30dp"
                Android:hint="EditText 3" />

            <EditText
                Android:layout_width="match_parent"
                Android:layout_height="wrap_content"
                Android:layout_marginTop="30dp"
                Android:hint="EditText 4" />

            <EditText
                Android:layout_width="match_parent"
                Android:layout_height="wrap_content"
                Android:layout_marginTop="30dp"
                Android:hint="EditText 5"
                Android:inputType="textNoSuggestions" />

        </LinearLayout>

    </ScrollView>


    <RelativeLayout
        Android:id="@+id/rlBtm"
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content">

        <Button
            Android:id="@+id/btn"
            Android:layout_width="match_parent"
            Android:layout_height="wrap_content"
            Android:text="Button" />

        <TextView
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:layout_below="@+id/btn"
            Android:text="I don't want to Push this TextView and Button to above keyboard when keyboard is shown. Just obly want to Push the ScrollView that contain all EditText"
            Android:textColor="#000" />

    </RelativeLayout>

</LinearLayout>

次にクラスを追加します

public class KeyboardUtil {

    public static void setKeyboardVisibilityListener(Activity activity, final KeyboardVisibilityListener keyboardVisibilityListener) {
        final View contentView = activity.findViewById(Android.R.id.content);
        contentView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
            private int mPreviousHeight;

            @Override
            public void onGlobalLayout() {
                int newHeight = contentView.getHeight();
                if (mPreviousHeight != 0) {
                    if (mPreviousHeight > newHeight) {
                        // Height decreased: keyboard was shown
                        keyboardVisibilityListener.onKeyboardVisibilityChanged(true);
                    } else if (mPreviousHeight < newHeight) {
                        // Height increased: keyboard was hidden
                        keyboardVisibilityListener.onKeyboardVisibilityChanged(false);
                    } else {
                        // No change
                    }
                }
                mPreviousHeight = newHeight;
            }
        });
    }
}

そして、onCreateのアクティビティから

KeyboardUtil.setKeyboardVisibilityListener(this, new KeyboardVisibilityListener() {
            @Override
            public void onKeyboardVisibilityChanged(boolean keyboardVisible) {
                rlBtm.setVisibility(keyboardVisible ? View.GONE : View.VISIBLE);
            }
        });

rlBtmのIDを見つけます。

2
Pavya

このレイアウトを追加してみてください、

 <LinearLayout
   xmlns:Android="http://schemas.Android.com/apk/res/Android"
   Android:id="@+id/activity_main"
   Android:layout_width="match_parent"
   Android:layout_height="match_parent"
   Android:orientation="vertical">
<ScrollView
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    Android:layout_weight="1"
    Android:background="#ff0"
    >

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

        <EditText
            Android:layout_marginTop="30dp"
            Android:layout_width="match_parent"
            Android:layout_height="wrap_content"
            Android:hint="EditText 1"

            />

        <EditText
            Android:layout_marginTop="30dp"
            Android:layout_width="match_parent"
            Android:layout_height="wrap_content"
            Android:hint="EditText 2"
            />

        <EditText
            Android:layout_marginTop="30dp"
            Android:layout_width="match_parent"
            Android:layout_height="wrap_content"
            Android:hint="EditText 3"
            />

        <EditText
            Android:layout_marginTop="30dp"
            Android:layout_width="match_parent"
            Android:layout_height="wrap_content"
            Android:hint="EditText 4"
            />

        <EditText
            Android:layout_marginTop="30dp"
            Android:layout_width="match_parent"
            Android:layout_height="wrap_content"
            Android:hint="EditText 5"
            Android:inputType="textNoSuggestions"
            />

        <Button
            Android:layout_width="match_parent"
            Android:layout_height="wrap_content"
            Android:layout_alignParentBottom="true"
            Android:text="Button"
            />
        <TextView
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:textColor="#000"
            Android:text="any text"
        />
    </LinearLayout>
  </ScrollView>


</LinearLayout>
2
rak

以下のコードを使用できます(ただし、この場合、ボタンとテキストビューは画面の終わりでした。それ以外の場合は、線形レイアウトで管理することもできます。ボタンとテキストビューを表示する必要がある場合は、plsが尋ねます。

<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="match_parent"
Android:layout_height="match_parent">
<ScrollView
    Android:id="@+id/sw1"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent">
    <LinearLayout
        Android:id="@+id/ll1"
        Android:layout_width="match_parent"
        Android:layout_height="match_parent"
        Android:orientation="vertical">
        <EditText
            Android:layout_width="match_parent"
            Android:layout_height="70dp"
            Android:layout_marginBottom="10dp"
            Android:layout_marginTop="100dp"
            Android:background="#ff009988"
            Android:padding="10dp"
            Android:textColor="#ffffff" />
        <EditText
            Android:layout_width="match_parent"
            Android:layout_height="70dp"
            Android:layout_marginBottom="10dp"
            Android:background="#ff009988"
            Android:padding="10dp"
            Android:textColor="#ffffff" />
 <RelativeLayout
    Android:id="@+id/btmbar"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:layout_alignParentBottom="true">

    <Button
        Android:id="@+id/button2"
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        Android:text="Button" />

    <TextView
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        Android:layout_below="@+id/button2"
        Android:text="Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, " />
</RelativeLayout>
    </LinearLayout>
</ScrollView>
1
Arpan24x7