RORK LABEN
MAX — Rork MaxはネイティブSwiftアプリを生成し、iPhone・iPad・Apple Watch・Apple TV・Vision Pro・iMessageに対応しますNATIVE — Rork MaxはAR/LiDARスキャン、Metalの3D、ウィジェット、Live Activities、HealthKitなどネイティブ機能を解放しますFUNDING — Rorkはa16zから280万ドルを調達し、月間訪問は74万を超え、成長率は85%に達していますRN — 通常のRorkはReact Native(Expo)でiOSとAndroidアプリをまとめて生成しますFOCUS — Rorkはネイティブモバイルアプリ専業で、Web中心のBoltやLovableと一線を画しますPRICING — 無料で始められ、有料プランは月25ドルから、Rork Maxは月200ドルで2クリックのApp Store公開に対応しますMAX — Rork MaxはネイティブSwiftアプリを生成し、iPhone・iPad・Apple Watch・Apple TV・Vision Pro・iMessageに対応しますNATIVE — Rork MaxはAR/LiDARスキャン、Metalの3D、ウィジェット、Live Activities、HealthKitなどネイティブ機能を解放しますFUNDING — Rorkはa16zから280万ドルを調達し、月間訪問は74万を超え、成長率は85%に達していますRN — 通常のRorkはReact Native(Expo)でiOSとAndroidアプリをまとめて生成しますFOCUS — Rorkはネイティブモバイルアプリ専業で、Web中心のBoltやLovableと一線を画しますPRICING — 無料で始められ、有料プランは月25ドルから、Rork Maxは月200ドルで2クリックのApp Store公開に対応します
記事一覧/開発ツール
開発ツール/2026-06-29上級

Rork のテキスト入力にキーボード上のツールバーを足す — iOS の InputAccessoryView と Android の自前バーを1つの部品に揃える

Rork が生成した React Native アプリのテキスト入力に、キーボードの上へ固定する「完了」やクイック挿入ボタンのツールバーを足す方法です。iOS の InputAccessoryView と、Android で自前に組むバーを、1つの再利用コンポーネントへ畳む実装を実コードで残します。

Rork476React Native191InputAccessoryViewキーボード2Expo124

プレミアム記事

「入力欄の上に『完了』ボタンを1つ置くだけ」のつもりで始めた作業が、iOS と Android で別物の実装になり、半日溶けたことがあります。私自身、2014 年から個人開発でアプリを出していて、壁紙や癒し系のアプリにユーザーがメモやひとことを書ける欄を足したのがきっかけでした。iOS では InputAccessoryView という専用部品があっさり動くのに、同じコードを Android で走らせると、ツールバーが影も形も出てこないのです。

公式ドキュメントの InputAccessoryView のページには「iOS のみ」と小さく書いてあります。Rork が生成するフォーム画面はこの差を吸収してくれないので、Android 側は自分で組むしかありません。ここでは、その2つを最終的に <KeyboardToolbar> という1つの再利用コンポーネントへ畳むまでの手順を、つまずいた箇所ごとに残しておきます。

なぜ「キーボードの上のバー」だけが二度手間になるのか

キーボードの上に固定するツールバーには、地味ですが確かな価値があります。日本語入力では変換確定の取りこぼしが起きやすく、「完了」ボタンで明示的に確定させてからフォーカスを外す導線があると、入力の取りこぼしがはっきり減ります。クイック挿入ボタン(定型文・絵文字・記号)を置けば、テキスト中心の画面の回遊が伸びます。

問題は、iOS と Android でこのバーの出し方がまったく違うことです。iOS の InputAccessoryView は、システムがキーボードに物理的にくっつけて動かしてくれる特別なビューです。キーボードが上がればバーも一緒に上がり、下がれば一緒に下がります。一方 Android には等価のものがありません。KeyboardAvoidingView は「入力欄をキーボードの上へ逃がす」部品であって、「キーボードに貼り付くバー」を描いてはくれません。

つまり、iOS は「専用部品に乗せる」、Android は「キーボード高さを測って自分で絶対配置する」という、設計の異なる2系統を書き分け、最後に同じ見た目へ揃える必要があります。

iOS 側:InputAccessoryView と nativeID を結ぶ

iOS は素直です。InputAccessoryView に一意な nativeID を与え、同じ値を TextInputinputAccessoryViewID に渡すだけで、その入力欄にフォーカスが当たったときにバーがキーボードへ吸着します。

// IosAccessory.tsx — iOS 専用。Android では描画されない
import { InputAccessoryView, TextInput, View, Pressable, Text, Keyboard } from "react-native";
 
