This question already has an answer here:
I have an Android form that needs to update itself based on certain selections. The form is currently made up of 2 Spinners (A and B). Spinner B not created until Spinner A's selection is made. After the selection is made B will be displayed to the view and it's contents dynamically filled based on A's selection. Here is my code:
public class MyForm extends Activity
{
private final int SEL_ACTIVATE = 0;
private final int SEL_DEACTIVATE = 1;
private static final String[] actionList = {"Activate", "Deactivate" };
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
table = (TableLayout) findViewById(R.id.table);
showListA(table);
}
public void showListA(View v)
{
rowAction = new TableRow(this);
Spinner spinner = new Spinner(this);
spinner.setPrompt("Select...");
spinner.setOnItemSelectedListener(
new OnItemSelectedListener()
{
public void onItemSelected(AdapterView<?> parent, View v, int position, long id)
{
switch (position)
{
case SEL_ACTIVATE:
case SEL_DEACTIVATE:
showListB(v);
break;
}
}
public void onNothingSelected(AdapterView<?> arg0)
{
// TODO Auto-generated method stub
}
});
ArrayAdapter<String> adapter = new ArrayAdapter<String> (this, android.R.layout.simple_spinner_item, actionList);
adapter.setDropDownViewResource(android.R.layout.simple_dropdown_item_1line);
spinner.setAdapter(adapter);
rowAction.addView(tvAction);
rowAction.addView(spinner);
table.addView(rowAction, new TableLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
}
...
}
This code works correctly. When either "Activate" or "Deactivate" are selected from the list, showListB()
executes which is very similar to showListA()
in how it creates a new row which contains Label and Spinner.
The problem is that, by default, "Activate" is shown in the Spinner which executes showListB()
and right off the bat, the second part of the form is created based on the "Activate" option. The only workaround that I can come up with is to add a third field to the Spinner like so:
private static final String[] actionList = {"None", "Activate", "Deactivate" };
...
switch (position)
{
case SEL_NONE:
break;
case SEL_ACTIVATE:
case SEL_DEACTIVATE:
showListB(v);
break;
}
This works... but I don't want a third option in the list. I just want it to, by default, be blank or show some sort of 'prompt' text that is not an option in the list once it is pressed. Is this possible?
Thanks
EDIT:
xml content:
<Spinner
android:id="@+id/spinnerAction"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
If you want, there is a decorater spinnerAdapter witch add automatically a default value :
Then you can create your own spinner using this decorater :
You just have to change the spinner declaration in your xml layout :
If you want, you can change the code to set the default text in the tag of your spinner.
The Spinner will always have a selection. What you can do is make the Spinner display something like "Select"or "Select a option"...
To do this you can make your list options to be
and
or you can do something more complicated like overrides the Spinner View or put a button instead with nothing on it and when it's clicked you create your spinner.
My data-sizes.xml:
In main.xml:
In Java Code:
So, although I can see 2 as my first default item, nothing happens unless user actually selects it.
Hope this helps!
I'm just a begginner at android app development, and was facing a similar problem; was able to sort it out using a simple solution- this worked for me, hope it does for you also:
public class AdmissionActivity extends Activity implements OnItemSelectedListener{
........ .....
// changed to sumtng else
Try setting this in xml with the prompt attribute:
This will also fill in the top of the spinner dialog.
I overlooked this in the documentation. The prompt can not be directly applied. The prompt attribute has to be referenced from another source. Try referencing a string value.
Documentation from Android: