スピナーを設置
〜 Android Studio の使い方 11 〜
2023-05-30 作成 福島
TOP > androidstudio > spinner

使用ツール

    Android Studio Flamingo | 2022.2.1 Patch 2  


1. 通常のプロジェクトを作成する。

ここでは Spinner を設置するので、画面の存在するプロジェクトを作成する。
「Empty Activity」「Empty Views Activity」等のプロジェクトが対象。
「No Activity」でも構わないが、Default Activity の追加が必要になるので、ここでは割愛する。(選択しない)


2. アクティビティに Spinner を設置

activity_main をデザインモードで表示し、PaletteContainers から Spinner を設置する。
項目名内容備考
idspinnerプログラムから R.id.spinner として参照される。
他と重複しなければ名称は特にこだわらなくて良い。
layout_widthwrap_content未設定にすると実行時エラーになる。
layout_heightwrap_content
layout_constraintEnd_toEndOfparent未設定でもエラーにならない。
ここでは画面中央に表示したいので設定している。
layout_constraintStart_toStartOfparent


3. Spinner の設定と選択時処理を追加

クラス MainActivity に以下を記述する
public class MainActivity extends AppCompatActivity {


int currentPosition = 0; // 項目リストのインデックス (初期値)
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);
// Spinner 用の項目リストを用意 ArrayAdapter<String> arrayAdapter = new ArrayAdapter<>(MainActivity.this, androidx.appcompat.R.layout.support_simple_spinner_dropdown_item // 基本のスタイル*1 *2 ); arrayAdapter.add("項目1"); arrayAdapter.add("項目2"); arrayAdapter.add("項目3"); // Spinner に項目リストを設定 Spinner spinner = findViewById(R.id.spinner); spinner.setAdapter(arrayAdapter); spinner.setSelection(currentPosition); spinner.setVisibility(View.VISIBLE); // これはお好みで // Spinner にリスナーを設定 spinner.setOnItemSelectedListener(new onItemSelectedListener());
}
// Spinner の選択時処理 class onItemSelectedListener implements AdapterView.OnItemSelectedListener { @Override public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { if(currentPosition != position) { String selectedItem = (String) parent.getSelectedItem(); Toast.makeText(MainActivity.this, "Value changed:" + position + " " + selectedItem, Toast.LENGTH_LONG).show(); currentPosition = position; } } @Override public void onNothingSelected(AdapterView<?> parent) { // Spinner には関係ないが、記述しないとエラーにされるので空で用意する*3 } }
}
*1 support_simple_spinner_dropdown_item は以下に含まれるが、どれを指定しても結果は同じになる。(本稿記述時現在)
androidx.appcompat.R.layout.
androidx.constraintlayout.widget.R.layout.
com.google.android.material.R.layout.

R.layout.support_simple_spinner_dropdown_item.xml の内容は以下。
<?xml version="1.0" encoding="utf-8"?>
<!--
**
** Copyright 2008, The Android Open Source Project
**
** Licensed under the Apache License, Version 2.0 (the "License"); 
** you may not use this file except in compliance with the License. 
** You may obtain a copy of the License at 
**
**     http://www.apache.org/licenses/LICENSE-2.0 
**
** Unless required by applicable law or agreed to in writing, software 
** distributed under the License is distributed on an "AS IS" BASIS, 
** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
** See the License for the specific language governing permissions and 
** limitations under the License.
*/
-->
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
          android:id="@android:id/text1"
          style="?attr/spinnerDropDownItemStyle"
          android:singleLine="true"
          android:layout_width="match_parent"
          android:layout_height="?attr/dropdownListPreferredItemHeight"
          android:ellipsize="marquee"/>

Apache License バージョン 2.0 に基づいてライセンスされています。
ライセンスに準拠しない場合、このファイルを使用することはできません。
ライセンスのコピーは次の場所で入手できます。

    http://www.apache.org/licenses/LICENSE-2.0

適用される法律で義務付けられている場合または書面による同意がない限り、
ソフトウェアライセンスに基づいて配布される場合は、「現状のまま」で配布されます。
明示的か黙示的かを問わず、いかなる種類の保証や条件もありません。
言語を管理する権限と制限についてはライセンスを参照してください。
*2 Spinner (リスト) の表示方法を変更するには、以下の様にレイアウトファイルを用意する。(プログラムで切り替えることは可能だが、内容の変更はできない)
リソース備考
Android > app > res > layout > textspec.xmlプログラムから R.layout.textspec として参照される。
他と重複しなければ名称は特にこだわらなくて良い。

textspec.xml
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://shemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:textSize="30sp"
    />
これは最低限に必要な項目。textSize="···" はお好みに合わせてください。
上記 support_simple_spinner_dropdown_item.xml をコピーして書き換えても吉。

プログラムも textspec を指定する。

// Spinner 用の項目リストを用意 ArrayAdapter<String> arrayAdapter = new ArrayAdapter<>(MainActivity.this, //androidx.appcompat.R.layout.support_simple_spinner_dropdown_item R.layout.textspec // ← こっちに変更 ); arrayAdapter.add("項目1"); arrayAdapter.add("項目2"); arrayAdapter.add("項目3");
*3この onNothingSelected() が呼ばれるのは、
という、割とレアな状態のときだけ。