戻る

上の画像は以下のコードでxmlで定義せずにプログラム上で設定出来ます。
今回は前回で作ったプログラムにリスナーを設置しました。しかしこれでは、ただ配置しリスナーと設置しただけで、これなら、プログラムで書く意味はありません。そこで、android:textの部分も生成も変数で行い、リスナーも変数を利用し搭載してみることにいたしました。
package testbutton001.syakazuka.com;

import android.app.Activity;
import android.os.Bundle;
import android.view.ViewGroup.LayoutParams;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.ScrollView;

public class TestButton001Activity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.test_001);
    ScrollView scr_view = (ScrollView)findViewById(R.id.scr_view);
    Button button[] =new Button[3];
    int h=100;
    int w=200;

    //---------(1)縦並び枠を全画面表示で設置します。
    LinearLayout LL0 = new LinearLayout(this);
    LL0.setOrientation(LL0.VERTICAL);
    LL0.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT));
        //---------(2)横並び枠をで設置します。
        LinearLayout LL1 = new LinearLayout(LL0.getContext());
        LL1.setOrientation(LL1.HORIZONTAL);
         //---------(3)縦並び枠を設置します。
        LinearLayout ll = new LinearLayout(LL1.getContext());
        ll.setOrientation(ll.VERTICAL);
         //---------(4)縦並び枠の最初にButton_1のボタンを設置します。
        button[0] = new Button(this);
        button[0].setText("Button_1");
        button[0].setHeight(h);
        button[0].setWidth(w);
        //-----リスナーの設定
        button[0].setOnClickListener(new View.OnClickListener() {
        @Override
            public void onClick(View view){
              //他のActivityをキックする場合は以下のようにする
              //Intent intent = new Intent(testActivity.this, xxxxxxxxxActivity.class);
              //intent.putExtra("testbutton001.syakazuka.com.CNT",String.valueOf(0));
              //startActivity(intent);
              Toast.makeText(testActivity.this,"Number = 0",Toast.LENGTH_SHORT).show();
            }
        });
        
        ll.addView(button[0]);
         //---------(5)縦並び枠の2段目にButton_2のボタンを設置します。
        button[1] = new Button(this);
        button[1].setText("Button_2");
        button[1].setHeight(h);
        button[1].setWidth(w);
        //-----リスナーの設定
        button[1].setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view){
              Toast.makeText(testActivity.this,"Number = 1",Toast.LENGTH_SHORT).show();
            }
        });
        ll.addView(button[1]);
        //---------(6)縦並び枠を閉じます。
        LL1.addView(ll);
        //---------(7)横並び枠にButton_3の(高さを倍にした)ボタンを設置します。
        button[2] = new Button(this);
        button[2].setText("Button_3");
        button[2].setHeight(h*2);
        button[2].setWidth(w);
        //-----リスナーの設定
        button[2].setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view){
              Toast.makeText(testActivity.this,"Number = 2",Toast.LENGTH_SHORT).show();
            }
        });
        LL1.addView(button[2]);
    //---------(8)横並び枠を閉じます。
    LL0.addView(LL1);
    //---------(9)全画面サイズの縦並び枠を閉じます。
    scr_view.addView(LL0);
    }
}


Button_1とButton_2を変数(i)で生成していきます。最初、変数(i)はループして、その中で配列の要素にアクセスします。このループの課程でfinalな変数indexを定義し、iの値を代入。(2)OnClickListenerの実装から、indexを参照。
finalとして変数を宣言した場合、それ以降の値の変更は許可されず、読み込みのみ可能な変数になります。finalなローカル変数であれば匿名クラス(new View.OnClickListener)の実装部分から参照可能です。ループ毎にindexを宣言することで、各ボタンのリスナーは同じループ内で宣言されたindexを参照します。 そのため、宣言時に代入された値(i)を各リスナーが把握できます。
このリスナー実装部分は「アンドロイドの会新潟支部」のメンバーyu kakizaki様からのアドバイスと教えによるものです。
今回はリスナーの中でToastでその配列要素の番号をクリックした段階で表示することとしました。勿論、ここで、Intent で他のActivityをキックすることも出来ますし、場合によってはputExtraで配列要素の値を渡す事も出来るわけですね。
Button_3についてはi=2としてループを無くして前のコードを踏襲しました。これにより、上記掲載写真のように、各ボタンをクリックするとその配列番号がToastされます。

package testbutton001.syakazuka.com;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup.LayoutParams;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.ScrollView;
import android.widget.Toast;

public class TestButton001Activity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        ScrollView scr_view = (ScrollView)findViewById(R.id.scr_view);
        Button button[] =new Button[3];
        int h=100;
        int w=200;

        LinearLayout LL0 = new LinearLayout(this);
        LL0.setOrientation(LL0.VERTICAL);
        LL0.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT));

            LinearLayout LL1 = new LinearLayout(LL0.getContext());
            LL1.setOrientation(LL1.HORIZONTAL);
            LinearLayout ll = new LinearLayout(LL1.getContext());
            ll.setOrientation(ll.VERTICAL);
                int i;
                for(i=0;i<2;i++){
                    //final定義の変数は固定ですので、そのまま配列番号としてリスナーに登録されます
                    final int index = i;
                    button[i] = new Button(this);
                    button[i].setText("Button_"+(i+1));//-----ボタンのテキストも変数を利用
                    button[i].setHeight(h);
                    button[i].setWidth(w);
                    //-----リスナーの実装
                    button[i].setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View view){
                            Toast.makeText(TestButton001Activity.this,"Number =" + index ,Toast.LENGTH_SHORT).show();
                        }
                    });
                    ll.addView(button[i]);
                }
            LL1.addView(ll);
            i=2;
            //前はループ内でのfinal定義でしたから此処でも定義出来て、そのまま配列番号としてリスナーに登録されます
            final int index = i ;
            button[i] = new Button(this);
            button[i].setText("Button_"+(i+1));
            button[i].setHeight(h*2);
            button[i].setWidth(w);
            //-----リスナーの実装
            button[i].setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view){
                    Toast.makeText(TestButton001Activity.this,"Number =" + index ,Toast.LENGTH_SHORT).show();
                }
            });
            LL1.addView(button[i]);
        LL0.addView(LL1);
        scr_view.addView(LL0);
    }
}