23

我有一個帶有標籤的ViewPager + ActionBar。當我「滑動」到另一個選項卡時,我想讓軟鍵盤隱藏,但我無法弄清楚。以編程方式隱藏ViewPager.OnPageChangeListener onPageSelected()中的軟鍵盤?

我已經通過我的活動,以構造爲FragmentPageAdapter這樣我就可以調用

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

但它不會做任何事情(它是在代碼中的可達區域)...幫幫我?

+0

/*要隱藏軟鍵盤* 。/ \t 在一個行: '((InputMethodManager)getActivity()getSystemService(Context.INPUT_METHOD_SERVICE))hideSoftInputFromWindow(view.getWindowToken(),0);' – 2013-07-27 11:38:11

回答

35

在你的活動,你可以做到以下幾點:

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

謝謝,它的工作。我必須使用我的viewPager作爲視圖,並執行activity.getSystemService,但該過程已運行 – snotyak 2012-08-05 22:17:27

+1

In One Line: '((InputMethodManager)getActivity()。getSystemService(Context.INPUT_METHOD_SERVICE))。hideSoftInputFromWindow(view.getWindowToken(), 0);' – 2013-07-27 11:37:45

+2

您可以將視圖設置爲視圖分頁器,以便您可以在不查找視圖的情況下使用它:imm.hideSoftInputFromWindow(mViewPager.getWindowToken(),0); – TacoEater 2015-01-20 22:26:13

30

我不使用onPageSelected()因爲揮動動畫隱藏鍵盤動畫螺絲。而是使用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

更好的解決方案,沒有動畫故障。保護你! – azendh 2013-12-14 19:46:05

+1

這個答案比接受的答案要好。謝謝。 – Murat 2014-01-25 16:08:20

5

常用方式:

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

簡單的方法:

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

在我來說,我片段活動以下是工作的罰款。

((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: 這是我的片段的活性從該兩個片段(CommentFragment,AnotherFragment)在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; 
     }  
    } 

} 

正在打開如果鍵盤被在CommentFragment出現一個EditText和要切換到AnotherFragment並想在開關時隱藏鍵盤

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