Android 动态多重微调器创建
Android Dynamic multiple spinners creation
我已经完成了关于 "Creating multiple spinners dynamically" 的所有答案,但是创建的多个微调器覆盖了之前生成的微调器。我们尝试使用 LayoutParams 和 params.setMargins,但无法为每一代微调器指定视图。
我的要求是生成 "n" 个微调器,其中 n 根据要求指定。
在每个微调器生成相互覆盖的地方部分工作的代码如下:
public class newstatusinfo extends AppCompatActivity {
List<String> values = new ArrayList<String>();
ArrayAdapter<String>a;
Spinner spin;
int a1=5,b1=5,c1=0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.witnesslay);
spin=(Spinner)findViewById(R.id.spinner21);
LinearLayout.LayoutParams params = new
LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,
LinearLayout.LayoutParams.WRAP_CONTENT);
for (int i = 0; i < 2; i++) {
values.add(String.valueOf(a1));
values.add(String.valueOf(b1));
params.setMargins(0,a1,0,b1);
System.out.println("a1:"+a1);
System.out.println("b1:"+b1);
ArrayAdapter<String> adapter = new ArrayAdapter<>(this, android
.R.layout.simple_spinner_dropdown_item, values);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item;
spin.setAdapter(adapter);
spin.setLayoutParams(params);
System.out.println("i:"+i);
a1=a1+5;
b1=b1+5;
}
}}
截图如下:
我们需要的是像上图这样的多个微调器,一个一个垂直放置,每个微调器都有一组特定的值。
我怀疑这是否是您想要的。
enter image description here
你刚才说了
Creating multiple spinners dynamically
是指通过java代码动态生成View吗?如果是,请阅读我的code.I认为使用MARGIN和正确显示Spinner之间没有关联关系。
public class newstatusinfo extends AppCompatActivity {
int a1 = 0, b1 = 5, c1 = 10;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
LinearLayout rootView = new LinearLayout(this);
rootView.setOrientation(LinearLayout.HORIZONTAL);
for (int i = 0; i < 3; i++) {
Spinner spin = new Spinner(this);
rootView.addView(spin);
LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) spin.getLayoutParams();
params.width = LinearLayout.LayoutParams.WRAP_CONTENT;
params.height = LinearLayout.LayoutParams.WRAP_CONTENT;
spin.setLayoutParams(params);
List<String> values = new ArrayList<String>();
values.add(String.valueOf(a1));
values.add(String.valueOf(b1));
values.add(String.valueOf(c1));
System.out.println("a1:" + a1);
System.out.println("b1:" + b1);
System.out.println("c1:" + c1);
ArrayAdapter<String> adapter = new ArrayAdapter<>(this, android
.R.layout.simple_spinner_dropdown_item, values);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spin.setAdapter(adapter);
spin.setLayoutParams(params);
System.out.println("i:" + i);
a1 = a1 + 5;
b1 = b1 + 5;
c1 = c1 + 5;
}
setContentView(rootView);
}
}
首先,英语不是我的母语。可能会有一些语法错误和误解。我会尽力理解你的问题并回答他们。 :-D 我们开始吧:
据我了解,您发出了两个问题:
1 How to set STYLE for spinners' arrow?
2 How to store values of all spinners?
首先,回答关于STYLE的问题。很抱歉,我没有找到如何完美设置箭头样式的方法。但我有两个建议:
1.1 您可以设置微调器箭头的颜色。像那样:
int[][] states = new int[6][2];
states[0] = new int[]{android.R.attr.state_pressed, android.R.attr.state_enabled};
states[1] = new int[]{android.R.attr.state_enabled, android.R.attr.state_focused};
states[2] = new int[]{android.R.attr.state_enabled};
states[3] = new int[]{android.R.attr.state_focused};
states[4] = new int[]{android.R.attr.state_window_focused};
states[5] = new int[]{};
int[] colors = new int[]{0xffffffff, 0xffffff00, 0xff0000ff, 0xffff0000, 0xff0000ff, 0xffff0000};
ColorStateList csl = new ColorStateList(states, colors);
spin.setBackgroundTintList(csl);
或在 Spinner 的布局文件中将其声明为 Spinner 的 android:backgroundTint="#00ff00"
。
如果您对上面的代码感到困惑。请Google这个词'ColorStateList',你就明白了。
1.2 您可以在微调器所在的位置放置一个 TextView。将 Spinner 的点击事件绑定到 TextView 上。然后你可以随意设置TextView的Style
2 存储值:
话不多说,直接给你看我的代码。
public class MainActivity extends AppCompatActivity {
private List<List<String>> spinnersValues = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
initData();//store the values of all spinners
LinearLayout rootView = new LinearLayout(this);
rootView.setOrientation(LinearLayout.HORIZONTAL);
for (int i = 0; i < 3; i++) {
Spinner spin = new Spinner(this);
rootView.addView(spin);
LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) spin.getLayoutParams();
params.width = LinearLayout.LayoutParams.WRAP_CONTENT;
params.height = LinearLayout.LayoutParams.WRAP_CONTENT;
spin.setLayoutParams(params);
List<String> values = spinnersValues.get(i);//fetch the values of one of the spinners
ArrayAdapter<String> adapter = new ArrayAdapter<>(this, android.R.layout.simple_spinner_dropdown_item, values);
spin.setAdapter(adapter);
spin.setLayoutParams(params);
}
setContentView(rootView);
}
private void initData() {
List<String> fruits = new ArrayList<String>();
fruits.add("apple");
fruits.add("pear");
fruits.add("cherry");
fruits.add("grape");
List<String> furniture = new ArrayList<String>();
furniture.add("desk");
furniture.add("chair");
furniture.add("bench");
List<String> animals = new ArrayList<String>();
animals.add("dog");
animals.add("cat");
animals.add("cow");
animals.add("rabbit");
animals.add("horse");
animals.add("tiger");
animals.add("lion");
spinnersValues.add(fruits);
spinnersValues.add(furniture);
spinnersValues.add(animals);
}
}
我已经完成了关于 "Creating multiple spinners dynamically" 的所有答案,但是创建的多个微调器覆盖了之前生成的微调器。我们尝试使用 LayoutParams 和 params.setMargins,但无法为每一代微调器指定视图。
我的要求是生成 "n" 个微调器,其中 n 根据要求指定。 在每个微调器生成相互覆盖的地方部分工作的代码如下:
public class newstatusinfo extends AppCompatActivity {
List<String> values = new ArrayList<String>();
ArrayAdapter<String>a;
Spinner spin;
int a1=5,b1=5,c1=0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.witnesslay);
spin=(Spinner)findViewById(R.id.spinner21);
LinearLayout.LayoutParams params = new
LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,
LinearLayout.LayoutParams.WRAP_CONTENT);
for (int i = 0; i < 2; i++) {
values.add(String.valueOf(a1));
values.add(String.valueOf(b1));
params.setMargins(0,a1,0,b1);
System.out.println("a1:"+a1);
System.out.println("b1:"+b1);
ArrayAdapter<String> adapter = new ArrayAdapter<>(this, android
.R.layout.simple_spinner_dropdown_item, values);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item;
spin.setAdapter(adapter);
spin.setLayoutParams(params);
System.out.println("i:"+i);
a1=a1+5;
b1=b1+5;
}
}}
截图如下:
我们需要的是像上图这样的多个微调器,一个一个垂直放置,每个微调器都有一组特定的值。
我怀疑这是否是您想要的。 enter image description here
你刚才说了
Creating multiple spinners dynamically
是指通过java代码动态生成View吗?如果是,请阅读我的code.I认为使用MARGIN和正确显示Spinner之间没有关联关系。
public class newstatusinfo extends AppCompatActivity {
int a1 = 0, b1 = 5, c1 = 10;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
LinearLayout rootView = new LinearLayout(this);
rootView.setOrientation(LinearLayout.HORIZONTAL);
for (int i = 0; i < 3; i++) {
Spinner spin = new Spinner(this);
rootView.addView(spin);
LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) spin.getLayoutParams();
params.width = LinearLayout.LayoutParams.WRAP_CONTENT;
params.height = LinearLayout.LayoutParams.WRAP_CONTENT;
spin.setLayoutParams(params);
List<String> values = new ArrayList<String>();
values.add(String.valueOf(a1));
values.add(String.valueOf(b1));
values.add(String.valueOf(c1));
System.out.println("a1:" + a1);
System.out.println("b1:" + b1);
System.out.println("c1:" + c1);
ArrayAdapter<String> adapter = new ArrayAdapter<>(this, android
.R.layout.simple_spinner_dropdown_item, values);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spin.setAdapter(adapter);
spin.setLayoutParams(params);
System.out.println("i:" + i);
a1 = a1 + 5;
b1 = b1 + 5;
c1 = c1 + 5;
}
setContentView(rootView);
}
}
首先,英语不是我的母语。可能会有一些语法错误和误解。我会尽力理解你的问题并回答他们。 :-D 我们开始吧: 据我了解,您发出了两个问题:
1 How to set STYLE for spinners' arrow?
2 How to store values of all spinners?
首先,回答关于STYLE的问题。很抱歉,我没有找到如何完美设置箭头样式的方法。但我有两个建议:
1.1 您可以设置微调器箭头的颜色。像那样:
int[][] states = new int[6][2];
states[0] = new int[]{android.R.attr.state_pressed, android.R.attr.state_enabled};
states[1] = new int[]{android.R.attr.state_enabled, android.R.attr.state_focused};
states[2] = new int[]{android.R.attr.state_enabled};
states[3] = new int[]{android.R.attr.state_focused};
states[4] = new int[]{android.R.attr.state_window_focused};
states[5] = new int[]{};
int[] colors = new int[]{0xffffffff, 0xffffff00, 0xff0000ff, 0xffff0000, 0xff0000ff, 0xffff0000};
ColorStateList csl = new ColorStateList(states, colors);
spin.setBackgroundTintList(csl);
或在 Spinner 的布局文件中将其声明为 Spinner 的 android:backgroundTint="#00ff00"
。
如果您对上面的代码感到困惑。请Google这个词'ColorStateList',你就明白了。
1.2 您可以在微调器所在的位置放置一个 TextView。将 Spinner 的点击事件绑定到 TextView 上。然后你可以随意设置TextView的Style
2 存储值: 话不多说,直接给你看我的代码。
public class MainActivity extends AppCompatActivity {
private List<List<String>> spinnersValues = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
initData();//store the values of all spinners
LinearLayout rootView = new LinearLayout(this);
rootView.setOrientation(LinearLayout.HORIZONTAL);
for (int i = 0; i < 3; i++) {
Spinner spin = new Spinner(this);
rootView.addView(spin);
LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) spin.getLayoutParams();
params.width = LinearLayout.LayoutParams.WRAP_CONTENT;
params.height = LinearLayout.LayoutParams.WRAP_CONTENT;
spin.setLayoutParams(params);
List<String> values = spinnersValues.get(i);//fetch the values of one of the spinners
ArrayAdapter<String> adapter = new ArrayAdapter<>(this, android.R.layout.simple_spinner_dropdown_item, values);
spin.setAdapter(adapter);
spin.setLayoutParams(params);
}
setContentView(rootView);
}
private void initData() {
List<String> fruits = new ArrayList<String>();
fruits.add("apple");
fruits.add("pear");
fruits.add("cherry");
fruits.add("grape");
List<String> furniture = new ArrayList<String>();
furniture.add("desk");
furniture.add("chair");
furniture.add("bench");
List<String> animals = new ArrayList<String>();
animals.add("dog");
animals.add("cat");
animals.add("cow");
animals.add("rabbit");
animals.add("horse");
animals.add("tiger");
animals.add("lion");
spinnersValues.add(fruits);
spinnersValues.add(furniture);
spinnersValues.add(animals);
}
}