Buttonやテキストなどを複数配置するようなレイアウト、ListViewでも可能ですが、配列を使ってfor文で一気に作ることもできます。レイアウトファイルにちまちま書かずに tag をセットして作りましょう。
2021.1.1
Button array
配列としてそれぞれのButtonを複数作成するだけであれば簡単ですが、それぞれのButtonがタップされた時の設定はどうすればいいでしょう。
ボタンタップで受け取る時のIDを考えないといけないですね。
結局レイアウトファイルから
button[0] = findViewById(R.id.button_0) ;
button[1] = findViewById(R.id.button_1) ;
…
ではいまいちです。レイアウトファイルではなくコードで書きましょう。
また、ボタンのクリックリスナーもfor文で作成すると、どのボタンがタップされたかわからないといけません。
ボタンのIDを呼び出す方法ももありますが、IDは自動で作成されるものです。直観的で分かりやす方がいいと思います。
setTag(Object tag), getTag()を使うとIDを使わずにできます
とは言っても実のところどうしてもTagを使う必要があるのかと疑問もあります
Tags can also be used to store data within a view without resorting to another data structure. The specified key should be an id declared in the resources of the application to ensure it is unique (see the ID resource type).
ViewにTagでマーキングするとしがらみがなく使えるということでしょうか。
たとえば100m競争でゼッケン16番の選手の記録という方が、名前を桐生xxxというより簡単でいいわけですね。
setTag(), getTag()
とりあえず作ってみたいと思います。
ボタンにsetTag(“1”)を設定
1 2 |
Button button1 = new Button(this); button1.setTag("1")); |
view.getTag()で取り出す
1 2 3 |
button1.setOnClickListener( v -> { Log.d("Button Tapped", v.getTag().toString()); }); |
ボタンを配列で作成し、こういう形でtagを付けて後でタップで取り出せるようにします。
サンプルコード
以上を使って、ボタンアレーをコードで作ってみます。
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 |
//package your.package.name; import androidx.appcompat.app.AppCompatActivity; import android.graphics.Color; import android.os.Bundle; import android.view.Gravity; import android.view.ViewGroup; import android.widget.Button; import android.widget.LinearLayout; import android.widget.TextView; import java.util.Locale; public class MainActivity extends AppCompatActivity { private TextView textView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //setContentView(R.layout.activity_main); // リニアレイアウトの設定 LinearLayout layout = new LinearLayout(this); layout.setOrientation(LinearLayout.VERTICAL); layout.setLayoutParams(new LinearLayout.LayoutParams( LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT)); // レイアウト中央寄せ layout.setGravity(Gravity.CENTER); // 背景色 layout.setBackgroundColor(Color.rgb(0xdd, 0xff, 0xee)); setContentView(layout); // dp単位を取得 float dp = getResources().getDisplayMetrics().density; // Button 幅を250dpに設定 int buttonWidth = (int)(250 * dp); // マージン 10dp に設定 int margins = (int)(10 * dp); // TextViewの設定 textView = new TextView(this); String str = "TextView"; textView.setText(str); textView.setTextColor(0xff000000); textView.setTextSize(10*dp); layout.addView(textView, new LinearLayout.LayoutParams( LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT)); Button btn; for(int i=0; i<5 ; i++) { // Tag を設定する btn = new Button(this); btn.setTag(String.valueOf(i)); btn.setText(String.format(Locale.US, "Button %d", i)); LinearLayout.LayoutParams buttonLayoutParams = new LinearLayout.LayoutParams(buttonWidth, ViewGroup.LayoutParams.WRAP_CONTENT); buttonLayoutParams.setMargins(margins, margins, margins, margins); btn.setLayoutParams(buttonLayoutParams); layout.addView(btn); // Listnerをセット // lambda型 btn.setOnClickListener( v -> { // View からTagを取り出す textView.setText(String.format(Locale.US, "Button: %s", v.getTag().toString())); }); } } } |
Ref:
public void setTag (Object tag)
public Object getTag ()
関連ページ: