21
Дек
2016

toggleSoftInput со значением ShowForced закрывает собой view

Добился того, чтобы клавиатура при появлении сдвигала Layout, который над ней, добавив в манифест android:windowSoftInputMode="adjustResize". Потом, мне понадобилось принудительно показать клавиатуру, что я сделал следующим образом:

InputMethodManager imm = (InputMethodManager)getSystemService(AddInboxItemActivity.INPUT_METHOD_SERVICE);
                imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);

Клавиатура дейтвительно показывается, но поверх уже существующих view, т. е. игнорируя то, что написано в манифесте. Что-нибудь можно сделать?


Обновление Код activity с формой ввода. Что важно, мы приходим в неё из другой активности. Если мы приходим с параметром "View", значит мы будем просматривать заметку и нам клавиатура не нужна. Если мы пришли без этого параметра, значит мы будем создавать новую заметку, где клавиатура нужна. Кроме того, кнопка "редактировать" также должна показать клавиатуру.

public class NotMainActivity extends AppCompatActivity {

    EditText editTitle, editNote;
    Button btnSave, btnEdit, btnCancel;

    @Override
    protected void onCreate(Bundle savedInstanceState){
        setTheme(R.style.AppDefault);
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_add_inbox_item);

        btnCancel = (Button) findViewById(R.id.cancel_button);
        btnEdit = (Button) findViewById(R.id.edit_button);
        btnSave = (Button) findViewById(R.id.save_button);

        btnCancel.setOnClickListener(onClickListener);
        btnEdit.setOnClickListener(onClickListener);
        btnSave.setOnClickListener(onClickListener);

        editTitle = (EditText)findViewById(R.id.title);
        editNote = (EditText)findViewById(R.id.note);

        String activityMode = getIntent().getExtras().getString("mode");

        // В режиме "Просмотр заметки" нам клавиатура не нужна
        if (activityMode.equals("View")){

            // поля ввода тоже, делаем их неактивными
            editTitle.setEnabled(false);
            editNote.setEnabled(false);

            // пытаемся убрать фокус с полей, хотя они и так уже не активные, но без толку
            editTitle.clearFocus();
            editNote.clearFocus();

            btnSave.setVisibility(View.GONE);
            btnCancel.setText(R.string.back);

            // пытаемся сфокусироваться на корневом layout, но клавиатура всё рано не исчезает
           RelativeLayout relativeLayout = (RelativeLayout) this.findViewById(R.id.layoutContainer);
           relativeLayout.requestFocus();

            // лишь этот грубый метод даёт эффект
            getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);

            editTitle.setText(getIntent().getExtras().getString("title"));
            editNote.setText(getIntent().getExtras().getString("noteText"));
        }
        else{
            // в режиме ввода клавиатура нам нужна, она появляется при запросе фокуса
            editNote.requestFocus();
            btnEdit.setVisibility(View.GONE);
        }
    }

    View.OnClickListener onClickListener = new View.OnClickListener() {
        public void onClick(View view) {
        switch (view.getId()) {
            case R.id.save_button:

                String title = editTitle.getText().toString();
                String note = editNote.getText().toString();

                DBHandler dBHandler = new DBHandler(NotMainActivity.this);
                dBHandler.addNewItem(title, note);

                Toast.makeText(getApplicationContext(), "Сохранено", Toast.LENGTH_SHORT).show();
                finish();
                break;

            case R.id.edit_button:
                editTitle.setEnabled(true);
                editNote.setEnabled(true);
                // теперь нам нужна клавиатура, потому мы просмотрев запись, захотели её отредактировать.
                // Но из-за SOFT_INPUT_STATE_HIDDEN вызов requestFocus() не сработает; клавиатура появиться только 
                //     если ткнуть пальцем в поле
                editNote.requestFocus();

                btnEdit.setVisibility(View.GONE);
                btnSave.setVisibility(View.VISIBLE);
                btnCancel.setText(R.string.cancel);

                // Принудительно показываем клавиатуру. Она появляется, но закрывает собой кнопки "Сохранить", "Редактировать"
                // игнорируя android:windowSoftInputMode="adjustResize" в манифесте
                InputMethodManager imm = (InputMethodManager)getSystemService(NotMainActivity.INPUT_METHOD_SERVICE);
                imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, InputMethodManager.HIDE_IMPLICIT_ONLY);

                break;

            case R.id.cancel_button:
                finish();
                break;
        }
        }
    };
}

Источник: https://ru.stackoverflow.com/questions/605993/togglesoftinput-%D1%81%D0%BE-%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5%D0%BC-showforced-%D0%B7%D0%B0%D0%BA%D1%80%D1%8B%D0%B2%D0%B0%D0%B5%D1%82-%D1%81%D0%BE%D0%B1%D0%BE%D0%B9-view

Share

Тебе может это понравится...