読者です 読者をやめる 読者になる 読者になる

visible true

技術的なメモを書く

画面を開いた時にEditTextにフォーカスさせたくないのでBlockEditTextDefaultFocusLinearLayoutというViewを作った

Android EditText

画面を開いた時にEditTextにフォーカスさせたくない(キーボードを開かせたくない)という事で以下のアプローチを考えたがどれも上手くいかなかった。

  • EditTextを最初focusable=falseにしておく
    • focusable=trueにするタイミングが難しい
  • EditTextをfocusable=false, focusableInTouchMode=trueする
  • InputMethodManager.hideSoftInputFromWindow(IBinder, int)
    • こちらも呼び出しタイミングが難しい

あまり美しくない方法

EditTextにフォーカスを取らせない事が目的なので、他のViewを定義しそこにrequestFocusしてやればよいがこれでは意図が伝わりにくい。

<LinearLayout
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    >
  <EditText
    android:id="@+id/message_edit"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"/>
  <TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:focusable="true"
    android:focusableInTouchMode="true">
      <requestFocus />
  </TextView>

BlockEditTextDefaultFocusLinearLayout

仕方がないのでBlockEditTextDefaultFocusLinearLayoutを作った。継承するViewは必要に応じて変えていけばよい。今回はLinearLayout。

public class BlockEditTextDefaultFocusLinearLayout extends LinearLayout {

    public BlockEditTextDefaultFocusLinearLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
        setFocusable(true);
        setFocusableInTouchMode(true);
        requestFocus();
    }
}

こうなる。もっと良い命名があると思うけど大体通じるんじゃないかと思う。

<com.sys1yagi.android.views.BlockEditTextDefaultFocusLinearLayout
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    >

  <EditText
    android:id="@+id/message_edit"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"/>

おわりに

もっと良い方法あったら教えてください。

※追記 2015/08/21

android:windowSoftInputMode="stateAlwaysHidden"をAndroidManifest.xmlで書くといける!!ただしこの場合requestFocus()は無視されるのでFragmentの遷移とかである時はフォーカスしたいケースなどでは使えない。そういうケースはあんまりなさそうなのでよさそう。