23

Tengo una ViewPager + ActionBar con pestañas. Quiero ocultar el teclado suave cuando "deslizo" a otra pestaña, pero no puedo entender cómo.Ocultar software de forma programada en ViewPager.OnPageChangeListener onPageSelected()?

he pasado en mi actividad para el constructor de la FragmentPageAdapter para que pueda llamar

activity.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN); 

Pero no hace nada (y es alcanzable en un área del código) ... ¿ayuda?

+0

/* To Hide Soft Keyboard * ./\t en una sola línea: '(. (InputMethodManager) getActivity() getSystemService (Context.INPUT_METHOD_SERVICE)) hideSoftInputFromWindow (view.getWindowToken(), 0);' –

Respuesta

35

En su actividad, puede hacer lo siguiente:

mViewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() { 
    @Override 
    public void onPageSelected(int position) { 
     final InputMethodManager imm = (InputMethodManager)getSystemService(
      Context.INPUT_METHOD_SERVICE); 
     imm.hideSoftInputFromWindow(mView.getWindowToken(), 0); 
    } 

    @Override 
    public void onPageScrolled(int position, float offset, int offsetPixels) { 
    } 

    @Override 
    public void onPageScrollStateChanged(int state) { 
    } 
}); 
+5

Gracias, funcionó. Tuve que usar mi viewPager como la vista y hacer activity.getSystemService pero el proceso funcionó – snotyak

+1

en una línea: '((InputMethodManager) getActivity(). GetSystemService (Context.INPUT_METHOD_SERVICE)). HideSoftInputFromWindow (view.getWindowToken(), 0); ' –

+2

puede configurar la vista en el buscapersonas para que pueda usarla sin encontrar una vista: imm.hideSoftInputFromWindow (mViewPager.getWindowToken(), 0); – TacoEater

30

No consumo onPageSelected() porque los tornillos de animación ocultar-teclado con la animación de deslizar. En su lugar utilizar onPageScrollStateChanged():

@Override 
public void onPageScrollStateChanged(int state) 
{ 
    if (state == ViewPager.SCROLL_STATE_IDLE) 
    { 
     if (mViewPager.getCurrentItem() == 0) 
     { 
      // Hide the keyboard. 
      ((InputMethodManager)getSystemService(INPUT_METHOD_SERVICE)) 
       .hideSoftInputFromWindow(mViewPager.getWindowToken(), 0); 
     } 
    } 
} 
+2

Solución mucho mejor, sin problemas de animación. ¡Gracias! – azendh

+1

Esta respuesta es mejor que la respuesta aceptada. Gracias. – Murat

5

La manera más común:

private void hideVirturalKeyboard(){ 
View v = getCurrentFocus(); 
if (v != null && v instanceof EditText) { 
InputMethodManager mgr = (InputMethodManager)(v.getContext().getSystemService(Context.INPUT_METHOD_SERVIC 
E)); 
mgr.hideSoftInputFromWindow(v.getWindowToken(), 0); 
} 
} 
1

manera simple:

InputMethodManager imm = (InputMethodManager)  
getSystemService(Context.INPUT_METHOD_SERVICE); 
imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0); 
1

En mi caso para la actividad fragmento está trabajando muy bien lo siguiente.

((CommentActivity)getActivity()).pager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() { 
    @Override 
    public void onPageSelected(int position) { 
     final InputMethodManager imm = (InputMethodManager)getActivity().getSystemService(Context.INPUT_METHOD_SERVICE); 
     imm.hideSoftInputFromWindow(txtComment.getWindowToken(), 0); 
    } 

    @Override 
    public void onPageScrolled(int position, float offset, int offsetPixels) { 
    } 

    @Override 
    public void onPageScrollStateChanged(int state) { 
    } 
}); 

ACTUALIZACIÓN: Esta fue mi actividad fragmento de la cual dos fragmentos (CommentFragment, AnotherFragment) están abriendo en un ViewPager

public class CommentActivity extends FragmentActivity { 
    ViewPager pager; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     pager = (ViewPager) findViewById(R.id.viewPager); 
     ....... 
     ....... 
    } 

    private class MyPagerAdapter extends FragmentPagerAdapter { 

     public MyPagerAdapter(FragmentManager fm) { 
      super(fm); 
     } 

     @Override 
     public Fragment getItem(int pos) { 
      switch(pos) { 
       case 0: return CommentFragment.newInstance(); 
       default: return AnotherFragment.newInstance(); 
      } 
     } 

     @Override 
     public int getCount() { 
      return 2; 
     }  
    } 

} 

Si se parece teclado para un EditarTexto en CommentFragment y quieren cambiar a AnotherFragment y desea ocultar el teclado en el momento del cambio

public class CommentFragment extends Fragment { 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     ......... 
     ......... 
     ......... 
     ((CommentActivity)getActivity()).pager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() { 

     @Override 
     public void onPageSelected(int position) { 
      final InputMethodManager imm = (InputMethodManager)getActivity().getSystemService(Context.INPUT_METHOD_SERVICE); 
      imm.hideSoftInputFromWindow(txtComment.getWindowToken(), 0); 
     } 

     @Override 
     public void onPageScrolled(int position, float offset, int offsetPixels) { 
     } 

     @Override 
     public void onPageScrollStateChanged(int state) { 
     } 
    }); 
} 
Cuestiones relacionadas