デフォルトじゃないみたいなので、いろいろ漁ってると以下の記事を発見。
・Androidでボタンを横に並べて自動で折り返す
ほほー。RelativeLayoutでござるか。
使 っ た こ と な い ん で す よ ね 。
上記の記事を使いまわしが効くようにコントロール化してみました。
かなり適当。
public class WrapLayout extends RelativeLayout {
public WrapLayout(Context context) {
super(context);
}
public WrapLayout(Context context, AttributeSet attrs) {
super(context, attrs);
}
public WrapLayout(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
@Override
public void addView(View child) {
// idが未設定の場合は乱数でどうにかする。
if (child.getId() == -1) { child.setId(new Random(System.currentTimeMillis()).nextInt(Integer.MAX_VALUE)); }
super.addView(child);
}
@Override
public void addView(View child, int width, int height) {
// idが未設定の場合は乱数でどうにかする。
if (child.getId() == -1) { child.setId(new Random(System.currentTimeMillis()).nextInt(Integer.MAX_VALUE)); }
super.addView(child, width, height);
}
@Override
public void addView(View child, ViewGroup.LayoutParams params) {
// idが未設定の場合は乱数でどうにかする。
if (child.getId() == -1) { child.setId(new Random(System.currentTimeMillis()).nextInt(Integer.MAX_VALUE)); }
super.addView(child, params);
}
@Override
public void addView(View child, int index) {
// idが未設定の場合は乱数でどうにかする。
if (child.getId() == -1) { child.setId(new Random(System.currentTimeMillis()).nextInt(Integer.MAX_VALUE)); }
super.addView(child, index);
}
@Override
public void addView(View child, int index, ViewGroup.LayoutParams params) {
// idが未設定の場合は乱数でどうにかする。
if (child.getId() == -1) { child.setId(new Random(System.currentTimeMillis()).nextInt(Integer.MAX_VALUE)); }
super.addView(child, index, params);
}
@Override
public void onWindowFocusChanged(boolean hasWindowFocus) {
super.onWindowFocusChanged(hasWindowFocus);
// 子供の数を取得
int l = this.getChildCount();
// 無いなら何もしない
if (l == 0) {
return;
}
// ディスプレイの横幅を取得
WindowManager wm = (WindowManager) this.getContext().getSystemService(Context.WINDOW_SERVICE);
Display display = wm.getDefaultDisplay();
// 1行最大長
int max = display.getWidth();
// 一番最初は基点となるので何もしない
View pline = this.getChildAt(0);
// 現在の1行の長さ
int currentTotal = pline.getWidth();
for (int i = 1; i < l; i++) {
int w = this.getChildAt(i).getWidth();
RelativeLayout.LayoutParams layoutParams =
(RelativeLayout.LayoutParams) this.getChildAt(i).getLayoutParams();
// 横幅を超えないなら前のボタンの右に出す
if (max > currentTotal + w) {
// 現在長に処理対象コントロール長を加算
currentTotal += w;
layoutParams.addRule(RelativeLayout.ALIGN_TOP, this.getChildAt(i - 1).getId());
layoutParams.addRule(RelativeLayout.RIGHT_OF, this.getChildAt(i - 1).getId());
} else {
// 横最大長を超過した場合は折り返す
layoutParams.addRule(RelativeLayout.BELOW, pline.getId());
// 基点を変更
pline = this.getChildAt(i);
// 長さをリセット
currentTotal = pline.getWidth();
}
}
}
}
わかってます。onWindowFocusChangedにaddViewしたらダメじゃね?ってのはわかってます。
とりあえずです。
[[Activity]]
public class MainActivity extends Activity {
/** Called when the activity is first created. */
String[] strings = { "てst1", "てst2", "てst3", "てst4", "てst5", "てst6", "てst7", "てst8", "てst9", "てst10", "てst111111a", "てst111", "てst234"};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
WrapLayout layout = (WrapLayout)this.findViewById(R.id.FixedGridLayout);
for (String string : strings) {
Button btn = new Button(this);
btn.setText(string);
//btn.setId(random.nextInt(Integer.MAX_VALUE));
layout.addView(btn);
}
}
}
[[出力結果]]良い感じ。

0 件のコメント:
コメントを投稿