2011-10-29 11 views
65

ViewPagerを使用していくつかのフラグメントに対応するFragmentActivityがあります。それぞれは、以下のレイアウトでListFragmentである:フラグメントの中からソフトキーボードを隠すには?

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"> 
    <LinearLayout 
     android:orientation="vertical" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:padding="8dp"> 
     <ListView android:id="@id/android:list" 
      android:layout_width="fill_parent" 
      android:layout_height="fill_parent" /> 

     <EditText android:id="@+id/entertext" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" /> 
    </LinearLayout> 
</LinearLayout> 

活動を開始すると、ソフトキーボードを示しています。この問題を解決するために、私は、フラグメント内で次のようでした:

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    //Save the container view so we can access the window token 
    viewContainer = container; 
    //get the input method manager service 
    imm = (InputMethodManager)getActivity().getSystemService(Context.INPUT_METHOD_SERVICE); 
    . . . 
} 

@Override 
public void onStart() { 
    super.onStart(); 

    //Hide the soft keyboard 
    imm.hideSoftInputFromWindow(viewContainer.getWindowToken(), 0); 
} 

私がメインの活動のためのウィンドウ・トークンにアクセスするための方法としてonCreateViewからの着信ViewGroup containerパラメータを保存します。これはエラーなく実行されますが、hideSoftInputFromWindowへの呼び出しからキーボードが隠されることはありません。onStart

はもともと、私が膨張したレイアウトの代わりcontainer、すなわち使用してみました:

imm.hideSoftInputFromWindow(myInflatedLayout.getWindowToken(), 0); 

をしかし、フラグメント自体は活動ではなく、独自のウィンドウ・トークンを持っていないと思われるので、これは、NullPointerExceptionを投げました?

フラグメント内からソフトキーボードを隠す方法はありますか、またはFragmentActivityにメソッドを作成してフラグメント内から呼び出す必要がありますか?

答えて

134

限り、あなたのフラグメントは、ビューを作成して、あなたはそれを持っている後にそのビューからIBinder(窓トークン)を使用することができます添付されています。たとえば、あなたがあなたのフラグメントでonActivityCreatedを上書きすることができます。

@Override 
public void onActivityCreated(Bundle savedInstanceState) { 
    super.onActivityCreated(savedInstanceState); 
    final InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE); 
    imm.hideSoftInputFromWindow(getView().getWindowToken(), 0); 
} 
+9

私はこれを私のプロジェクトに追加しました。しかし、別のタブをクリックすると、クラッシュしています。 –

+2

これを行い、NullPointerExceptionでクラッシュする人は、フラグメントonCreateViewメソッドの中でInputMethodManagerを使用してください。そうすることで、あなたはあなたのビューを持ち、imm.hideSoftInputFromWindow(view.getWindowToken()、0)に膨らませたビューを使って最後の行を変更することができます。 – Aurasphere

19

アクティビティのマニフェスト定義に次の属性を追加すると、アクティビティが開かれたときにキーボードがポップすることが完全に抑制されます。うまくいけば、このことができます:

(あなたの活動のマニフェスト定義に追加):

android:windowSoftInputMode="stateHidden" 
+0

おかげで、これをビューを使用して私のクラスに

View view; public void onCreate(View rootView) { view = rootView; 

を私のルートビューのインスタンスをキープ私がやったことです。しかし、キーボードの表示/非表示にインプットメソッドマネージャを使用する方法を知りたいのですが、アクティビティの開始後にいつでも使用する必要があるかもしれません。 – WilHall

+4

マニフェストにフラグメントを追加する方法 –

7

例外しかしDialogFragmentために、埋め込まれたDialogの焦点が隠されている必要があり、埋め込まれたDialog

this.getDialog().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN); 
+3

これは、DialogFragmentを持っている場合、keybordを非表示にする唯一の方法です。 –

+0

これはどこに書きますか? – 1911192110920

+1

私のために働く唯一のもの – skylla

56

ナッシング内だけではなく最初のEditTextが、次のコード行が私のために働いた:

+4

私のために働いた唯一のもの! – ToddH

+0

'SOFT_INPUT_STATE_HIDDEN'も私のために働いていましたが、' SOFT_INPUT_STATE_ALWAYS_HIDDEN 'との違いは分かりません。 – hBrent

+0

THanks bro、これは私のために働いた! :) –

11
@Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 
     View rootView = inflater.inflate(R.layout.fragment_my, container, 
       false); 
     someClass.onCreate(rootView); 
     return rootView; 
    } 

この規範にFragemnt作業中にキーボードを非表示にするには、

public void removePhoneKeypad() { 
    InputMethodManager inputManager = (InputMethodManager) view 
      .getContext() 
      .getSystemService(Context.INPUT_METHOD_SERVICE); 

    IBinder binder = view.getWindowToken(); 
    inputManager.hideSoftInputFromWindow(binder, 
      InputMethodManager.HIDE_NOT_ALWAYS); 
} 
+0

私はこれを使用しましたが、ビューのインスタンスを保持するのではなく、フラグメントからgetView()を使用しました。 – MrEngineer13

+0

onCreateはFragmentの外のクラスです。したがって、このクラスのphoneKeyPadを削除するためには、それをrootViewに渡します。私は彼らがフラグメント内のクラスではなくフラグメント内からそれを望んでいたと考えます。 –

1

getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN); 
関連する問題