23

Ho un ActionBar ViewPager + con schede. Voglio nascondere la tastiera morbida quando "scorro" su un'altra scheda, ma non riesco a capire come.Nascondi automaticamente la tastiera virtuale in ViewPager.OnPageChangeListener onPageSelected()?

ho passato nella mia attività al costruttore per la FragmentPageAdapter così posso chiamare

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

Ma non fa nulla (ed è in una zona raggiungibile del codice) ... Aiuto?

+0

/* Per nascondere la tastiera a sfioramento * ./\t in una sola riga: '(. (InputMethodManager) getActivity() getSystemService (Context.INPUT_METHOD_SERVICE)) hideSoftInputFromWindow (view.getWindowToken(), 0);' –

risposta

35

Nella vostra attività, è possibile effettuare le seguenti operazioni:

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

Grazie, ha funzionato. Ho dovuto usare viewPager come view e fare activity.getSystemService ma il processo ha funzionato – snotyak

+1

In One Line: '((InputMethodManager) getActivity(). GetSystemService (Context.INPUT_METHOD_SERVICE)). HideSoftInputFromWindow (view.getWindowToken(), 0); ' –

+2

è possibile impostare la vista sul pager della vista in modo da poterlo utilizzare senza trovare una vista: imm.hideSoftInputFromWindow (mViewPager.getWindowToken(), 0); – TacoEater

30

Non faccio uso di onPageSelected() perché le viti di animazione nascondere-tastiera con l'animazione strisciata. Invece utilizzare 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

Soluzione molto migliore, nessun problema di animazione. Grazie! – azendh

+1

Questa risposta è migliore della risposta accettata. Grazie. – Murat

5

modo comune:

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

modo semplice:

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

Nel mio caso per l'attività frammento segue sta lavorando bene.

((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) { 
    } 
}); 

UPDATE: Questa era la mia attività di frammento da cui due frammenti (CommentFragment, AnotherFragment) stanno aprendo in 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; 
     }  
    } 

} 

Se tastiera è appaiono per un EditText in CommentFragment e vogliono passare a AnotherFragment e si desidera nascondere la tastiera al momento dell'interruttore

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) { 
     } 
    }); 
}