動的グリッド方式で子ビューを表示するカスタム レイアウトを作成しようとしています。pinterest のようなものですが、まだそこまでは行っていません。
これが私のレイアウトクラスですPostsLayout
/**
* Displays Post records in different sizes.
*/
public class PostsLayout extends RelativeLayout
{
private class PostPos
{
public Button view;
public int Row;
public int RowSpan;
public int Column;
public int ColSpan;
public int Size;
public PostPos(Context context, int row, int row_span, int column, int col_span)
{
view = new Button(context);
view.setText("btn");
Row = row;
RowSpan = row_span;
Column = column;
ColSpan = col_span;
}
public void update(int size)
{
Size = size;
RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(size, size);
lp.leftMargin = size * Column;
lp.topMargin = size * Row;
view.setLayoutParams(lp);
}
}
private ArrayList<PostPos> _posts;
/**
* The number of columns.
*/
private int _columns;
/**
* Constructor.
*
* @param context
*/
public PostsLayout(Context context, int columns)
{
super(context);
_posts = new ArrayList<PostPos>();
_columns = columns;
int rows = 3;
for (int r = 0; r < rows; r++)
{
for (int c = 0; c < _columns; c++)
{
PostPos pp = new PostPos(context, r, 1, c, 1);
_posts.add(pp);
addView(pp.view);
}
}
}
@Override
protected void onSizeChanged(int width, int height, int old_width, int old_height)
{
for (PostPos pos : _posts)
{
pos.update(width / _columns);
}
super.onSizeChanged(width, height, old_width, old_height);
}
}
このレイアウトを使用すると、ビューを埋める 3x3 ボタンのグリッドが表示されます。それが欲しかったのですが、スクロールしません。だから私は a を使おうとしましたScrollView
が、それをするとすべてが消えます。ビューはただ空白です。
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
ScrollView scroll = new ScrollView(this);
ScrollView.LayoutParams params = new ScrollView.LayoutParams(ScrollView.LayoutParams.MATCH_PARENT, ScrollView.LayoutParams.WRAP_CONTENT);
scroll.setLayoutParams(params);
PostsLayout posts = new PostsLayout(this, 4);
scroll.addView(posts);
setContentView(scroll);
}
何が問題なのかわかりません。
編集:
コンストラクターを変更してPostsLayout
、デフォルトで 1 つのボタンを作成するだけで、そのボタンがScrollView
. したがって、他のボタンで何か間違ったことをしているに違いありません。
これがコードです。
public PostsLayout(Context context, int columns)
{
super(context);
_posts = new ArrayList<PostPos>();
_columns = columns;
int rows = 3;
for (int r = 0; r < rows; r++)
{
for (int c = 0; c < _columns; c++)
{
//PostPos pp = new PostPos(context, r, 1, c, 1);
//_posts.add(pp);
//addView(pp.view);
}
}
// this button does show!?!?
addView(new Button(context));
RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
this.setLayoutParams(params);
}
編集:
onSizeChanged
間違った値で呼び出されました。がない場合はScrollView
、PostsLayout
デバイスのフル サイズに合わせてサイズ変更されますが、 がある場合はScrollView
、onSizeChanged
メソッドが非常に小さいサイズ値で呼び出されます。これが、デバイスに何も表示されない理由です。
これをコンストラクターに追加しましたPostsLayout
が、修正されませんでした。
RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
this.setLayoutParams(params);