JavaでAndroid Studioアプリ開発を試みるの第5回 「ボタン関連②」

Android Studioのボタン操作でようやくボタン関連の最初の3行の説明ができました。
activityという画面構成のボタン部品をMainActivityというJavaプログラムから呼び出す。
そして、まだ未作成のボタン用のリスナを生成して、ボタン部品と紐づけた。

いまは、まだその状態です。
次のステップとしては、未作成だったボタン用のリスナというものを作っていきたいと思います。

 

ボタン操作のためのソースコード②

前回作成したのが青文字の箇所。
そして、今回追加したのが赤文字の箇所です。
赤文字の箇所は、アプリ起動直後に実行されるonCreateメソッドの下に記載してます。

リスナクラスというものをMainActivityクラスの中に記載しております。
privateという扱いのクラスなので、MainActivityの中で使うためだけのクラスです。

java -> com.aoi345.btnsample -> Main_Activity
public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //ボタンの処理
        //部品の情報を取得
        Button confirmBtn = findViewById(R.id.confirmButton);
        //リスナの生成
        confirmBtnLister btn_listener = new confirmBtnLister();
        //リスナの設定
        confirmBtn.setOnClickListener(btn_listener);
    }

    //ボタンクリック時のリスナクラス
    private class confirmBtnLister implements View.OnClickListener {

        @Override
        public void onClick(View view) {

            //部品の情報を取得
            EditText input_text = findViewById(R.id.inputText);
            ListView lvOutput = findViewById(R.id.outputList);

            //リストの準備
            List<String> outputList = new ArrayList<>();
            //リストにデータを登録(入力された文字列を登録)
            outputList.add(input_text.getText().toString());

            //アダプターの生成
            ArrayAdapter<String> adapter = new ArrayAdapter<>(MainActivity.this, android.R.layout.simple_list_item_1, outputList);
            //アダプタの設定
            lvOutput.setAdapter(adapter);
        }
    }

まずは最初のクラスの定義の箇所ですが、下記のように記載されております。
private class confirmBtnLister implements View.OnClickListener

privateに関しては、他のクラスから呼び出す必要が無いので、そのように定義されております。
このアクセス修飾子は以前に説明したとおりです。

JavaでAndroid Studioアプリ開発を試みるの第1回 「アクセス修飾子」

 

その次がclassですが、これはクラスを作りますよというだけ。
その次のconfirmBtnListerは私がそういうクラス名にしようとしただけで、好きな名前を付けることができます。

さて、その次・・・。
implements

出ました!!
そういえば、MainActivityはextendsっていう記載がありましたね。
ここら辺はjavaの基本的な話なのですが、次回にでも説明をまとめようと思います。

ざっくりですが、implements View.OnClickListenerというのは、View.OnClickListenerで決められたルールに従って今回作成するクラスファイルを書きましょう。
という事です。

ボタンのリスナを作るときは、View.OnClickListenerというルールに従って作りましょうという事です。
これをimprementsすると下記の記載が必要になります。
public void onClick(View view) {}

confirmBtnListerクラスの中で、上記のメソッドを上書きする必要がある訳です。
上記のメソッドが何かといえば、ボタンがクリックされたときに何をするかを記載するメソッドです。

 

画面の部品の話に少し話を戻す

さて次の行に説明を移す前に、activity_main.xmlに話を戻します。
というのも、現時点だとボタンだけがあるだけで、そのボタンを押すことによる対象が無いためです。

追加したのが赤文字の部分です。
inputTextという名前のEditText=ユーザーが入力できるテキストボックス。
lvOutputという名前のListView=テキストなどをリスト表示するもの。

それに、青文字で前回追加したconfirmButtonという名前のボタンがあります。

res -> layout -> activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.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">

    <EditText
        android:id="@+id/inputText"
        android:layout_width="0dp"
        android:layout_weight="1"
        android:layout_height="wrap_content"
        android:inputType="text"
        android:text="@string/input_text_default"
        android:textSize="24sp"
        app:layout_constraintEnd_toStartOf="@+id/confirmButton"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        />

    <Button
        android:id="@+id/confirmButton"
        android:text="@string/confirm_btn_name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:layout_constraintEnd_toEndOf="parent"
        />

    <ListView
        android:id="@+id/lvOutput"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:entries="@array/output_list"
        app:layout_constraintTop_toBottomOf="@+id/confirmButton"
        app:layout_constraintBottom_toBottomOf="parent"
        />

