用于以网格状方式添加框的按钮

时间:2015-04-05 20:20:20

标签: java android android-layout grid

我想创建一个按钮来添加视图(类似盒子的东西),使得第一个框出现在按钮下方,第二个框出现在第一个框中,第三个出现在第一个框下面,所以在,有点像这样:

[Button]
[1st][2nd]
[3rd][4th]
[5th] ...

我从一些好人那里得到了一些代码但是虽然它确实增加了他们相互叠加的视图而不是我上面显示的方式。有人可以帮我这个吗?

以下是代码:

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.RelativeLayout;

public class teamCreateScreen extends Activity {

    int i = 0;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.team_locate_layout);
    }

    public void createTeam(View view) {
        final RelativeLayout rlTeam = (RelativeLayout) findViewById(R.id.rlTeam);
        RelativeLayout.LayoutParams relativeParams = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
        Button tv = new Button(getApplicationContext());
        if (tv.getId() > 0) {
            relativeParams.addRule(RelativeLayout.BELOW, tv.getId());
        }
        tv.setText("New Team");
        tv.setId(i);
        rlTeam.addView(tv, relativeParams);
        i++;
    }
}

还添加视图的XML布局:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/rlTeam">

    <Button
        android:layout_width="60dp"
        android:layout_height="60dp"
        android:id="@+id/teamAddBtn"
        android:text="+"
        android:textSize="30sp"
        android:onClick="createTeam"/>

</RelativeLayout> 

1 个答案:

答案 0 :(得分:0)

我认为最好的办法是Android GridView

无论如何试试这段代码:

public class MainActivity extends ActionBarActivity {

private int counter = 0;
private int lastId = -1;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
}

public void createTeam(View view) {
    final RelativeLayout rlTeam = (RelativeLayout) findViewById(R.id.rlTeam);
    RelativeLayout.LayoutParams relativeParams = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
    Button tv = new Button(getApplicationContext());

    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR1) {

        tv.setId(Utils.generateViewId());

    } else {

        tv.setId(View.generateViewId());

    }

    if(lastId == -1) {
        relativeParams.addRule(RelativeLayout.BELOW, view.getId());
        counter++;
    } else if(counter == 1) {
        relativeParams.addRule(RelativeLayout.RIGHT_OF, lastId);
        relativeParams.addRule(RelativeLayout.ALIGN_TOP, lastId);
        counter++;
    } else if(counter == 2) {
        relativeParams.addRule(RelativeLayout.BELOW, lastId);
        counter = 1;
    }


    tv.setText("New Team");

    lastId = tv.getId();

    rlTeam.addView(tv, relativeParams);
}

Utils类:

import java.util.concurrent.atomic.AtomicInteger;

/**
 * Created by Hema on 05/04/2015.
 */
public class Utils {
    private static final AtomicInteger sNextGeneratedId = new AtomicInteger(1);

    /**
     * Generate a value suitable for use in {@link #setId(int)}.
     * This value will not collide with ID values generated at build time by aapt for R.id.
     *
     * @return a generated ID value
     */
    public static int generateViewId() {
        for (;;) {
            final int result = sNextGeneratedId.get();
            // aapt-generated IDs have the high byte nonzero; clamp to the range under that.
            int newValue = result + 1;
            if (newValue > 0x00FFFFFF) newValue = 1; // Roll over to 1, not 0.
            if (sNextGeneratedId.compareAndSet(result, newValue)) {
                return result;
            }
        }
    }
}

我想告诉你为什么它不起作用: 当你创建这样的Button tv = new Button(getApplicationContext());视图时,如果你调用tv.getId()将等于-1,直到你调用tv.setId(int id)。