基本を疎かにするからヘボいところで引っかかるって話。
現象
空のSpinnerを表示してみる。
ソース
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ArrayAdapter adapter = new ArrayAdapter(this, R.layout.activity_main, list);
Spinner spinner = (Spinner)findViewById(R.id.spinner);
spinner.setAdapter(adapter);
}
}
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<Spinner
android:id="@+id/spinner"
android:layout_width="match_parent"
android:layout_height="wrap_content"
tools:layout_editor_absoluteX="8dp"
tools:layout_editor_absoluteY="208dp" />
</android.support.constraint.ConstraintLayout>
実行結果
エラーなく空のSpinnerが表示される。
よしよし。
Spinnerに値を格納してみる。
ソース
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ArrayAdapter adapter = new ArrayAdapter(this, R.layout.activity_main, Arrays.asList("AA", "BB", "CC"));
Spinner spinner = (Spinner)findViewById(R.id.spinner);
spinner.setAdapter(adapter);
}
}
変更なしなので省略
実行結果
java.lang.IllegalStateException: ArrayAdapter requires the resource ID to be a TextView
Caused by: java.lang.ClassCastException: android.support.constraint.ConstraintLayout cannot be cast to android.widget.TextView
ファッ!?
なんじゃこりゃ?
TextViewが必要とか、TextViewがないからダメなんだよ、と言われていることは分かった。
ただ、別にTextViewなんていじってないし...
あたいはだたSpinnerに値を設定したいだけなのに...
原因
- Spinnerはリストの要素のレイアウト(TextView)を指定する必要がある
- 指定する箇所は
new ArrayAdapter(this, R.layout.activity_main, list)
の第2引数
根本的には、よくわからんままnew ArrayAdapter(this, R.layout.activity_main, list)
の第2引数にactivity_mainを設定しているのが間違い。
そりゃあそうだよ。なんでここにactivity_mainを指定する必要があるんやろ?とあたいも思ったさ。でもまぁそういうもんなんだろうと流したのが間違いだった。
ちゃんとSpinnerの見た目を変えたいって需要を見越して要素のデフォルトレイアウトなんか持たずに、はじめっからレイアウトを手前ェで指定しろや!ってことなんでしょうねぇ。
解決
ソース
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ArrayAdapter adapter = new ArrayAdapter(this, R.layout.spinner_row, Arrays.asList("AA", "BB", "CC"));
Spinner spinner = (Spinner)findViewById(R.id.spinner);
spinner.setAdapter(adapter);
}
}
変更なしなので省略
<?xml version="1.0" encoding="utf-8"?>
<TextView
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
</TextView>
実行結果
出来はりましたわ...