setIdとView.generateViewId()
コントロールを動的に動かしたい場合は
コントロールにsetIdを使用して番号を割り振る方法があります。
※private変数にするなど方法は他にもあります。
setIdを使用するとき、バージョンによってはIdをそのまま数値(int型)
で割り振るのではなく、「View.generateViewId()」を使用して割り振るようにする方法があります。
※API Level 17(Android4.2)以降が対象となります。
ちなみにAPI Level 17(Android4.2)以降のAndroid StudioでsetIdに数字やint型の変数を設定すると
次の警告が表示されると思います。
※宣言したint型の変数の初期値が0である場合は表示はされませんが、あまり意味がないと思います。
(例)
int iNo = 0;
警告は表示されないが、使用しても、あまり意味がない気がします。
(警告が表示される例)
iNo = 1;//変数に値を設定したケース
int iNo = 1;//0以外の数字を設定したケース
警告メッセージの例
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
//相対的レイアウト(RelativeLayout)を使用する宣言
import android.view.View;
import android.widget.RelativeLayout;
//TextViewを使用する宣言
import android.widget.TextView;
//文字列宣言
import java.lang.String;
//ログ出力の宣言
import android.util.Log;
//クリックイベント用に追加
import android.view.View.OnClickListener;
//ボタンを宣言
import android.widget.Button;
public class MainActivity extends AppCompatActivity implements OnClickListener {
//setId用の管理番号
private int mNo1=0;
private int mNo2=0;
//ボタン
private Button mBtn1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//相対的レイアウトを使用するためコメントアウト
//setContentView(R.layout.activity_main);
//相対的レイアウト
RelativeLayout layout = new RelativeLayout(this);
setContentView(layout);
int iControlId1=0;
int iControlId2=0;
//座標の初期設定
int x=0;
int y=0;
int width=0;
int height=0;
x=100;
y=50;
width=200;
height=50;
TextView txt1 = new TextView(this);
mNo1 = View.generateViewId();
txt1.setId(mNo1);
txt1.setText("TextViewにデータを\n表示します。");
RelativeLayout.LayoutParams obj1 = getLayoutObject(width, height);
obj1.leftMargin=x;
obj1.topMargin=y;
layout.addView(txt1, obj1);
iControlId1=txt1.getId();
Log.d("iControlId1", String.valueOf(iControlId1) );
x=50;
y=150;
width=300;
height=50;
TextView txt2 = new TextView(this);
mNo2 = View.generateViewId();
txt2.setId(mNo2);
txt2.setText("下にTextViewコントロールを\n表示しました。");
RelativeLayout.LayoutParams obj2 = getLayoutObject(width, height);
obj2.leftMargin=x;
obj2.topMargin=y;
layout.addView(txt2, obj2);
iControlId2=txt2.getId();
Log.d("iControlId2", String.valueOf(iControlId2) );
mBtn1=new Button(this);
mBtn1.setOnClickListener(this);
layout.addView(mBtn1);
}
@Override
public void onClick(View view) {
int x=0;
int y=0;
x=150;
y=300;
TextView txt2=(TextView)findViewById(mNo2);
txt2.setX(x);
txt2.setY(y);
}
//レイアウトを決定するオブジェクトを生成し渡します
public RelativeLayout.LayoutParams getLayoutObject(int width,int height)
{
return new RelativeLayout.LayoutParams(width, height);
}
}
|
次のようにsetIdに設定するIdを取得します。
mNo1 = View.generateViewId();
取得したIdをsetIdに設定します。
txt1.setId(mNo1);
@Override
public void onClick(View view) {
int x=0;
int y=0;
x=150;
y=300;
TextView txt2=(TextView)findViewById(mNo2);
txt2.setX(x);
txt2.setY(y);
}
|
上記はボタンをクリックしたときの動作です。
TextViewコントロールのIdをfindViewByIdで指定して
動かしたいコントロールを決定しています。
setXおよびsetYでx座標とy座標を指定してポジショニングを決定します。
このようにsetIdとView.generateViewId()を使用すると
設置したコントロールを動かすことができます。
|
|