</androidx.constraintlayout.widget.ConstraintLayout>

 

また、Main_Activityに戻ます

さて、Main_Activityのpublic void onClick(View view) {***}の中身に話を戻ります。

//部品の情報を取得
EditText input_text = findViewById(R.id.inputText);
ListView lvOutput = findViewById(R.id.outputList);

この部分です。
ここでは、onClickの中でactivity_main.xmlの方で記載したEditTextとListViewを取り扱えるようにするコードです。

input_textという名前のEditTextに findViewById(R.id.部品のID)というメソッドで探してきた部品を紐づけます。
このfindViewByIdというメソッドは、activity_main.xmlに記載された部品を取り扱う際に使うメソッドで、よく使います。

EditTextに入力された値をボタンの操作によって、リスト表示化させる部分が下記です。

//リストの準備
List<String> outputList = new ArrayList<>();

まずは、ListViewという表示形式に入れる文字列リストを作ります。
outputListという名前で、ArrayListというリストを作っています。
リストの中身は空の状態です。

//リストにデータを登録(入力された文字列を登録)
outputList.add(input_text.getText().toString());

次のこの部分は、input_text.getText().toString()という部分で①input_text.getText()でEditTextに入力された値を取得、②.toString()で文字列型に変換。
それをoutputListのaddというメソッドで、EditTextに入力された値をリストに追加しています。

これで、リストにEditTextの値が入っているのですが、まだListViewには値が入って居ません。
そのため、最後にoutputListの値をlvOutputというリストビュー部品に入れます。

そのために必要なのがadapterというやつです。
ArrayListのリストの場合には、ArrayAdapterというアダプターを使用します。

//アダプターの生成
ArrayAdapter<String> adapter = new ArrayAdapter<>(MainActivity.this, android.R.layout.simple_list_item_1, outputList);

ArrayAdapterの引数は3つです。
1つめは、どの画面(Activity)のListViewかという設定で、activity_mainの場合はMainActivity.thisと記載します。
2つめが、リストビューの見た目(レイアウト)をどれにしますか?という設定です。今回記載した「android.R.layout.simple_list_item_1」は1行のテキストを表示するときに使うレイアウトです。
3つ目は、outputListと書かれている通り、どのリストの値を入れますか?という設定です。

最後に忘れてはいけないのが、下記の部分です。

//アダプタの設定
lvOutput.setAdapter(adapter);

まだ、Adapterを作っただけの状態。
リストとリストビューを接続するためのパーツです。
しかし、ListViewに対してAdapterを適用してはいない。

実際にListViewにAdapterを適用するのが、setAdapterというメソッドで、リストビューのインスタンス.setAdapter(設定したいアダプター)と記載することで、アダプターがリストビューに設定されます。
これで、入力ボックスに入力した値がボタンを押すことでその下にあるリストに表示されるようになります。

まとめ

ちょっと、リストビューを使わずにTextViewを使えばよかったですね。。
Adapterの説明が必要にになって、ちょっと難しくなってしまいました。
まぁ、どのみちAdapterの知識は必要になるので、良しとしましょう。

しかし、ボタンの操作を少しメモ取るだけで、これか・・・。
ソースコードを書くだけならサクッと進むので、やはりブログ更新を並行するのは辛いですね。

なお、説明手順の都合で、List<String> outputList = new ArrayList<>();の位置がリスナの中なので、文字列は追加ごとに増えません。
リストビューの意味ないですね・・・。
Main_Activityの直下に移動させれば、文字列がボタン操作ごとに追加されていきます。

 

JavaでAndroid Studioアプリ開発を試みるの第4回 「ボタン関連①」
https://aoi345.com/memorandum/android-studio-button-1/

JavaでAndroid Studioアプリ開発を試みるの第4回 「ボタン関連①」