Пустое пространство, когда я возвращаюсь в Activity (принудительная Soft Keyboard)
у меня естьActionView
с пунктом меню наActionBar
(с помощьюActionBarSherlock), Я могу отобразитьEditText
в качестве поля поиска в нем. Это вход для запуска другогоActivity
сCustomView
в ActionBar, который отображает тот же макет (я ничего не использую, чтобы заставитьSoftKeyboard
чтобы появиться во втором упражнении, здесь нет проблем). Когда я хочу, чтобы Soft Keyboard появлялась / исчезала автоматически, когда представление свернуто в первом действии, я использую:
метод openKeyboard
mImm.toggleSoftInput(InputMethodManager.SHOW_FORCED, InputMethodManager.HIDE_IMPLICIT_ONLY);
метод closeKeyboard
mImm.hideSoftInputFromWindow(edittext.getWindowToken(), 0);
Я используюActionExpandListener
сделать SoftKeyboard появляется или исчезает, когдаView
расширяется или разрушается. С этими двумя методами выше, я получил ожидаемый результат. Я нашел это на нескольких вопросах о SO (особенно наЗакрыть / скрыть программную клавиатуру Android а такжеОтображение программной клавиатуры для SearchView на ActionBar или жеПринудительное открытие Soft Keyboard).
Просто чтобы понять, когда я использовалSHOW_IMPLICIT
или жеSHOW_FORCED
в одиночку это не влияло на более низкие версии (как 2. +). EditText был сфокусирован, но клавиатура не появлялась (так что, наверное, это было плохо). В последних версиях (например, 4. +) это был хороший эффект и никаких проблем. Затем я заставил клавиатуру появиться сметод openKeyboard выше.
Теперь у меня есть некоторые проблемы с этим ...
В более низких версиях я получил «пустое» пространство до и после создания / уничтожения клавиатуры, я могу жить с этим.НО в последних версиях я получил «пустое» пространство, которое отображается привернуться к первому занятию, И это здесь менее чем за одну секунду, но достаточно, чтобы увидеть это!
Чтобы лучше понять, что происходит, смотрите изображение ниже:
1. Второе занятие: я нажимаю кнопку «Вверх» - клавиатура исчезает правильно.
2. (назад к) Первое действие: мой ListView покрыт "пустым" пробелом (цвет фона в моем приложении). И это исчезает(это та же высота SoftKeyboard, без сомнений!)
Я думаю, это потому, чтоЯ заставил клавиатуру появиться в моей первой деятельностихотя я тоже заставлял клавиатуру прятаться когда я иду вторым, но как я могу разрешить «пустое» пространство, когда я возвращаюсь к первому занятию?
Резюме
1) Действие => нажмите элемент в меню> просмотреть коллапс> показать клавиатуру> нажать текст> отправить его> скрыть клавиатуру> запустить действие B.
2) действие B => setCustomView на панели действий> показывать клавиатуру только в том случае, если текст редактирования выделен / нажата> нажмите текст> отправить его> скрыть клавиатуру> обновить содержимое> нажать кнопку «домой»> вернуться к действию A
3) Экран активности => «пустой» экран> исчезает.
Любая помощь будет очень признательна.
Спасибо за ваше время.
РЕДАКТИРОВАТЬ
Я добавляю свой код моего первого класса, чтобы увидеть, если кто-то скажет мне, что я делаю неправильно. Может быть, это мой код, который делает проблему.
Меню (ActionView)
ActionBar actionBar;
MenuItem itemSearchAction;
EditText mSearchEdit;
InputMethodManager mImm;
@Override
public boolean onCreateOptionsMenu(final Menu menu) {
getSupportMenuInflater().inflate(R.menu.main, menu);
itemSearchAction = menu.findItem(R.id.action_search);
View v = (View) itemSearchAction.getActionView();
mSearchEdit = (EditText) v.findViewById(R.id.SearchEdit);
itemSearchAction.setOnActionExpandListener(this);
return true;
}
OnActionExpandListener
@Override
public boolean onMenuItemActionExpand(MenuItem item) {
actionBar.setIcon(R.drawable.ic_app_search); // change icon
mSearchEdit.requestFocus(); // set focus on edittext
openKeyboard(); // the method above
mSearchEdit.setOnEditorActionListener(new OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
if (actionId == EditorInfo.IME_ACTION_SEARCH || (event != null && event.getKeyCode() == KeyEvent.KEYCODE_ENTER)) {
closeKeyboard(); // same method as above
// new Intent() to second activity
// perform with startActivity();
itemSearchAction.collapseActionView(); // collapse view
return true;
}
return false;
}
});
// add a clicklistener to re-open the keyboard on lower versions
mSearchEdit.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
openKeyboard();
}
});
return true;
}
@Override
public boolean onMenuItemActionCollapse(MenuItem item) {
actionBar.setIcon(R.drawable.ic_app_logo); // change icon again
if(!(mSearchEdit.getText().toString().equals("")))
mSearchEdit.setText(""); // reinitial the edittext
return true;
}
OnOptionsItemSelected
// I had this verification when I make new Intent() to
// a new activity, just in case (works like a charm)
if(itemSearchAction.isActionViewExpanded())
itemSearchAction.collapseActionView();
ActionView (элемент + макет)
<item
android:id="@+id/action_search"
android:icon="@drawable/ic_app_search"
android:title="@string/action_search"
android:showAsAction="ifRoom|collapseActionView"
android:actionLayout="@layout/search_actionview" />
<EditText
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/SearchEdit"
android:layout_width="fill_parent" android:layout_height="wrap_content"
android:layout_gravity="right|bottom" android:gravity="left"
android:layout_marginBottom="6dip"
android:hint="@string/action_search"
android:textColor="@color/white"
android:textColorHint="@color/white"
android:singleLine="true"
android:cursorVisible="true"
android:inputType="text"
android:imeOptions="actionSearch|flagNoExtractUi"
android:imeActionLabel="@string/action_search"
android:focusable="true" android:focusableInTouchMode="true"
android:background="@drawable/bt_edit_searchview_focused" >
<requestFocus />
</EditText>
ОБНОВИТЬ
Я вижу много подобных проблем, сEditText
вActionBar
что не заставляет клавиатуру появляться, даже если фокус установлен. Я попробовал это снова (даже если я уже проверял несколько раз):
/*
* NOT WORKING
* Sources: https://stackoverflow.com/questions/11011091/how-can-i-focus-on-a-collapsible-action-view-edittext-item-in-the-action-bar-wh
* https://stackoverflow.com/a/12903527/2668136
*/
int mode = WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE;
getWindow().setSoftInputMode(mode);
postDelayed() to show: .showSoftInput(mSearchEdit, InputMethodManager.SHOW_IMPLICIT); - 200ms (Not working on lower versions)
postDelayed() to hide: .hideSoftInputFromWindow(mSearchEdit.getWindowToken(), 0); - 200ms
new Runnable() on edittext => requestFocus() + showSoftInput(SHOW_IMPLICIT/FORCED/HIDE_NOT_ALWAYS/HIDE_IMPLICIT_ONLY)
Кажется со мной толькоSHOW_FORCED|HIDE_IMPLICIT_ONLY
может заставить клавиатуру показывать автоматически, когда вид сворачивается. После этого во всех версиях я должен сделатьhideSoftInputFromWindow
0 для сокрытия.
НО это не отображает клавиатуру, даже если текст редактирования нажат, поэтому я добавилClickListener
заставить клавиатуру снова показывать (это происходит только в более низких версиях).
UPDATE2:
Это явно странно, когда я пытаюсь сделать немногоThread
как я видел во многих SO-ответах (с / без ABS), в более низких версиях ничего не происходит.
Я попробовал другой способ. Я создал новый поток за короткое время до вызова нового намерения скрыть клавиатуру. У меня была клавиатура, которая заставляла закрыться, хорошо. И тогда я открыл новую деятельность, хорошо. Но теперь, когда я вернусь, оно того стоит! «Пустое» пространство также в более низких версиях, когда я вернусь. Я сделал это:
// close the keyboard before intent
closeKeyboard();
// make the intent after 500 ms
Handler handler = new Handler();
Runnable runner = new Runnable() {
public void run() {
// new intent with startActivity()
}
};
handler.postDelayed(runner, 500);
// collapse the View
itemSearchAction.collapseActionView();
Это вызывает у меня головную боль! Я не понимаю, почему в моем случае вышеприведенный совет не работает, тогда как на других ответах, когда они используют новый поток, чтобы показать / скрыть клавиатуру, это работает отлично.
НОТА: мои тесты были на(Эмулятор :) GalaxyNexus, NexusS, NexusOne и(реальные устройства :) Samsung GalaxySL (2.3.6) и Nexus4 (4.4).
Если кто-то может помочь мне в этой безобразной ситуации. Заранее спасибо.