gpt4 book ai didi

android - Android 位置随机播放按钮

转载 作者:行者123 更新时间:2023-11-29 17:58:01 24 4
gpt4 key购买 nike

我的 xml 布局中有十个按钮,我想随机交换这 10 个按钮的位置。我尝试了两种方法来实现它。

方法一:我改变了按钮的背景资源,但只改变了图像。不是布局上的按钮位置。这是方法 1 的工作原理。

objects = new ArrayList<Integer>();
objects.add(R.drawable.num_one);
objects.add(R.drawable.num_eight);
objects.add(R.drawable.num_six);
objects.add(R.drawable.num_five);
objects.add(R.drawable.num_nine);
objects.add(R.drawable.num_four);
objects.add(R.drawable.num_two);
objects.add(R.drawable.num_three);
objects.add(R.drawable.num_zero);
objects.add(R.drawable.num_seven);

// Shuffle the collection
Collections.shuffle(objects);

List<Button> buttons = new ArrayList<Button>();
buttons.add((Button)findViewById(R.id.name));
buttons.add((Button)findViewById(R.id.boutton_eight));
buttons.add((Button)findViewById(R.id.boutton_six));
buttons.add((Button)findViewById(R.id.boutton_five));
buttons.add((Button)findViewById(R.id.time));
buttons.add((Button)findViewById(R.id.boutton_four));
buttons.add((Button)findViewById(R.id.boutton_two));
buttons.add((Button)findViewById(R.id.search_box));
buttons.add((Button)findViewById(R.id.boutton_zero));
buttons.add((Button)findViewById(R.id.boutton_seven));

for (int i = 0; i < objects.size(); i++) {
buttons.get(i).setBackgroundResource(objects.get(i));
}

在方法二中:我直接打乱了按钮,但是因为小部件已经在 xml 布局中设置了。 AddView() 给出一个错误信息,表示 View 已经设置。这是我为第二个解决方案所做的工作。

        ll =  (LinearLayout)findViewById(R.id.llShuffleBox);

//create another two linear layouts which will host 5 buttons horizontally
top_compte = (LinearLayout)findViewById(R.id.top_compte);
bottom_calculator= (LinearLayout)findViewById(R.id.bottom_calculator);

buttons.add((Button)findViewById(R.id.name));
buttons.add((Button)findViewById(R.id.boutton_eight));
buttons.add((Button)findViewById(R.id.boutton_six));
buttons.add((Button)findViewById(R.id.boutton_five));
buttons.add((Button)findViewById(R.id.time));
buttons.add((Button)findViewById(R.id.boutton_four));
buttons.add((Button)findViewById(R.id.boutton_two));
buttons.add((Button)findViewById(R.id.search_box));
buttons.add((Button)findViewById(R.id.boutton_zero));
buttons.add((Button)findViewById(R.id.boutton_seven));
Collections.shuffle(buttons);
for (int i=0;i<5;i++) {
top_compte.addView(buttons.get(i));
}

//add remaining 5 to second layout
for (int i=5;i<10;i++){
bottom_calculator.addView(buttons.get(i));
}
// ll.addView(top_compte);
ll.addView(bottom_calculator);

我的问题是如何交换布局上按钮的位置。注意按钮 0 到 4 在水平线性布局中,它下面是包含按钮 5 到 9 的第二个水平线性布局。还有 ll 是包含两个水平布局的主线性布局。

最佳答案

您可以尝试动态地(在代码中)创建 Buttons。因此,您将在其中拥有一个 LinearLayout(vertical) 和两个 LinearLayouts(horizo​​ntal)。将您的 xml 文件保存为:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/llShuffleBox"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >

<LinearLayout
android:id="@+id/top_compte"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" >
</LinearLayout>

<LinearLayout
android:id="@+id/bottom_calculator"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" >
</LinearLayout>

</LinearLayout>

现在,对于 Activity 代码:

ll =  (LinearLayout)findViewById(R.id.llShuffleBox);

//create another two linear layouts which will host 5 buttons horizontally
top_compte = (LinearLayout)findViewById(R.id.top_compte);
bottom_calculator= (LinearLayout)findViewById(R.id.bottom_calculator);

// Create an ArrayList to hold the Button objects that we will create
ArrayList<Button> buttonList = new ArrayList<Button>();

// Create the Buttons, set their text as numeral value of the index variable
for (int i = 0; i < 10; i++) {
Button b = new Button(this);
b.setText("" + (i+1));
b.setGravity(Gravity.CENTER_HORIZONTAL);

buttonList.add(b);
}

// Shuffle
Collections.shuffle(buttonList);


for (int i = 0; i < 10; i++) {

// Add the first five Buttons to top_compte
// Add the last five Buttons to bottom_calculator
if (i < 5) {
top_compte.addView(buttonList.get(i));
} else {
bottom_calculator.addView(buttonList.get(i));
}
}

编辑 1:

声明并初始化这个全局变量:

// Global variable
int id = 1;

将以下方法添加到您的 Activity 中。它将生成一个未在您的 View 树中其他地方使用的 ID。

// Generates and returns a valid id that's not in use
public int generateUniqueId(){
View v = findViewById(id);
while (v != null){
v = findViewById(++id);
}
return id++;
}

更改代码以将 id 设置为按钮:

ll =  (LinearLayout)findViewById(R.id.llShuffleBox);

//create another two linear layouts which will host 5 buttons horizontally
top_compte = (LinearLayout)findViewById(R.id.top_compte);
bottom_calculator= (LinearLayout)findViewById(R.id.bottom_calculator);

// Create an ArrayList to hold the Button objects that we will create
ArrayList<Button> buttonList = new ArrayList<Button>();

// Create the Buttons, set their text as numeral value of the index variable
for (int i = 0; i < 10; i++) {
Button b = new Button(this);
b.setText("" + (i+1));
b.setGravity(Gravity.CENTER_HORIZONTAL);
b.setId(generateUniqueId()); // Set an id to Button

buttonList.add(b);
}

// Shuffle
Collections.shuffle(buttonList);


for (int i = 0; i < 10; i++) {

// Add the first five Buttons to top_compte
// Add the last five Buttons to bottom_calculator
if (i < 5) {
top_compte.addView(buttonList.get(i));
} else {
bottom_calculator.addView(buttonList.get(i));
}
}

您可以使用 getId() 方法检索 ID。如果你不想使用 generateUniqueId() 方法,你可以尝试用 b.setId(我 + 1);。这会将按钮 ID 设置为 1 到 10。但是,如果 View 层次结构中的某些 View 与任何其他 View 具有相同的 ID,则可能会出现问题。

编辑 2:

以下是如何将 OnClickListeners 设置为您动态创建的按钮:

for (int i = 0; i < 10; i++) {
final Button b = new Button(this);
b.setText("" + (i+1));
b.setGravity(Gravity.CENTER_HORIZONTAL);

b.setId(i + 1);

b.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
dealWithButtonClick(b);
}
});

bList.add(b);

}

这里是 dealWithButtonClick(Button) 方法的一种可能实现。您可以更改它以满足您的需要:

public void dealWithButtonClick(Button b) {
switch(b.getId()) {
case 1:
b.setBackground(getResources().getDrawable(R.drawable.some_drawable_1));
break;
case 2:
b.setBackground(getResources().getDrawable(R.drawable.some_drawable_2));
break;

........

........

........

case 10:
b.setBackground(getResources().getDrawable(R.drawable.some_drawable_10));
break;
default:
b.setBackground(getResources().getDrawable(R.drawable.some_drawable_for_when_no_cases_were_matched));
break; }
}

关于android - Android 位置随机播放按钮,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17916803/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com