Espaço vazio quando eu retornar à atividade (teclado virtual forçado)
eu tenho umActionView
com o item de menu noActionBar
(usandoActionBarSherlock), Sou capaz de exibirEditText
como um campo de pesquisa. É uma entrada para lançar outroActivity
com umCustomView
no ActionBar que exibe o mesmo layout (eu não uso nada para forçar oSoftKeyboard
para aparecer nesta segunda atividade, não há problema aqui). Quando eu quero fazer com que o teclado virtual apareça / desapareça automaticamente quando a visualização se desfaz na primeira atividade, eu uso:
método openKeyboard
mImm.toggleSoftInput(InputMethodManager.SHOW_FORCED, InputMethodManager.HIDE_IMPLICIT_ONLY);
método closeKeyboard
mImm.hideSoftInputFromWindow(edittext.getWindowToken(), 0);
Eu uso oActionExpandListener
para fazer o SoftKeyboard aparecer ou desaparecer quando oView
expande ou colapsa. Com estes dois métodos acima, tenho o resultado esperado. Eu encontrei isso em várias perguntas sobre SO (especialmente emFeche / oculte o teclado virtual do Android eMostrando o teclado virtual para SearchView na ActionBar ouForçando o teclado suave aberto).
Só pra entender, quando eu useiSHOW_IMPLICIT
ouSHOW_FORCED
sozinho, não teve efeito nas versões inferiores (como 2. +). O EditText estava focado, mas o teclado não apareceu (então, você acha que foi uma coisa ruim). Em versões recentes (como 4. + por exemplo), foi um bom efeito e sem problemas. Então, forcei o teclado a aparecer com ométodo openKeyboard acima.
Agora eu tenho alguns problemas com isso ...
Nas versões inferiores, eu tenho espaço "vazio" antes e depois do teclado criado / destruído, eu posso viver com isso.MAS em versões recentes, eu tenho espaço "vazio" que ele exibe quando euvoltar para a primeira atividade. E está aqui durante menos de um segundo, mas suficiente para ver isso!
Para entender melhor o que acontece, veja a imagem abaixo:
1 Segunda atividade: Eu pressiono o botão Up Home - o teclado desaparece corretamente.
2 (voltar para) Primeira atividade: meu ListView é coberto por um espaço "vazio" (cor de fundo no meu aplicativo). E isso desaparece(esta é a mesma altura do SoftKeyboard, sem dúvida!)
Eu acho que é porqueForcei o teclado a aparecer na minha primeira atividadeembora eu também forcei o teclado a se esconder quando vou no segundo, mas como posso resolver o espaço "vazio" quando volto à primeira atividade?
Resumo
1) Uma atividade => pressione o item no menu> visualizar recolher> mostrar o teclado> tocar texto> enviar> ocultar teclado> iniciar atividade B.
2) Atividade B => setCustomView in actionbar> mostre o teclado somente se o texto da edição estiver focado / clicado> toque em texto> envie> ocultar teclado> atualizar conteúdo> pressione o botão home> retornar à atividade A
3) Uma atividade => tela "vazia"> tela desaparece.
Qualquer ajuda será muito apreciada.
Obrigado pelo seu tempo.
EDITAR
Eu adiciono meu código da minha primeira aula, para ver se alguém me diz o que estou fazendo de errado. Talvez seja o meu código que faz o problema.
Menu (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 + layout)
<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>
ATUALIZAR
Eu vejo muitos problemas semelhantes, comEditText
emActionBar
o que não faz o teclado aparecer, mesmo que o foco tenha sido definido. Eu tentei isso novamente (mesmo que eu já tenha testado várias vezes):
/*
* 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)
Parece comigo, sóSHOW_FORCED|HIDE_IMPLICIT_ONLY
pode forçar o teclado a ser exibido automaticamente quando a visualização for recolhida. Depois disso, em todas as versões, devo fazer umahideSoftInputFromWindow
a 0 para escondê-lo.
MAS isso não exibe o teclado mesmo se o texto da edição for pressionado, então eu adicionei umClickListener
para forçar o teclado a mostrar novamente (isso acontece apenas em versões inferiores).
UPDATE2:
É claramente estranho, quando eu tento fazer um poucoThread
como eu vi em muitas respostas SO (com / sem ABS), nada acontece em versões inferiores.
Eu tentei de um jeito diferente. Eu criei o novo segmento para ter um curto período de tempo antes de chamar a nova intenção para esconder o teclado. Eu tive o teclado que forçou a fechar, ok. E então eu abri a nova atividade, ok. Mas agora quando eu voltar, vale a pena! O espaço "vazio" também está nas versões inferiores quando eu volto. Eu fiz isso:
// 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();
Isso me dá dores de cabeça! Eu não entendo porque no meu caso, a dica acima não funciona enquanto em outras respostas, quando eles usam um novo thread para mostrar / ocultar o teclado, isso funciona perfeitamente.
NOTA: meus testes estavam em(emulador :) GalaxyNexus, NexusS, NexusOne e(dispositivos reais :) Samsung GalaxySL (2.3.6) e Nexus4 (4.4).
Se alguém puder me ajudar com essa situação feia. Desde já, obrigado.