以编程方式在另一个旁边添加一个按钮

时间:2014-03-06 14:42:45

标签: android relativelayout

我正在为Android API v11开发。有一个较大的RelativeLayout区域(如画布),应该以编程方式填充多个按钮。每个按钮代表一个视频,我使用android.widget.Button扩展了VideoViewButton课程。

以下是我现在在主要活动中所做的事情:

private void addButtonForVideo(int videoId) {
    Log.d(TAG, "Adding button for video " + videoId);
    VideoButtonView button = new VideoButtonView(this, videoId);
    RelativeLayout layout = (RelativeLayout) findViewById(R.id.layout_napping);

    layout.addView(button, params);
    mVideoButtons.add(button);
}

在这里,mVideoButtons只包含所有按钮,以便稍后引用它们。

然而,按钮本身位于RelativeLayout的左上角,一个位于另一个上方。我需要做的是将每个按钮放在前一个按钮的右侧,这样它们就会填满整个屏幕。

我试过这个,我检查视频ID是不是0(意味着,按钮已经存在)。然后我得到之前放置的按钮的ID,并说我希望下一个按钮放在前一个按钮的右边:

private void addButtonForVideo(int videoId) {
    Log.d(TAG, "Adding button for video " + videoId);
    VideoButtonView button = new VideoButtonView(this, videoId);
    RelativeLayout layout = (RelativeLayout) findViewById(R.id.layout_napping);

    RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(
            ViewGroup.LayoutParams.WRAP_CONTENT,
            ViewGroup.LayoutParams.WRAP_CONTENT
    );

    // align to right of previous button
    if (videoId != 0) {
        VideoButtonView previousButton = mVideoButtons.get(videoId - 1);
        params.addRule(RelativeLayout.RIGHT_OF, previousButton.getId());
    }

    layout.addView(button, params);
    mVideoButtons.add(button);
}

然而,它不起作用 - 按钮仍然放在彼此的顶部。我怎样才能让它们显示在前一个旁边?

2 个答案:

答案 0 :(得分:1)

您需要在setId的构造函数中使用videoId调用VideoButtonView才能生效。

确保setId包含正数,例如,如果videoId以0开头,请使用:

public VideoButtonView(Context context, int videoId) {
    super(context);
    this.setId(videoId + 1);
    // other code to set layout
}

答案 1 :(得分:0)

我建议不要使用相对布局以编程方式放置对象。请改用线性布局,并使用LinearLayout.LayoutParams

组织内容

要使用LinearLayout执行此操作,请确保将方向设置为HORIZONTAL

private void addButtonForVideo(int videoId) {
Log.d(TAG, "Adding button for video " + videoId);
VideoButtonView button = new VideoButtonView(this, videoId);
LinearLayout layout = (LinearLayout) findViewById(R.id.layout_napping);

LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
        LinearLayout.LayoutParams.MATCHPARENT,
        LinearLayout.LayoutParams.WRAP_CONTENT,
);

LinearLayout buttonWrapper = new LinearLayout();
buttonWrapper.setLayoutParams(params);
buttonWrapper.setOrientation(LinearLayout.HORIZONTAL);

// align to right of previous button
if (videoId != 0) {
    VideoButtonView previousButton = mVideoButtons.get(videoId - 1);
}

buttonWrapper.addView(button);
layout.addView(buttonWrapper);
mVideoButtons.add(button);

}

请记住将第一个按钮放在ButtonWrapper中,然后再将第二个按钮放在那里。

使用线性布局,下一个孩子将显示在下一个孩子旁边,或者显示在前一个孩子旁边,具体取决于布局的方向和方向。在这里,每个按钮将彼此相邻,包装器将延伸其所在布局的整个长度。

祝你好运!