文字列を入力するためのEditTextですが、レイアウトファイルを使いたくないなどコードのみで記述したいケースがあります。コードのみでEditTextを記述してみます。
2021.1.1
EditText
Javaコードで記述することのメリットは、ダイナミックに変更できる点です。レイアウトXMLファイルは静的なので、一度作成すると変更できません。
一方デメリットとしては、コード量が増大しがちでレイアウトファイルのように感覚的に作ることもできません。ただ、レイアウトファイルで作成した後で部分的にコードで変更することは可能です。
コード化のポイント
テキストやボタンといった部品を配置するためには setContentView を使いますが、今回はレイアウトXMLファイルである activity_main.xml を使わないやり方です。
setContentView:
その名の通り、スクリーン画面にViewを設定するメソッドです。
設定されるViewはLayout形式でまとめられたViewグループになります。
setContentViewのメソッドは引数の取り方でいくつかあります
- setContentView(int layoutResID)
- レイアウトXMLファイルのIDを指定
- setContentView(View view)
- 簡略形です。今回はこれを使います
- setContentView(View view, ViewGroup.LayoutParams params)
Ref: Android Developer
レイアウトのタイプに応じてインスタンス生成、縦横の幅を決めて、EditTextを作ってそのレイアウトに追加します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
// LinearLayout インスタンス生成 LinearLayout layout = new LinearLayout(this); // 並ぶ順番は垂直方向 layout.setOrientation(LinearLayout.VERTICAL); // レイアウトの縦横幅を最大 layout.setLayoutParams(new LinearLayout.LayoutParams( LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT)); // setContentViewに設定 setContentView(layout); // EditText インスタンス生成 EditText editText = new EditText(this); LinearLayout.LayoutParams editTextParams = new LinearLayout.LayoutParams( LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT); editText.setLayoutParams(editTextParams); layout.addView(editText); |
サンプルコード
まとめるとこうなります。Button, TextView, EditTextのすべてをコードで記述することになりましたが、基本的には同じことをしています。
MainActivity.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 |
//package your.package.name; import androidx.appcompat.app.AppCompatActivity; import android.graphics.Color; import android.os.Bundle; import android.util.TypedValue; import android.view.Gravity; import android.widget.Button; import android.widget.EditText; import android.widget.LinearLayout; import android.widget.TextView; public class MainActivity extends AppCompatActivity { private TextView textView; private EditText editText; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //************* Layoutの設定 *************/ // LinearLayout インスタンス生成 LinearLayout layout = new LinearLayout(this); // 並ぶ順番は垂直方向 layout.setOrientation(LinearLayout.VERTICAL); // 背景色 layout.setBackgroundColor(0xffddffee); // レイアウトの縦横幅を最大 layout.setLayoutParams(new LinearLayout.LayoutParams( LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT)); // レイアウト横方向中央寄せ layout.setGravity(Gravity.CENTER_HORIZONTAL); setContentView(layout); //************** dp単位を取得 *************/ // dp単位 float scale = getResources().getDisplayMetrics().density; // マージン 30dp に設定 int margins = (int)(30 * scale); //************* TextView の設定 *************/ // テキスト設定 textView = new TextView(this); // テキストサイズ 30sp textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 30); // テキストカラー textView.setTextColor(Color.rgb(0x0, 0x0, 0x0)); LinearLayout.LayoutParams textLayoutParams = new LinearLayout.LayoutParams( LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT); // マージン 30dp に設定 textLayoutParams.setMargins(margins, margins*3, margins, margins); // LayoutParamsの設定 textView.setLayoutParams(textLayoutParams); // layoutにeditTextを追加 layout.addView(textView); //************* EditTex の設定 *************/ // EditTex のインスタント生成 editText = new EditText(this); // hintを入れる String strHint = "input"; editText.setHint(strHint); // dp単位の横幅 int editTextWidth = (int)(150 * scale); // 横幅 150dp, 縦 WRAP_CONTENT に設定 LinearLayout.LayoutParams editTextParams = new LinearLayout.LayoutParams( editTextWidth, LinearLayout.LayoutParams.WRAP_CONTENT); // LayoutParamsの設定 editText.setLayoutParams(editTextParams); // 背景色 editText.setBackgroundColor(0xffffffff); // layoutにeditTextを追加 layout.addView(editText); //************* ボタンの設定 *************/ Button button = new Button(this); String strTitle = "Button"; button.setText(strTitle); int buttonWidth = (int)(150 * scale); // 横幅 150dp, 縦 100dp に設定 LinearLayout.LayoutParams buttonLayoutParams = new LinearLayout.LayoutParams( buttonWidth, LinearLayout.LayoutParams.WRAP_CONTENT); buttonLayoutParams.setMargins(margins, margins, margins, margins); button.setLayoutParams(buttonLayoutParams); layout.addView(button); // リスナーをボタンに登録, lambda button.setOnClickListener( v -> { // エディットテキストのテキストを取得 String text = editText.getText().toString(); // 取得したテキストを TextView に張り付ける textView.setText(text); // 次の入力のため空白とする editText.setText(""); }); } } |
EditTextはユーザー操作が絡むので制限を設けたりしないと色々支障が出ます。例えばユーザーがたくさん文字を入力してEditTextの幅を超えてしまうなど…
文字入力の表示制限、あるいは段組みするなどの入力ができるなどの用意をしておく必要があります。
関連ページ:
- スマホにEditTextを使って文字を入力する
- EditTextをコードで記述する
- 文字入力と表示制限
- TextWatcher 入力を監視する