У меня есть служба (реализующая 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
}