Android – フィールドの動的な追加_1

投稿者: | 2018年12月1日

Androidアプリの画面フィールドは、レイアウトXMLファイルで記述することが多いと思いますが、場合によっては何かのイベントをきっかけに、動的に追加・変更したいこともあります。

ボタンを押すと、そのたびにテキストフィールドを追加する構造を作ってみました。

やりたいことは、初期画面で一つだけボタンを表示し、そのボタンを押すたびに、テキスト”hogehoge”を追加していく、というものです。

数が多くなったときのために、スクロールできるようにもしました。

 

初期画面はこんな感じ。

 

“追加”ボタンを押すたびに、テキスト”hogehoge”が追加されていきます。

 

テキストが画面に収まりきらなくなると、タイトルだけを残してスクロールします。

 

このレイアウトは、次のような構成で定義されています。

 

フィールドが追加される部分は、”ScrollLayout”と”LinearLayout”を組み合わせ、さらにその下部の”LinearLayout”を動的な追加対象としました。

一番内側のLinearLayoutが”hogehoge”を構成する部分で、ここだけメインのレイアウトXMLファイルとは別に定義しています。ここではファイル名を”sub.xml”という名称にしています。

これを一つ外側のLinearLayoutに動的に追加していきます。そのためにはこのLinearLayoutにidを付与しておく必要があり、”root”としています。

 

ではレイアウトXMLのソースコードです。

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <TextView
        android:id="@+id/et_Title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:inputType="textPersonName"
        android:text="ボタンを押すたびにテキストを追加します"
        android:textSize="20dp"/>

    <ScrollView
        android:id="@+id/scrollView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_marginTop="32dp">

        <LinearLayout
            android:id="@+id/root"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical">

            <Button
                android:id="@+id/button"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="追加" />

        </LinearLayout>
    </ScrollView>

</LinearLayout>

 

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:textSize="32dp"
        android:text="hogehoge"/>

</LinearLayout>

 

次にjavaソースコードを示します。

import android.content.Context;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

    private LinearLayout rootView;
    private LayoutInflater inflater;

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

        rootView = findViewById(R.id.root);
        inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        Button b = findViewById(R.id.button);
        SampleListener sl = new SampleListener();
        b.setOnClickListener(sl);

    }

    private class SampleListener implements View.OnClickListener {

        @Override
        public void onClick(View view) {
            View subView = inflater.inflate(R.layout.sub, null);
            rootView.addView(subView, rootView.getChildCount() - 1);

        }
    }
}

 

onClickメソッドでsub.xmlのViewを呼び出し、id:rootのLinearLayoutに追加していきます。

ここでaddViewメソッドの第2引数は、要素の最後から2番目、つまり”追加”ボタンの前にaddすることを意味しています。

sub.xmlの内容を増やせば、要素を追加したり、より複雑な処理を入れることもできます。