0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Spinnerで実行時エラー”ArrayAdapter requires the resource ID to be a TextView”が投げられる。

Last updated at Posted at 2019-01-04

基本を疎かにするからヘボいところで引っかかるって話。

現象

空のSpinnerを表示してみる。

ソース

MainActivity.java
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);
    }
}
activity_main.xml
<?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に値を格納してみる。

ソース

MainActivity.java
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);
    }
}
activity_main.xml
変更なしなので省略

実行結果

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に値を設定したいだけなのに...

原因

  1. Spinnerはリストの要素のレイアウト(TextView)を指定する必要がある
  2. 指定する箇所はnew ArrayAdapter(this, R.layout.activity_main, list)の第2引数

根本的には、よくわからんままnew ArrayAdapter(this, R.layout.activity_main, list)の第2引数にactivity_mainを設定しているのが間違い。
そりゃあそうだよ。なんでここにactivity_mainを指定する必要があるんやろ?とあたいも思ったさ。でもまぁそういうもんなんだろうと流したのが間違いだった。
ちゃんとSpinnerの見た目を変えたいって需要を見越して要素のデフォルトレイアウトなんか持たずに、はじめっからレイアウトを手前ェで指定しろや!ってことなんでしょうねぇ。

解決

ソース

MainActivity.java
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);
    }
}
activity_main.xml
変更なしなので省略
spinner_row.xml
<?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>

実行結果

出来はりましたわ...

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?