繁体   English   中英

单击按钮时如何制作随机布局

[英]How to make a Random Layout when button clicked

实际上我想将其设置为Random类,但随后我认为进行大量活动会使应用程序变慢,因此我只想将相对布局设置为Random

所以我在一个活动课上有5个布局

layout1 = (RelativeLayout)findViewById(R.id.layout1);
layout2 = (RelativeLayout)findViewById(R.id.layout2);
layout3 = (RelativeLayout)findViewById(R.id.layout3);
layout4 = (RelativeLayout)findViewById(R.id.layout4);  
layout5 = (RelativeLayout)findViewById(R.id.layout5);

在每个布局中都有一个按钮,可以使布局再次随机化

button.setOnClickListener(new View.OnClickListener() {

        public void onClick(View v){ 

        //The code to how make layout random

        }
     });
 }

然后,如果按下随机按钮,如何使已经打开的布局不再打开? 那么如果所有布局都已经打开,它将打开新的活动类

有人可以帮我解释一下示例代码吗?

最初将可见性设置为所有相对布局,然后将其全部放入View的ArrayList中。

获取从0到列表大小的随机数。

在任意位置获取View并将其可见性设置为Visible并从ArrayList中删除。

做同样的事情,直到ArrayList为空。

ArrayList为空时创建新的活动。

码:

ArrayList<View> viewList=new ArrayList<>();
initLayouts(){
    layout1 = (RelativeLayout)findViewById(R.id.layout1);
    layout2 = (RelativeLayout)findViewById(R.id.layout2);
    layout3 = (RelativeLayout)findViewById(R.id.layout3);
    layout4 = (RelativeLayout)findViewById(R.id.layout4);
    layout5 = (RelativeLayout)findViewById(R.id.layout5);


    viewList.add(layout1);
    viewList.add(layout2);
    viewList.add(layout3);
    viewList.add(layout4);
    viewList.add(layout5);

    for(int i=0;i<viewList.size();i++){
        viewList.get(i).setVisibility(View.GONE);
    }

button.setOnClickListener(new View.OnClickListener() {

    public void onClick(View v){
        loadRandomLayout();
    }
});
}
public loadRandomLayout(){
    if(viewList.size()>0) {
        Random r = new Random();
        int number = r.nextInt(viewList.size());
        viewList.get(number).setVisibility(View.VISIBLE);
        viewList.remove(number);
    }else{
        startActivity(new Intent(this,NewActivity.class));
    }
}

您可以按以下方式创建随机整数:

//To get a Random number 1-5 (I saw your RelativeLayouts and you've 5
Random rand = new Random();
int randomNum = rand.nextInt((5 - 1) + 1) + 1;

然后,您可以创建一种方法来选择显示的内容:

public void ShowRelativeLayout(int rand){

 switch(rand){
  case 1:
    if (layout1.getVisibility() == View.VISIBLE) {
     //Do nothing cause it's visible
     break;
 } else {
     layout1.setVisibility(View.VISIBLE);
     break;

 }
 case 2:
 ..........

}

创建一个数组以存储布局索引。

RelativeLayout[] layout = new RelativeLayout[5];
layout[0] = (RelativeLayout)findViewById(R.id.layout[0]); // 0
layout[1] = (RelativeLayout)findViewById(R.id.layout[1]); // 1
layout[2] = (RelativeLayout)findViewById(R.id.layout[2]); // 2
layout[3] = (RelativeLayout)findViewById(R.id.layout[3]); // 3
layout[4] = (RelativeLayout)findViewById(R.id.layout[4]); // 4

制作一个简单的随机数生成器。

public void FindNewLayout ()
{

  Random r_generator = new Random();

  int randomNum;

  //now the only way to know which layouts have been shown before, you 
  //need to store the indexes that have been used before, somewhere. 
  //I recommend using an array.

  // count, and the array below should be initialized somewhere else 
  //rather than inside the method so that only one instance of each is 
  //created, but for simplicity I'll just put their initialization here
  int static count = 0; 
  //I'll explain below what count does.

  // the log array that remembers each layout change
  boolean[] log = new boolean[5];

  do 
  {
    //select new random number
    randomNum = r_generator.nextInt((max - min) + 1) + min;
    //in this case max = 4, min = 0, so replace these values in the 
    //equation above

    // check the log to see if the number has appeared again
    if ( log[randomNum] == false )
    {
      //Great! it hasn't appeared before, so change layout
      log[randomNum] = true;
      layout[randomNum].setVisibility = true;
      count++; // increases step
      break; //stops while because an unused layout has been found
    }

  }while (count<5)
  //if the value of count is equal to 5 then every layout has been used 
  //before so the do-while code should not be run again

}// end method

每当您想更改布局时,都应调用上述方法。

最后,您可以使用类似Debugger.log("message");类的东西Debugger.log("message"); 如果需要,可以在控制台上打印此语句以进行调试,以找出布局何时更改。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM