Клавиатура не отображается при выборе EditText - PullRequest
1 голос
/ 11 июля 2011

У меня есть служба (реализующая TextWatcher), которая создает вид в верхней части экрана, который содержит только поле EditText. Затем эта «верхняя панель» отображается поверх всех действий. В данный момент отображается EditText, и методы TextWatcher вызываются правильно, если я устанавливаю его содержимое программным путем.

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

Я не могу понять, почему это работает с деятельностью, но не с моей службой. У меня такое ощущение, что клавиатура хочет отображаться в том же виде, что и TextWatcher, хотя и не уверен.

Может кто-нибудь помочь, пожалуйста?

Это фрагмент моего кода:

public final class TopBarService extends Service implements TextWatcher, OnFocusChangeListener {
    protected LayoutInflater mInflater;
    protected WindowManager mWindowManager;
    protected View mTopEditBar;
    protected EditText mTopEditText;

    public void onCreate() {
        // Create top bar
        mInflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        mWindowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
        mTopBar = mInflater.inflate(R.layout.top_bar, null);
        mTopEditText = (EditText) mTopBar.findViewById(R.id.top_edit_text);
        WindowManager.LayoutParams params = ...; // some "standard" params here
        mWindowManager.addView(mTopBar, params);

        mTopEditText.addTextChangedListener(this);
        mTopEditText.setOnFocusChangeListener(this);
        mTopEditText.setInputType(InputType.TYPE_CLASS_TEXT);
        mTopEditText.setImeOptions(EditorInfo.IME_FLAG_NO_EXTRACT_UI);
    }

    // TextWatcher implementation
    public void afterTextChanged(Editable s) {
        //...
    }

    public void beforeTextChanged(Editable s) {
        //...
    }

    public void onTextChanged(Editable s) {
        //...
    }

    public void onFocusChange(View v, boolean hasFocus) {
        // see Edit below
    }

    ...
}

Где res / layout / top_bar.xml:

<EditText
    android:id="@+id/top_edit_text"
    android:layout_centerVertical="true"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content">
</EditText>

Редактировать: Небольшой прогресс.

Я заметил, что при использовании InputMethodManager это не активно:

public void onFocusChange(View v, boolean hasFocus) {
    InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.restartInput(mTopEditText);
    imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
    imm.showSoftInput(mTopEditText, InputMethodManager.SHOW_IMPLICIT);

    Log.d(TAG, "active? " + imm.isActive()); // false
    Log.d(TAG, "activeOnView? " + imm.isActive(mTopEditText)); // false
    Log.v(TAG, "accepting text? " + imm.isAcceptingText()); // false
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...