const ACCESSORY_ID = "memo-toolbar";
 
export function MemoInputIOS() {
  return (
    <>
      <TextInput
        // この ID で下のバーと紐づく
        inputAccessoryViewID={ACCESSORY_ID}
        placeholder="ひとことメモ"
        multiline
        style={{ minHeight: 96, padding: 12, fontSize: 16 }}
      />
 
      <InputAccessoryView nativeID={ACCESSORY_ID}>
        <View
          style={{
            flexDirection: "row",
            justifyContent: "space-between",
            alignItems: "center",
            paddingHorizontal: 12,
            height: 44,
            backgroundColor: "#f2f2f7",
            borderTopWidth: 0.5,
            borderTopColor: "#c6c6c8",
          }}
        >
          <Pressable onPress={() => {/* 定型文を挿入する処理 */}}>
            <Text style={{ fontSize: 16, color: "#007aff" }}>定型文</Text>
          </Pressable>
          <Pressable onPress={() => Keyboard.dismiss()}>
            <Text style={{ fontSize: 16, fontWeight: "600", color: "#007aff" }}>完了</Text>
          </Pressable>
        </View>
      </InputAccessoryView>
    </>
  );
}

このコードを iOS の実機で動かすと、入力欄をタップした瞬間にキーボードの最上段へグレーのバーが現れ、「完了」を押すとキーボードと一緒に消えます。Keyboard.dismiss() がフォーカスを外し、IME の未確定文字もそこで確定します。

ところが、この MemoInputIOS をそのまま Android で開くと、InputAccessoryView の中身は一切描画されません。エラーも警告も出ないので、最初は「自分のスタイル指定が悪いのか」と無駄に疑ってしまいます。Android には別の足場が要ります。

ここまでお読みいただきありがとうございます。

この記事の続きを読む

この先には、実装コードやベンチマーク結果など、実務でお役に立てる内容をご用意しています。このサイトは広告を掲載しておらず、サーバーや開発にかかる費用はメンバーの皆様のご支援で成り立っています。もしお役に立てていましたら、ご支援いただけますと大変ありがたいです。

この記事で得られること
iOS の InputAccessoryView は出るのに Android では何も出ない、という食い違いで詰まっていた人が、1つの部品で両 OS を揃えられるようになる
キーボード高さの計測・セーフエリアとの重なり・複数入力欄での共有まで含めた、コピペで動くクロスプラットフォーム実装を手に入れられる
「完了ボタンが Android で消える」「ホームインジケーターに被る」を、計測フックと条件分岐で安定運用に切り替えられる
Stripe による安全な決済 · いつでもキャンセル可能

この記事を購入する

この先の内容をすべてお読みいただけます。一度のご購入で、いつでも何度でもアクセスできます。このサイトは広告を掲載しておらず、皆さまのご支援がサーバー費用などの運営を支えています。

または
メンバーシップなら全記事が読み放題 →
シェア

お読みいただきありがとうございます

Rork Lab は広告なしで運営しており、サーバー費用などの運営コストはメンバーシップのご支援で賄っています。実装コード・ベンチマーク・本番設計パターンなど、実務でお役立ていただける記事を毎日更新しています。もし読んでよかったと感じていただけましたら、ぜひご覧ください。

  • コピー&ペーストで使える実装コード付き
  • 毎日新しい上級ガイドを追加
  • ¥580/月 または ¥1,480 の永久アクセス
メンバーシップを見る →

関連記事

開発ツール2026-04-15
Rorkアプリでキーボードが入力フィールドを隠す問題の完全対処ガイド
Rorkアプリでキーボードが表示されるとテキスト入力フィールドが隠れる問題の原因と解決策を解説します。KeyboardAvoidingView・ScrollView・useKeyboard フックを使った実践的な対処法を紹介します。
開発ツール2026-06-27
無料プレビューがスクショで丸ごと持ち出される前に — Rork/Expo でスクリーンショットと画面収録を検知して目隠しする設計
Rork/Expo アプリで有料プレビュー画像をスクリーンショットと画面収録から守る実装。expo-screen-capture の限界、isCaptured のネイティブ監視、iOS/Android の差を踏まえた目隠し設計を解説します。
開発ツール2026-06-27
Rork の共有リンクで配布前に実機差分を潰す手順 — プレビューで気づけない不具合の検証順
Rork のエディタプレビューは整った環境で動くため、実機でしか出ない不具合を見逃します。共有リンクで配布する前に潰すべき7つの実機差分と検証の順番、仕込んでおくコードを実体験からまとめました。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →