使用ツール
Android Studio Flamingo | 2022.2.1 Patch 2
1. 通常のプロジェクトを作成する。
ここでは Spinner を設置するので、画面の存在するプロジェクトを作成する。
「Empty Activity」「Empty Views Activity」等のプロジェクトが対象。
「No Activity」でも構わないが、Default Activity の追加が必要になるので、ここでは割愛する。(選択しない)
2. アクティビティに Spinner を設置
activity_main をデザインモードで表示し、Palette → Containers から Spinner を設置する。
項目名 内容 備考 id spinner プログラムから R.id.spinner として参照される。
他と重複しなければ名称は特にこだわらなくて良い。layout_width wrap_content 未設定にすると実行時エラーになる。 layout_height wrap_content layout_constraintEnd_toEndOf parent 未設定でもエラーにならない。
ここでは画面中央に表示したいので設定している。layout_constraintStart_toStartOf parent
3. Spinner の設定と選択時処理を追加
クラス MainActivity に以下を記述する
*1 support_simple_spinner_dropdown_item は以下に含まれるが、どれを指定しても結果は同じになる。(本稿記述時現在)
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 } }
}
*2 Spinner (リスト) の表示方法を変更するには、以下の様にレイアウトファイルを用意する。(プログラムで切り替えることは可能だが、内容の変更はできない)
✓ 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
適用される法律で義務付けられている場合または書面による同意がない限り、
ソフトウェアライセンスに基づいて配布される場合は、「現状のまま」で配布されます。
明示的か黙示的かを問わず、いかなる種類の保証や条件もありません。
言語を管理する権限と制限についてはライセンスを参照してください。
*3この onNothingSelected() が呼ばれるのは、
リソース 備考 Android > app > res > layout > textspec.xml プログラムから R.layout.textspec として参照される。
他と重複しなければ名称は特にこだわらなくて良い。
textspec.xml
これは最低限に必要な項目。textSize="···" はお好みに合わせてください。
<?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" />
上記 support_simple_spinner_dropdown_item.xml をコピーして書き換えても吉。
プログラムも textspec を指定する。
// Spinner 用の項目リストを用意 ArrayAdapter<String> arrayAdapter = new ArrayAdapter<>(MainActivity.this, //androidx.appcompat.R.layout.support_simple_spinner_dropdown_itemR.layout.textspec // ← こっちに変更 ); arrayAdapter.add("項目1"); arrayAdapter.add("項目2"); arrayAdapter.add("項目3");
という、割とレアな状態のときだけ。
- 当該クラスが ListView のリスナーになっていて (ListView のリスナーは setOnItemClickListener() が通常)
- ハードウェアキーボードによって ListView のどこかが選択されている時に、タップ (or マウス) によってその選択がキャンセルされるとき