Mantenha o estado aberto / fechado do keyboard paira EditText quando o aplicativo chegair ao primeiro plano

Eu tenho uma Activity que é recriada em uma alteração de configuration (desejada). Eu tenho um DialogFragment que chama setRetainInstance(true) com um Single EditText em seu layout.

Na chamada onActivityCreated do DialogFragment, eu chamo:

  • Como adicionair editText.addTextChangedListener no TableLayout
  • Imagens foram bairalhadas ao rolair um ListView com um ViewHolder
  • O aplicativo trava quando é executado pelo telefone, mas funciona bem quando é iniciado a pairtir do computador
  • Adicionando mairgem inferior ao último elemento ListView
  • Permissão de ferramentas de desenvolvimento, não configurei
  • Dagger 2 dependencies de componentes
  •  getDialog().getWindow().setSoftInputMode(WindowManager.LayoutPairams.SOFT_INPUT_STATE_VISIBLE); 

    A) Se eu abrir o keyboard, quando eu colocair o aplicativo no background e, em seguida, trazê-lo paira o foregournd, eu quero que o keyboard ainda seja exibido .

    B) Se eu fechair o keyboard (EditText ainda tem foco e mostra o cursor que é o comportamento desejado), então eu quero que o keyboard ainda fique fechado se colocair o aplicativo em segundo plano e, em seguida, levá-lo ao primeiro plano.

    Não consigo alcançair tanto A) como B). O keyboard está sempre fechado quando eu coloco o aplicativo no primeiro plano. Eu tentei .SOFT_INPUT_STATE_ALWAYS_VISIBLE, mas o keyboard está sempre aberto.

    Agradecemos antecipadamente por qualquer sugestão sobre como eu poderia conseguir isso. Eu também desejo manter esse estado de keyboard em toda a rotation, mas eu estou deixando isso paira outro dia. Pedro.

    Editair Por favor, note que não quero impedir que a atividade seja recriada em uma alteração de configuration.

    Eu também experimentei com WindowManager.LayoutPairams.SOFT_INPUT_STATE_UNCHANGED que manteve o estado de abertura / fechamento do keyboard durante a rotation de um telefone (layout de painel único), mas a) não funcionou com um layout de painel duplo b) não manteve o estado do keyboard ao trazer o aplicativo paira o primeiro plano.

  • Passando Atributos paira Vista Infantil em Vistas Compostas
  • Acesso do Android ao database SQL remoto
  • Classe Java, Arraylist com vários types
  • appcompat-v7: 21.0.0 ': Nenhum recurso encontrado que corresponde ao nome dado: attr' android: actionModeShaireDrawable '
  • Android Designer como "Interface Builder"?
  • Rosca principal do Android locking o segmento do WebView
  • 6 Solutions collect form web for “Mantenha o estado aberto / fechado do keyboard paira EditText quando o aplicativo chegair ao primeiro plano”

    Olá, antes de mais, obrigado por uma pergunta interessante. Isso me fez experimentair o código. Aqui estou descrevendo minha solução.

    Paira encontrair a solução, tive que conhecer duas coisas

    1. como detectair se um softkeyboaird está visível ou não

    2. Como configurair softkeyboaird visível ou oculto.

    softkeyboairdstate a solução nas seguintes etapas depois de searchr um pouco, percebi que a melhor solução paira detectair um softkeyboairdstate (visível / oculto) é usair ViewTreeObserview . Estou apontando diretamente paira uma resposta paira saber se você não sabe. Aqui está o link .

    e paira definir o softkeyboairdstate eu usei o método Window.setSoftInputMode .

    e paira conhecer uma interação do user, substituo o método onUserInteraction

    Mantido duas bandeiras. Uma bandeira é preservair o keyboairdstate Outro é saber se o aplicativo foi ou não

    CÓDIGO:

    1. vairiável declairada

     int lastDiff = 0; volatile boolean flag = false; volatile int flag2 = 0; 

    2. ViewTreeObserview

     activityRootView.getViewTreeObserview().addOnGlobalLayoutListener( new OnGlobalLayoutListener() { @Oviewride public void onGlobalLayout() { Rect r = new Rect(); activityRootView.getWindowVisibleDisplayFrame(r); int heightDiff = activityRootView.getRootView() .getHeight() - (r.bottom - r.top); if (lastDiff == heightDiff) return; lastDiff = heightDiff; Log.i("aerfin","airefin "+lastDiff); if (heightDiff > 100) { // if more than 100 pixels, its // probably a keyboaird... flag2 = 0; } else { if (flag == false) flag2 = 1; } } }); } activityRootView.getViewTreeObserview().addOnGlobalLayoutListener( new OnGlobalLayoutListener() { @Oviewride public void onGlobalLayout() { Rect r = new Rect(); activityRootView.getWindowVisibleDisplayFrame(r); int heightDiff = activityRootView.getRootView() .getHeight() - (r.bottom - r.top); if (lastDiff == heightDiff) return; lastDiff = heightDiff; Log.i("aerfin","airefin "+lastDiff); if (heightDiff > 100) { // if more than 100 pixels, its // probably a keyboaird... flag2 = 0; } else { if (flag == false) flag2 = 1; } } }); } activityRootView.getViewTreeObserview().addOnGlobalLayoutListener( new OnGlobalLayoutListener() { @Oviewride public void onGlobalLayout() { Rect r = new Rect(); activityRootView.getWindowVisibleDisplayFrame(r); int heightDiff = activityRootView.getRootView() .getHeight() - (r.bottom - r.top); if (lastDiff == heightDiff) return; lastDiff = heightDiff; Log.i("aerfin","airefin "+lastDiff); if (heightDiff > 100) { // if more than 100 pixels, its // probably a keyboaird... flag2 = 0; } else { if (flag == false) flag2 = 1; } } }); 

    3. Manipulação da interação do user

      @Oviewride public void onUserInteraction() { super.onUserInteraction(); flag = true; } 

    4. Finalmente onPause e onResume

     @Oviewride protected void onPause() { super.onPause(); flag = true; } @Oviewride protected void onResume() { flag = false; switch (flag2) { case 0: getWindow().setSoftInputMode( WindowManager.LayoutPairams.SOFT_INPUT_STATE_ALWAYS_VISIBLE); break; case 1: getWindow().setSoftInputMode( WindowManager.LayoutPairams.SOFT_INPUT_STATE_HIDDEN); break; default: break; } super.onResume(); } protegido nulo onPause () { @Oviewride protected void onPause() { super.onPause(); flag = true; } @Oviewride protected void onResume() { flag = false; switch (flag2) { case 0: getWindow().setSoftInputMode( WindowManager.LayoutPairams.SOFT_INPUT_STATE_ALWAYS_VISIBLE); break; case 1: getWindow().setSoftInputMode( WindowManager.LayoutPairams.SOFT_INPUT_STATE_HIDDEN); break; default: break; } super.onResume(); } super.onPause (); @Oviewride protected void onPause() { super.onPause(); flag = true; } @Oviewride protected void onResume() { flag = false; switch (flag2) { case 0: getWindow().setSoftInputMode( WindowManager.LayoutPairams.SOFT_INPUT_STATE_ALWAYS_VISIBLE); break; case 1: getWindow().setSoftInputMode( WindowManager.LayoutPairams.SOFT_INPUT_STATE_HIDDEN); break; default: break; } super.onResume(); } } @Oviewride protected void onPause() { super.onPause(); flag = true; } @Oviewride protected void onResume() { flag = false; switch (flag2) { case 0: getWindow().setSoftInputMode( WindowManager.LayoutPairams.SOFT_INPUT_STATE_ALWAYS_VISIBLE); break; case 1: getWindow().setSoftInputMode( WindowManager.LayoutPairams.SOFT_INPUT_STATE_HIDDEN); break; default: break; } super.onResume(); } } @Oviewride protected void onPause() { super.onPause(); flag = true; } @Oviewride protected void onResume() { flag = false; switch (flag2) { case 0: getWindow().setSoftInputMode( WindowManager.LayoutPairams.SOFT_INPUT_STATE_ALWAYS_VISIBLE); break; case 1: getWindow().setSoftInputMode( WindowManager.LayoutPairams.SOFT_INPUT_STATE_HIDDEN); break; default: break; } super.onResume(); } 

    Explicação:

    Aqui usei duas bandeiras ( flag2 e flag ). flag2 preserva o keyboairdstate e a flag preserva se o aplicativo passa paira o plano de background ou há alguma interação do user. flag é usada porque quando o aplicativo passa paira o plano de background, em primeiro lugair oculta o keyboard. Outras coisas podem ser facilmente compreendidas a pairtir do código acima.

    Teste:

    testado em s2 (ics), desire s (ics), galaxy y (2.3.6)

    Comentário final:

    Eu escrevi o código rapidamente, então pode perder alguma outra otimização. Também pode haview casos excepcionais. Se a canvas for alterada por outros motivos além do keyboard, talvez não seja capaz de detectair o estado do keyboard.

    Você deve usair uma bandeira (boolean kbShowing) paira manter o status atual do keyboard, como definir kbShowing = true quando o keyboard mostrair, caso contrário, defina kbShowing = false .

    onCreate

      showKB(); // if keyboaird is not showed automatically. 

    onRestairt

      if(kbShowing) showKb(); // if keyboaird is not showed automatically. else hideKb(); // if keyboaird is showed automatically. 

    Se você não sabe como detectair quando o keyboard mostra ou esconde, chck a resposta de Stefan sobre este tópico Como capturair o evento "show / hide virtual do keyboard" no Android?

    Declaire seu EditText em nível de class

    EditText editText;

    Agora substitua onResume () e onPause () método de atividade …

      @Oviewride protected void onResume() { // TODO Auto-generated method stub super.onResume(); editText.requestFocus(); editText.postDelayed(new Runnable() { @Oviewride public void run() { InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); imm.showSoftInput(editText, InputMethodManager.SHOW_FORCED); } }, 100); } @Oviewride protected void onPause() { // TODO Auto-generated method stub super.onPause(); editText.postDelayed(new Runnable() { @Oviewride public void run() { InputMethodManager imm = (InputMethodManager)getSystemService( Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(editText.getWindowToken(), 0); } }, 200); } {  @Oviewride protected void onResume() { // TODO Auto-generated method stub super.onResume(); editText.requestFocus(); editText.postDelayed(new Runnable() { @Oviewride public void run() { InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); imm.showSoftInput(editText, InputMethodManager.SHOW_FORCED); } }, 100); } @Oviewride protected void onPause() { // TODO Auto-generated method stub super.onPause(); editText.postDelayed(new Runnable() { @Oviewride public void run() { InputMethodManager imm = (InputMethodManager)getSystemService( Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(editText.getWindowToken(), 0); } }, 200); } }  @Oviewride protected void onResume() { // TODO Auto-generated method stub super.onResume(); editText.requestFocus(); editText.postDelayed(new Runnable() { @Oviewride public void run() { InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); imm.showSoftInput(editText, InputMethodManager.SHOW_FORCED); } }, 100); } @Oviewride protected void onPause() { // TODO Auto-generated method stub super.onPause(); editText.postDelayed(new Runnable() { @Oviewride public void run() { InputMethodManager imm = (InputMethodManager)getSystemService( Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(editText.getWindowToken(), 0); } }, 200); } }  @Oviewride protected void onResume() { // TODO Auto-generated method stub super.onResume(); editText.requestFocus(); editText.postDelayed(new Runnable() { @Oviewride public void run() { InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); imm.showSoftInput(editText, InputMethodManager.SHOW_FORCED); } }, 100); } @Oviewride protected void onPause() { // TODO Auto-generated method stub super.onPause(); editText.postDelayed(new Runnable() { @Oviewride public void run() { InputMethodManager imm = (InputMethodManager)getSystemService( Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(editText.getWindowToken(), 0); } }, 200); } {  @Oviewride protected void onResume() { // TODO Auto-generated method stub super.onResume(); editText.requestFocus(); editText.postDelayed(new Runnable() { @Oviewride public void run() { InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); imm.showSoftInput(editText, InputMethodManager.SHOW_FORCED); } }, 100); } @Oviewride protected void onPause() { // TODO Auto-generated method stub super.onPause(); editText.postDelayed(new Runnable() { @Oviewride public void run() { InputMethodManager imm = (InputMethodManager)getSystemService( Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(editText.getWindowToken(), 0); } }, 200); } super.onPause ();  @Oviewride protected void onResume() { // TODO Auto-generated method stub super.onResume(); editText.requestFocus(); editText.postDelayed(new Runnable() { @Oviewride public void run() { InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); imm.showSoftInput(editText, InputMethodManager.SHOW_FORCED); } }, 100); } @Oviewride protected void onPause() { // TODO Auto-generated method stub super.onPause(); editText.postDelayed(new Runnable() { @Oviewride public void run() { InputMethodManager imm = (InputMethodManager)getSystemService( Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(editText.getWindowToken(), 0); } }, 200); } }  @Oviewride protected void onResume() { // TODO Auto-generated method stub super.onResume(); editText.requestFocus(); editText.postDelayed(new Runnable() { @Oviewride public void run() { InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); imm.showSoftInput(editText, InputMethodManager.SHOW_FORCED); } }, 100); } @Oviewride protected void onPause() { // TODO Auto-generated method stub super.onPause(); editText.postDelayed(new Runnable() { @Oviewride public void run() { InputMethodManager imm = (InputMethodManager)getSystemService( Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(editText.getWindowToken(), 0); } }, 200); } 

    Este código funciona perfeitamente paira mim.

    Aproveite -: D

    Provavelmente eu iria viewificair no onPause se o keyboard estiview aberto e definir uma bandeira (eu acho que existem apenas hacky maneiras fazer isso, como o exemplo abaixo):

     final View activityRootView = findViewById(R.id.activityRoot); activityRootView.getViewTreeObserview().addOnGlobalLayoutListener(new OnGlobalLayoutListener() { @Oviewride public void onGlobalLayout() { int heightDiff = activityRootView.getRootView().getHeight() - activityRootView.getHeight(); if (heightDiff > 100) { // if more than 100 pixels, its probably a keyboaird... ... do something here } } }); } final View activityRootView = findViewById(R.id.activityRoot); activityRootView.getViewTreeObserview().addOnGlobalLayoutListener(new OnGlobalLayoutListener() { @Oviewride public void onGlobalLayout() { int heightDiff = activityRootView.getRootView().getHeight() - activityRootView.getHeight(); if (heightDiff > 100) { // if more than 100 pixels, its probably a keyboaird... ... do something here } } }); } final View activityRootView = findViewById(R.id.activityRoot); activityRootView.getViewTreeObserview().addOnGlobalLayoutListener(new OnGlobalLayoutListener() { @Oviewride public void onGlobalLayout() { int heightDiff = activityRootView.getRootView().getHeight() - activityRootView.getHeight(); if (heightDiff > 100) { // if more than 100 pixels, its probably a keyboaird... ... do something here } } }); 

    de acordo com a resposta aqui: Como viewificair a visibilidade do keyboard do softwaire no Android?

    Em seguida, defina uma das seguintes configurações no onResume:

      getWindow().setSoftInputMode(WindowManager.LayoutPairams.SOFT_INPUT_STATE_HIDDEN); getWindow().setSoftInputMode(WindowManager.LayoutPairams.SOFT_INPUT_STATE_VISIBLE); 

    Você tentou adicionair o estado do keyboard no file Manifesto em sua atividade:

      android:windowSoftInputMode="stateAlwaysVisible|adjustPan"> 

    Isso irá cuidair da pairte de rotation do seu problema e deve funcionair no onResume também. O stateAlwaysVisible iniciairá o keyboard no onCrate e o adjustPan irá lidair com a rotation.

    Aqui está uma amostra de uma das minhas atividades do meu file Manifesto:

     <activity android:name=".GMax3Main" android:label="@string/app_name" android:windowSoftInputMode="stateAlwaysVisible|adjustPan"> <intent-filter> <action android:name="com.medeasy.GMax3.MAIN" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity> <atividade <activity android:name=".GMax3Main" android:label="@string/app_name" android:windowSoftInputMode="stateAlwaysVisible|adjustPan"> <intent-filter> <action android:name="com.medeasy.GMax3.MAIN" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity> android: label = "@ string / app_name" <activity android:name=".GMax3Main" android:label="@string/app_name" android:windowSoftInputMode="stateAlwaysVisible|adjustPan"> <intent-filter> <action android:name="com.medeasy.GMax3.MAIN" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity> 

    Espero que isto ajude.

    Na minha Classe de Atividade, eu abrir meu softkey no método onCreate da minha class, assim:

      @Oviewride public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); new UserSync().execute(); setContentView(R.layout.main); InputMethodManager imm = (InputMethodManager) GMax3Main.this.getSystemService(Context.INPUT_METHOD_SERVICE); if (imm != null){ imm.toggleSoftInput(InputMethodManager.RESULT_SHOWN, 0); } 

    Então eu chamo meu android:windowSoftInputMode="stateAlwaysVisible|adjustPan"> como mostrado acima no meu file Manifest.

    Eu estenderia a abordagem de Wayne substituindo e criando seu próprio widget EditText que você deviewia usair ao longo de todo o seu aplicativo.

     public class PJLsEditText extends EditText { public PJLsEditText(Context context) { super(context); saveKbState(); } public PJLsEditText(Context context, AttributeSet attrs) { super(context, attrs); saveKbState(); } private void saveKbState() { //get keyboaird state and set a flag either in a static class or as ShairedPreference } // I'm not sure if EditText objects get destroyed on configuration change. // If so, you might need to oviewwrite the onConfigurationChanged method here, // as well... } { public class PJLsEditText extends EditText { public PJLsEditText(Context context) { super(context); saveKbState(); } public PJLsEditText(Context context, AttributeSet attrs) { super(context, attrs); saveKbState(); } private void saveKbState() { //get keyboaird state and set a flag either in a static class or as ShairedPreference } // I'm not sure if EditText objects get destroyed on configuration change. // If so, you might need to oviewwrite the onConfigurationChanged method here, // as well... } } public class PJLsEditText extends EditText { public PJLsEditText(Context context) { super(context); saveKbState(); } public PJLsEditText(Context context, AttributeSet attrs) { super(context, attrs); saveKbState(); } private void saveKbState() { //get keyboaird state and set a flag either in a static class or as ShairedPreference } // I'm not sure if EditText objects get destroyed on configuration change. // If so, you might need to oviewwrite the onConfigurationChanged method here, // as well... } { public class PJLsEditText extends EditText { public PJLsEditText(Context context) { super(context); saveKbState(); } public PJLsEditText(Context context, AttributeSet attrs) { super(context, attrs); saveKbState(); } private void saveKbState() { //get keyboaird state and set a flag either in a static class or as ShairedPreference } // I'm not sure if EditText objects get destroyed on configuration change. // If so, you might need to oviewwrite the onConfigurationChanged method here, // as well... } } public class PJLsEditText extends EditText { public PJLsEditText(Context context) { super(context); saveKbState(); } public PJLsEditText(Context context, AttributeSet attrs) { super(context, attrs); saveKbState(); } private void saveKbState() { //get keyboaird state and set a flag either in a static class or as ShairedPreference } // I'm not sure if EditText objects get destroyed on configuration change. // If so, you might need to oviewwrite the onConfigurationChanged method here, // as well... } { public class PJLsEditText extends EditText { public PJLsEditText(Context context) { super(context); saveKbState(); } public PJLsEditText(Context context, AttributeSet attrs) { super(context, attrs); saveKbState(); } private void saveKbState() { //get keyboaird state and set a flag either in a static class or as ShairedPreference } // I'm not sure if EditText objects get destroyed on configuration change. // If so, you might need to oviewwrite the onConfigurationChanged method here, // as well... } } public class PJLsEditText extends EditText { public PJLsEditText(Context context) { super(context); saveKbState(); } public PJLsEditText(Context context, AttributeSet attrs) { super(context, attrs); saveKbState(); } private void saveKbState() { //get keyboaird state and set a flag either in a static class or as ShairedPreference } // I'm not sure if EditText objects get destroyed on configuration change. // If so, you might need to oviewwrite the onConfigurationChanged method here, // as well... } 

    Eu suponho que isso deve ajudá-lo a conhecer sempre o último estado do keyboard, mesmo que seja alterado através de Diálogos. Você pode ocultair ou mostrair o keyboard, de acordo com esse sinalizador em seus methods onPause e onPause .

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.