Как избежать мягкой клавиатуры, подталкивающей мой макет?

У меня есть набор кнопок навигации, расположенных внизу каждой операции. В некоторых действиях мне нужно найти текст поиска вверху. Однако всякий раз, когда пользователь вводит что-то в текстовом виде, мягкая клавиатура всегда подталкивает мои кнопки навигации, даже если она фактически не блокирует текстовое изображение. Это делает мой интерфейс странным. Как я могу заставить свои кнопки навигации оставаться статичными там, где они есть, даже не будучи нажатыми с помощью мягкой клавиатуры? Я попытался установить Activity ActivitySoftInputMode, но ни одна из конфигураций не помогает.

Любые предложения? Благодаря

Ответ 1

У меня была такая же проблема, и я сначала добавил:

<activity
    android:name="com.companyname.applicationname"
    android:windowSoftInputMode="adjustPan">

в файл манифеста. Но это само по себе не решило проблему. Затем, как упоминал Артем Русаковский, я добавил:

<ScrollView
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:isScrollContainer="false">
</ScrollView>

в scrollview.

Это то, что сработало для меня.

Ответ 2

В моем случае причина, по которой кнопки были выдвинуты, заключалась в том, что вид над ними был ScrollView, и он обрушился с кнопками, выдвинутыми вверх над клавиатурой, независимо от того, какое значение android:windowSoftInputMode я устанавливал.

Мне удалось избежать того, что нижняя строка кнопок была нажата мягкой клавиатурой, установив

android:isScrollContainer="false" 

на ScrollView, который находится над кнопками.

Ответ 3

Чтобы решить эту проблему, просто добавьте android:windowSoftInputMode="stateVisible|adjustPan к этой активности в файле манифеста android. например

<activity 
    android:name="com.comapny.applicationname.activityname"
    android:screenOrientation="portrait"
    android:windowSoftInputMode="stateVisible|adjustPan"/>

Ответ 4

Для будущих читателей.

Мне нужен конкретный контроль над этой проблемой, поэтому я это сделал:

Из фрагмента или действия скройте ваши другие представления (которые не нужны, когда клавиатура встала), затем восстановите их, чтобы решить эту проблему:

rootView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
     @Override
     public void onGlobalLayout() {
        Rect r = new Rect();
        rootView.getWindowVisibleDisplayFrame(r);
        int heightDiff = rootView.getRootView().getHeight() - (r.bottom - r.top);

        if (heightDiff > 100) { // if more than 100 pixels, its probably a keyboard...
           //ok now we know the keyboard is up...
           view_one.setVisibility(View.GONE);
           view_two.setVisibility(View.GONE);

        } else {
           //ok now we know the keyboard is down...
           view_one.setVisibility(View.VISIBLE);
           view_two.setVisibility(View.VISIBLE);       
        }
     }
});

Ответ 5

windowSoftInputMode будет либо панорамировать, либо изменять размер макета вашей активности. Единственное, что вы можете сделать, это подключить прослушиватель onFocusChanged к вашему EditText, и когда пользователь выбирает/записывает EditText, вы скрываете или перемещаете навигационные кнопки из экрана. Когда EditText теряет фокус, вы можете переместить навигационные кнопки в нижней части действия.

Ответ 6

У меня была та же проблема, но установка windowSoftInputMode не помогла, и я не хотел менять верхний вид, чтобы иметь isScrollContainer="false", потому что я хотел, чтобы он прокручивался.

Мое решение состояло в том, чтобы определить верхнее расположение инструментов навигации, а не снизу. Я использую Titanium, поэтому я не уверен точно, как это будет переводиться на Android. Определение верхнего расположения представления навигационных инструментов не позволяло мягкой клавиатуре подталкивать его вверх и вместо этого охватывало навигационные элементы управления, как я хотел.

Ответ 7

Решил его, установив непослушный EditText:

etSearch = (EditText) view.findViewById(R.id.etSearch);

etSearch.setInputType(InputType.TYPE_NULL);

etSearch.setOnTouchListener(new OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        etSearch.setInputType(InputType.TYPE_CLASS_TEXT);
        return false;
    }
});