[iOS][Android] テキストフィールドに入力可能文字数を設定する

2016.08.08

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

文字数制限

UI コンポーネントのひとつである テキストフィールド
ここではユーザーが文字列を入力することができます。
通常、このテキストフィールドに入力できる文字数の制限はありませんが、最大文字数を指定してそれより多い文字数の入力を禁止することができます。

今回は iOS と Android においての テキストフィールド である UITextFieldEditText について、入力できる文字数を設定する方法をご紹介します。

iOS

iOS でテキストフィールドを表現するには UITextField クラスを利用します。

入力文字数を制御するためには UITextFieldDelegate プロトコルの - textField:shouldChangeCharactersInRange:replacementString: メソッドを実装します。
このメソッドはテキストが変更される直前に呼ばれ、YES を返せばテキストの変更を許可し、NO を返せば変更を禁止します。

サンプルコード

- (BOOL)textField:(UITextField *)textField
shouldChangeCharactersInRange:(NSRange)range
replacementString:(NSString *)string
{
    // 入力前の文字列
    NSMutableString *str = [textField.text mutableCopy];

    // 入力後の文字列
    [str replaceCharactersInRange:range withString:string];

    // 最大入力可能文字数
    NSInteger maxTextLength = 5;

    return (str.length <= maxTextLength);
}

このデリゲートメソッドはあくまで テキストの変更を許可するか否か を決めるものです。
サンプルコードではメソッド内で UI 上の文字列更新は行っていません。
やっていることは、文字が入力された場合の文字数を計算して、それが最大入力可能文字数を超えていなければテキストの変更を許可するというものです。

Android

Android でテキストフィールドを表現するには EditText クラスを利用します。

入力文字数を制御するためには layout の xml ファイルで maxLength を指定するだけです。
簡単ですね!

サンプルコード

<EditText
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:inputType="text"
    android:maxLength="20"  // <- 最大入力可能文字数
    />

また、コードで設定する場合は以下のようにします。

// 最大入力可能文字数
int maxTextLength = 20;

InputFilter.LengthFilter lengthFilter = new InputFilter.LengthFilter(maxTextLength);
mEditText.setFilters(new InputFilter[]{lengthFilter});

この場合は setFilters というメソッドを利用します。
ここでテキスト長に関する入力フィルターを指定することで最大入力可能文字数を設定できます。

setFiltersEditText の継承元である TextView が持つメソッドで、入力フィルターのリストを指定することができます。
バッファが Editable インタフェースを実装している場合は効果が適用され、実装していない場合は何も起きません。

InputFilter インターフェースは Editable インタフェースを実装している要素に対して制約をつけることができるメソッドを提供します。
LengthFilter の他に AllCaps というクラスも存在し、小文字を全て大文字にする という制約をつけることも可能です。


以上です。
iOS, Android 共にこれだけのコードでお手軽に実現できるので、制御をかけたい場合は試してみてください。

リンク

ミレニアム・ファルコン製作日記 #29

29 号 表紙

mfd_29_1

パーツ

mfd_29_2

mfd_29_3

mfd_29_4

成果

mfd_29_5

mfd_29_6

今回の作業は以下の 1 つでした。

  • 砲塔リングを取り付ける

これまで組み立てた船体下部フレームの中央に砲塔リングを設置しました。
これによってフレーム全体がかなり安定した気がします。

ミレニアム・ファルコンの船体下部中央には上部と同様に 4 連レーザー砲がついています。
エピソード 7 で敵の攻撃を受けたレーザー砲が操作不能になった時に、レイが船体を反転させてフィンがタイ・ファイターを撃ちぬくシーンはカッコ良かったです。
(もうエピソード 7 のネタバレ書いてもいいですよね)

エピソード 8 でもミレニアム・ファルコンの活躍に期待しています!

それではまた次回。

May the Force be with you!