3

を使用しているアクティビティがありwindowSoftInputMode="adjustPan"、次を呼び出すOnPreDrawListenerforがあります。EditText

editText.requestFocus();
inputManager.showSoftInput(editText, 0);

これは期待どおりに機能しActivity、スペースを空けるために押し上げEditTextます。ただし、戻るボタン(ウィンドウを元の場所にパンする)でキーボードを閉じると、EditTextもう一度タッチしてキーボードを表示します。キーボードは表示されますが、ウィンドウは調整されません。

にを追加して、同じ2つの呼び出しをもう一度呼び出してみOnClickListenerましEditTextた。

editText.requestFocus();
inputManager.showSoftInput(editText, 0);

しかし、ウィンドウを閉じて再度表示するまで、ウィンドウはパンしません。助言がありますか?

4

2 に答える 2

0

この3つのステップで問題が解決すると思います。

1)マニフェストファイルでwindowSoftInputMode="adjustPan"をwindowSoftInputMode="adjustResize "に変更します

2)EditTextに使用しているレイアウトは、親レイアウトをScroolViewに変更します。

<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/android:list"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >
    <EditText
        android:id="@+id/edittextview"
        android:layout_height="wrap_content"
        android:layout_width="fill_parent"
        android:inputType="textFilter"
        android:padding="10dp"
        android:imeOptions="actionDone"
        android:scrollbars="vertical"
        android:textSize="14sp" />
</ScrollView>

3)Edittext onclick writeで「戻るボタンでキーボードを閉じ、ウィンドウが調整されない」ことを避けるために、キーボードを明示的に表示するには

edittext.setOnClickListener(new OnClickListener() {

            public void onClick(View v) {
                InputMethodManager m = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
                if (m != null) {
                    m.toggleSoftInput(0, InputMethodManager.SHOW_IMPLICIT);
                    edittext.requestFocus();
                }
            }
        });

これで問題が解決することを願っています。

于 2013-03-08T03:55:57.017 に答える
0

したがって、これは問題の正確な解決策ではありませんが、最終的には回避策になりました。LinearLayoutIMEが受け取る前に戻るボタンの押下をインターセプトするためのサブクラスを作成しました。

public class IMEInterceptLinearLayout extends LinearLayout {
    //For some reason, the event seems to occur twice for every back press
    //so track state to avoid firing multiple times
    private boolean notifiedListener = false;
    private OnBackPressedPreIMEListener listener;

    public IMEInterceptLinearLayout(Context context) {
        super(context);
    }

    public IMEInterceptLinearLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public IMEInterceptLinearLayout(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    public void setOnBackPressedPreIMEListener(OnBackPressedPreIMEListener listener) {
        this.listener = listener;
    }

    private void fireOnBackPressedPreIME() {
        if(listener != null && !notifiedListener) {
            listener.onBackPressedPreIME();
            notifiedListener = true;
        }
    }

    @Override
    public boolean dispatchKeyEventPreIme(KeyEvent event) {
        if(event.getKeyCode() == KeyEvent.KEYCODE_BACK) {
            fireOnBackPressedPreIME();
            return true;
        } else return super.dispatchKeyEventPreIme(event);
    }

    public interface OnBackPressedPreIMEListener {
        public void onBackPressedPreIME();
    }
}

次に、そこからウィンドウをレイアウトのリスナーとして登録し、イベントを受信したときにウィンドウとキーボードを閉じて、ウィンドウが表示されている間はキーボードを閉じないようにしました。

于 2013-03-12T08:15:52.493 に答える