2018年12月6日
プログラミング
【React Native】キーボードで画面が隠れる場合の対処法
はじめに
新しい技術にチャレンジし続けるeishisのアドベントカレンダーDay6です!
昨日は、RucksackというCSSライブラリを使ってレスポンシブタイポグラフィーを実装する方法についての記事でした。
今回は、React Nativeで TextInput
コンポーネントにフォーカスされたとき、ソフトウェアキーボードで画面が隠れてしまうのを防ぐ方法をご紹介します。
サンプルコードのReact Nativeのバージョンは 0.57.7です。
画面がキーボードで隠れてしまう状態とは
まずは下記のgif画像をご覧ください。
今回は、このように画面の中央に TextInput
があり、画面下部に決定ボタンがあるレイアウトで説明していきたいと思います。
こちらの画面のコードは以下になります。
(キーボードの表示部分に関わらないスタイルは省略しています)
<View style={{ flex: 1 }}>
<View style={{ height: 100 }}>
<Text>Header</Text>
</View>
<View style={{ flex: 1 }} >
<TextInput />
</View>
<TouchableOpacity style={{ height: 60 }}>
<Text>Submit</Text>
</TouchableOpacity>
</View>
ヘッダーと下部のボタンは高さ固定です。
TextInput
がある中央の要素には flex
プロパティを指定しており、高さが可変になっています。
このままだと、gif画像のように TextInput
にフォーカスがあたったときに決定ボタンがキーボードで隠れてしまいます。
キーボードが表示された状態でも決定ボタンを隠さずに見せたいですよね。
それでは、キーボードが表示された状態でも決定ボタンが見えるようにする方法をご紹介します。
KeyboardAvoidingViewを使ってキーボードを避ける
React Nativeでキーボードによって画面が隠れるのを防ぐには、 KeyboardAvoidingView
というコンポーネントを利用します。
https://facebook.github.io/react-native/docs/keyboardavoidingview
この KeyboardAvoidingView
でキーボードによって隠れるのを避けたい要素を囲うだけです。
実際にコードを見てみましょう。
<KeyboardAvoidingView style={{ flex: 1 }} behavior="padding">
<View style={{ height: 100 }}>
<Text>Header</Text>
</View>
<View style={{ flex: 1 }} >
<TextInput />
</View>
<TouchableOpacity style={{ height: 60 }}>
<Text>Submit</Text>
</TouchableOpacity>
</View>
ここでポイントになるのが、 behavior propsのプロパティです。
このプロパティの設定によって、キーボードを避ける際の動きが変わります。
behavior
のプロパティに指定できるのは、以下の3つです。
- padding
- height
- position
それでは、それぞれプロパティを設定したときにどんな動きをするようになるのか、ご紹介します。
padding・height を設定した場合
behavior
にpadding・heightを設定した場合は、以下のような動きになります。
flex
を指定した真ん中の要素が、キーボードの出現に合わせて伸縮するようになりました。
POINT!!
-
paddingとheightを指定した際に大きな違いはありません。
heightを指定すると、Androidの場合はキーボードが非表示になってもキーボードの高さが空いたままになります。(iOSも少し前のバージョンまでは同じ挙動だったので、今後Androidも変更されるかもしれません) -
中身のコンテンツ全てに
height
を指定すると、キーボードが表示されても中身の要素は伸縮されません。
flex
を指定した要素のみが伸縮するようになる、ということに気をつけてください。
それでは次に、positionを設定した場合について見ていきましょう。
positionを設定した場合
behavior
にpositionを設定する場合は、 contentContainerStyle
propsの設定もする必要があります。
<KeyboardAvoidingView
style={{ flex: 1 }}
behavior="position"
contentContainerStyle={{ flex: 1 }}
>
(省略)
</KeyboardAvoidingView>
behavior
にpositionを設定すると、 KeyboardAvoidingView
の中身が View
コンポーネントで囲われるようになります。
contentContainerStyle
propsには、その View
に対するスタイルを指定します。
flex
か height
を指定しないと、中身が潰れて見えなくなってしまうので注意が必要です。
この場合の挙動は以下のようになります。
padding・heightを指定したときとは違い、画面全体が上に押し上げられていますよね。
細かいスタイルを指定したいときなどは、 behavior
にpositionを設定すると良いと思います。
まとめ
以上が KeyboardAvoidingView
というコンポーネントを使用して、キーボードで画面が隠れるのを防ぐ方法でした。
キーボードで画面が隠れてしまって困っているときには、ぜひこの記事を参考に対応してみてください。
React Nativeのお仕事に関するご相談
Bageleeの運営会社、palanではReact Nativeに関するお仕事のご相談を無料で承っております。
zoomなどのオンラインミーティング、お電話、貴社への訪問、いずれも可能です。
ぜひお気軽にご相談ください。
この記事は
参考になりましたか?
5
2
関連記事
2021年8月30日
React Navigation 6.0のStack Navigatorの大きく変わった箇所の変更点をまとめてみた
2021年1月4日
react-native-svgを使ってReact NativeでSVGを扱う
2019年12月23日
Expo Bare Workflow で Firebase Analytics を設定する
2018年12月6日
【React Native】キーボードで画面が隠れる場合の対処法
2018年7月13日
TypeScriptでReact Native開発をする方法2018年最新版
2018年6月29日
React Navigationのタブナビゲーションをカスタマイズしてみよう!
簡単に自分で作れるWebAR
「palanAR」はオンラインで簡単に作れるWebAR作成ツールです。WebARとはアプリを使用せずに、Webサイト上でARを体験できる新しい技術です。
palanARへpalanでは一緒に働く仲間を募集しています
正社員や業務委託、アルバイトやインターンなど雇用形態にこだわらず、
ベテランの方から業界未経験の方まで様々なかたのお力をお借りしたいと考えております。
運営メンバー
Eishi Saito 総務
SIerやスタートアップ、フリーランスを経て2016年11月にpalan(旧eishis)を設立。 マーケター・ディレクター・エンジニアなど何でも屋。 COBOLからReactまで色んなことやります。
sasakki デザイナー
アメリカの大学を卒業後、日本、シンガポールでデザイナーとして活動。
やまかわたかし デザイナー
フロントエンドデザイナー。デザインからHTML / CSS、JSの実装を担当しています。最近はReactやReact Nativeをよく触っています。
Sayaka Osanai デザイナー
Sketchだいすきプロダクトデザイナー。シンプルだけどちょっとかわいいデザインが得意。 好きな食べものは生ハムとお寿司とカレーです。
はらた エンジニア
サーバーサイドエンジニア Ruby on Railsを使った開発を行なっています
こぼり ともろう エンジニア
サーバーサイドエンジニア。SIerを経て2019年7月に入社。日々学習しながらRuby on Railsを使った開発を行っています。
ささい エンジニア
フロントエンドエンジニア WebGLとReactが強みと言えるように頑張ってます。
Damien
WebAR/VRの企画・開発をやっています。森に住んでいます。
ゲスト bagelee
かっきー
まりな
suzuki
miyagi
ogawa
雑食デザイナー。UI/UXデザインやコーディング、時々フロントエンドやってます。最近はARも。
いわもと
デザイナーをしています。 好きな食べ物はラーメンです。
taishi kobari
フロントエンドの開発を主に担当してます。Blitz.js好きです。
kubota shogo
サーバーサイドエンジニア。Ruby on Railsを使った開発を行いつつ月500kmほど走っています!
nishi tomoya
aihara
グラフィックデザイナーから、フロントエンドエンジニアになりました。最近はWebAR/VRの開発や、Blender、Unityを触っています。モノづくりとワンコが好きです。
nagao
SIerを経てアプリのエンジニアに。xR業界に興味があり、unityを使って開発をしたりしています。
Kainuma
サーバーサイドエンジニア Ruby on Railsを使った開発を行なっています
sugimoto
asama
ando
iwasawa ayane
yoko oshimo
異業界からやってきたデザイナー。palanARのUIをメインに担当してます。これからたくさん吸収していきます!