Androidフォームがあり、特定の選択に基づいて更新する必要があります。フォームは現在2つのスピナー(AとB)で構成されています。スピナーBは、スピナーAの選択が行われるまで作成されません。選択が行われると、Bがビューに表示され、その内容がAの選択に基づいて動的に入力されます。コードは次のとおりです。
_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));
}
...
}
_
このコードは正しく機能します。リストから「アクティブ化」または「非アクティブ化」のいずれかを選択すると、showListB()
が実行されます。これは、LabelとSpinnerを含む新しい行を作成する方法がshowListA()
と非常によく似ています。
問題は、デフォルトで、「Activate」がshowListB()
を実行するスピナーに表示され、すぐにフォームの2番目の部分が「Activate」オプションに基づいて作成されることです。私が思いつくことができる唯一の回避策は、次のようにスピナーに3番目のフィールドを追加することです。
_private static final String[] actionList = {"None", "Activate", "Deactivate" };
...
switch (position)
{
case SEL_NONE:
break;
case SEL_ACTIVATE:
case SEL_DEACTIVATE:
showListB(v);
break;
}
_
これは機能します...しかし、リストに3番目のオプションは必要ありません。デフォルトでは、空白にするか、一度押すとリストのオプションではない「プロンプト」テキストを表示したいだけです。これは可能ですか?
ありがとう
編集:
xmlコンテンツ:
_<Spinner
Android:id="@+id/spinnerAction"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"/>
_
私のdata-sizes.xml:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string-array name="chunks">
<item>2</item>
<item>4</item>
<item>8</item>
<item>16</item>
<item>32</item>
</string-array>
</resources>
Main.xml内:
<Spinner Android:id="@+id/spinnerSize"
Android:layout_marginLeft="50px"
Android:layout_width="fill_parent"
Android:drawSelectorOnTop="true"
Android:layout_marginTop="5dip"
Android:Prompt="@string/SelectSize"
Android:layout_marginRight="30px"
Android:layout_height="35px" />
Javaコード:
Spinner spinnerSize;
ArrayAdapter adapter;
...
spinnerSize = (Spinner)findViewById(R.id.spinnerSize);
adapter = ArrayAdapter.createFromResource(this, R.array.chunks, Android.R.layout.simple_spinner_item);
adapter.setDropDownViewResource(Android.R.layout.simple_spinner_dropdown_item);
spinnerSize.setAdapter(adapter);
spinnerSize.setOnItemSelectedListener(new MyOnItemSelectedListener());
...
class MyOnItemSelectedListener implements OnItemSelectedListener {
public void onItemSelected(AdapterView<?> parent,
View view, int pos, long id) {
chunkSize = new Integer(parent.getItemAtPosition(pos).toString()).intValue();
}
public void onNothingSelected(AdapterView<?> parent) {
// Dummy
}
}
したがって、2を最初のデフォルト項目として見ることができますが、ユーザーが実際にそれを選択しない限り、何も起こりません。
お役に立てれば!
必要に応じて、デコレータspinnerAdapterwitchがデフォルト値を自動的に追加します。
protected class SpinnerAdapterWithNoValue implements SpinnerAdapter {
private SpinnerAdapter _current;
private final static String defaultValue = "Choisir";
public SpinnerAdapterWithNoValue(SpinnerAdapter base) {
_current = base;
}
@Override
public int getCount() {
return _current.getCount() + 1;
}
@Override
public Object getItem(int position) {
if (position == 0 || position == -1) {
return null;
}
return _current.getItem(position - 1);
}
@Override
public long getItemId(int position) {
if (position == 0 || position == -1) {
return -1;
}
return _current.getItemId(position - 1);
}
@Override
public int getItemViewType(int position) {
if (position == 0 || position == -1) {
return -1;
}
return _current.getItemViewType(position - 1);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (position == 0 || position == -1) {
final TextView v = (TextView) ((LayoutInflater) getContext().getSystemService(
Context.LAYOUT_INFLATER_SERVICE)).inflate(R.layout.spinner_text, parent, false);
v.setText(defaultValue);
return v;
}
return _current.getView(position - 1, convertView, parent);
}
@Override
public int getViewTypeCount() {
return _current.getViewTypeCount();
}
@Override
public boolean hasStableIds() {
return _current.hasStableIds();
}
@Override
public boolean isEmpty() {
return _current.isEmpty();
}
@Override
public void registerDataSetObserver(DataSetObserver observer) {
_current.registerDataSetObserver(observer);
}
@Override
public void unregisterDataSetObserver(DataSetObserver observer) {
// TODO Auto-generated method stub
_current.unregisterDataSetObserver(observer);
}
@Override
public View getDropDownView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
if (position == 0 || position == -1) {
CheckedTextView v = (CheckedTextView) ((LayoutInflater) getContext().getSystemService(
Context.LAYOUT_INFLATER_SERVICE)).inflate(Android.R.layout.simple_spinner_dropdown_item, parent,
false);
v.setText(defaultValue);
return v;
}
return _current.getDropDownView(position - 1, convertView, parent);
}
}
次に、このデコレータを使用して独自のスピナーを作成できます。
public class SpinnerWithNoValue extends Spinner {
public SpinnerWithNoValue(Context context) {
super(context);
}
public SpinnerWithNoValue(Context context, AttributeSet attrs) {
super(context, attrs);
}
public SpinnerWithNoValue(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
@Override
public void setAdapter(SpinnerAdapter orig) {
final SpinnerAdapter adapter = new SpinnerAdapterWithNoValue(orig);
super.setAdapter(adapter);
try {
final Method m = AdapterView.class.getDeclaredMethod("setNextSelectedPositionInt", int.class);
m.setAccessible(true);
m.invoke(this, -1);
final Method n = AdapterView.class.getDeclaredMethod("setSelectedPositionInt", int.class);
n.setAccessible(true);
n.invoke(this, -1);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
/*
* getSelectedItem renvoi null si la valeur par defaut est séléctionnée
*
* @see Android.widget.AdapterView#getSelectedItem()
*/
@Override
public Object getSelectedItem() {
return super.getSelectedItem();
}
}
Xmlレイアウトのスピナー宣言を変更する必要があります:
com.myproject.SpinnerWithNoValue
必要に応じて、コードを変更して、スピナーのタグにデフォルトのテキストを設定できます。
スピナーには常に選択肢があります。あなたができることは、スピナーに「選択」や「オプションを選択」のようなものを表示させることです...
これを行うには、リストオプションを次のようにすることができます
actionList = {"Select", "Desactivate" }
そして
public void onItemSelected(AdapterView<?> arg0, View arg1, int position, long id) {
actionList[0] = "Activate";
...
}
または、スピナービューをオーバーライドしたり、ボタンを何も付けずにボタンを配置したりして、クリックするとスピナーを作成するなど、より複雑な操作を行うことができます。