画面を開いた時にEditTextにフォーカスさせたくないのでBlockEditTextDefaultFocusLinearLayoutというViewを作った
画面を開いた時に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の遷移とかである時はフォーカスしたいケースなどでは使えない。そういうケースはあんまりなさそうなのでよさそう。