アプリ開発初心者の暇つぶしAndroid体験記

アプリ開発初心者がAndroidアプリ開発始めました。日々学んだことをアウトプットしていきます。

【Android】Intentを使って遷移先画面からデータを受け取る方法

こんにちは!
今回は遷移先画面からデータを受け取る方法をまとめます。

遷移先画面へのデータの渡し方は前回の記事でまとめています。
xprogrammingx.hatenablog.com

それではやっていきましょう!

画面呼び出しのメソッド変更

呼び出した画面から値を受け取る場合は、
単に呼び出す時と使うメソッドが異なります。

startActivityForResult(subIntent, 1);

このようにstartActivityForResultメソッドを使用します。
第一引数は遷移先のIntent、
第二引数はリクエストコードをint型で渡します。

このリクエストコードについてもう少し詳細に書いておきます。

複数のIntentを呼び出した場合に、このリクエストコードによって
どのIntentからの戻りかを判断することができます。
この値がどこに表れてくるのかは後述します。

遷移先での実装

遷移先での実装方法は、遷移元と同様に
putExtraを使って値を格納していきます。
このあたりは前回書いたので省略

Intent intent = getIntent();
intent.putExtra("KEY_INT", intVal + 1);
intent.putExtra("KEY_STRING", "返ってきた" + stringVal);
setResult(RESULT_OK,intent);

getIntentを使ってIntentを取得します。
このIntentに値を格納して、遷移元に返していきます。

返す際はsetResultメソッドを使用します。
第一引数は結果コードです。RESULT_OK か RESULT_CANCELED のどちらかを設定します。
第二引数は返却するIntentです。

値の受け取り

では、遷移先で設定された値を取得する方法です。

@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    
    int returnInt = data.getIntExtra("KEY_INT",0);
    String returnString = data.getStringExtra("KEY_STRING");
    
    System.out.println(String.valueOf(returnInt));
    System.out.println(returnString);    
}

メソッドの引数を見ていきましょう。
第一引数はリクエストコードです。startActivityForResultの第二引数に設定した値がここに格納されます。
第二引数は結果コードです。setResultで設定したRESULT_OK か RESULT_CANCELEDが入ります。
第三引数はIntentです。ここからデータを取得していきます。
データの取得方法は前回と同様なので省略します。

実行した結果以下の通りになります。

2020-03-24 17:21:32.744 5106-5106/com.example.test I/System.out: 4
2020-03-24 17:21:32.745 5106-5106/com.example.test I/System.out: 返ってきた文字列型だよ

最後に実行したソースを載せておきます。
それでは今回は以上です!
お疲れさまでした(^_^)/

ソースコード

[MainActivity.java]

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        findViewById(R.id.button).setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        Intent subIntent = new Intent(getApplication(), SubActivity.class);

        // intの値を渡す
        subIntent.putExtra("KEY_INT", 3);

        // Stringの値を渡す
        subIntent.putExtra("KEY_STRING", "文字列型だよ");

        // list<String>の値を渡す
        List<String> list = new ArrayList<>();
        list.add("リスト1");
        list.add("リスト2");
        list.add("リスト3");
        list.add("リスト4");
        list.add("リスト5");
        subIntent.putStringArrayListExtra("KEY_LIST", (ArrayList)list);

        startActivityForResult(subIntent, 1);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        int returnInt = data.getIntExtra("KEY_INT",0);
        String returnString = data.getStringExtra("KEY_STRING");

        System.out.println(String.valueOf(returnInt));
        System.out.println(returnString);
    }
}


[SubActivity.java]

public class SubActivity extends AppCompatActivity implements View.OnClickListener {

    int intVal = 0;
    String stringVal = "";
    List<String> stringList = new ArrayList<>();

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

        Intent intent = getIntent();
        intVal = intent.getIntExtra("KEY_INT",0);
        stringVal = intent.getStringExtra("KEY_STRING");
        stringList = intent.getStringArrayListExtra("KEY_LIST");

        findViewById(R.id.button).setOnClickListener(this);

    }

    @Override
    public void onClick(View v) {
        Intent intent = getIntent();
        intent.putExtra("KEY_INT", intVal + 1);
        intent.putExtra("KEY_STRING", "返ってきた" + stringVal);
        setResult(RESULT_OK,intent);

        finish();

    }
}

【Android】Intentを使った画面間の値の受け渡し

今回は画面間の値の受け渡しをまとめていきます。
画面遷移の方法は以前取り上げましたのでその続きと行きましょう!
xprogrammingx.hatenablog.com

遷移元から渡す値を設定する

遷移元から渡したい値を設定する時の処理を実装します。

[MainActivity.java]

@Override
public void onClick(View v) {
    Intent subIntent = new Intent(getApplication(), SubActivity.class);

    // intの値を渡す
    subIntent.putExtra("KEY_INT", 3);

    // Stringの値を渡す
    subIntent.putExtra("KEY_STRING", "文字列型だよ");

    // list<String>の値を渡す
    List<String> list = new ArrayList<>();
    list.add("リスト1");
    list.add("リスト2");
    list.add("リスト3");
    list.add("リスト4");
    list.add("リスト5");
    subIntent.putStringArrayListExtra("KEY_LIST", (ArrayList)list);
    
    startActivity(subIntent);
}

作成したIntentクラスのインスタンスにputExtraメソッドを使って値を設定します。
第一引数が設定する値のキー値です。これは被らなければ好きな名前を付けてください。
第二引数には実際に渡す値です。型は任意ですが、Listは別メソッドが用意されているので注意です。

LIstを渡したいときは、putStringArrayListExtraやputIntegerArrayListExtraを使います。

遷移先での値の受け取り

設定した値を遷移先で取得します。

[SubActivity.java]

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

    Intent intent = getIntent();

    // int型の値を受けとる
    intVal = intent.getIntExtra("KEY_INT",0);

    // String型の値を受けとる
    stringVal = intent.getStringExtra("KEY_STRING");

    // List<String>型の値を受けとる
    stringList = intent.getStringArrayListExtra("KEY_LIST");

    findViewById(R.id.button).setOnClickListener(this);

}

遷移先で値を受け取る場合は、getIntentメソッドで取得したインスタンス
getXXXExtraを使用します。

設定する際はputExtraでほとんどの型を使えていましたが、
受け取る場合は型ごとにメソッドが違うので注意です。
どのメソッドも第一引数にキー値を設定することで値を受け取れます。

nullを許容していない型(intやdouble、booleanなど)の場合は、
第二引数にデフォルト値を設定します。

受け取った値を標準出力してみると、受け渡しが行えていることが分かります。

2020-03-23 13:12:26.517 4526-4526/com.example.test I/System.out: 遷移先で受け取った値
2020-03-23 13:12:26.517 4526-4526/com.example.test I/System.out: valは3
2020-03-23 13:12:26.517 4526-4526/com.example.test I/System.out: stringValは文字列型だよ
2020-03-23 13:12:26.517 4526-4526/com.example.test I/System.out: stringListの1番目はリスト1
2020-03-23 13:12:26.517 4526-4526/com.example.test I/System.out: stringListの2番目はリスト2
2020-03-23 13:12:26.518 4526-4526/com.example.test I/System.out: stringListの3番目はリスト3
2020-03-23 13:12:26.518 4526-4526/com.example.test I/System.out: stringListの4番目はリスト4
2020-03-23 13:12:26.519 4526-4526/com.example.test I/System.out: stringListの5番目はリスト5


それでは今回はここまでです!
お疲れさまでした(^_^)/

【Android】ツールバーの表示とカスタマイズ

今回はツールバーの表示方法とカスタマイズについて
まとめていきたいと思います。

ツールバーのレイアウト配置

ツールバーのレイアウトを作成していきます。
AndroidStudioのパレットからToolBarを配置します。
f:id:mtnanao:20200316214223p:plain

配置後、作成されたxmlを見てます。

<androidx.appcompat.widget.Toolbar
    android:id="@+id/toolbar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="?attr/colorPrimary"
    android:minHeight="?attr/actionBarSize"
    android:theme="?attr/actionBarTheme" />

ここで登場してくる"?attr/"ですが、
あらかじめ定義されているデザイン情報を引用できます。
AndroidStudioであれば、Ctrlを押しながらクリックすれば定義元に飛べますので
一つ見てみましょう。

<!-- The primary branding color for the app. By default, this is the color applied to the
        action bar background. -->
<attr format="color" name="colorPrimary"/>

コメントに書いてある通り、デフォルトではアクションバーの背景みたいですね。

ツールバーの表示処理実装

ツールバーを表示させたいアクティビティのonCreateメソッドに
以下のように実装していきます。

Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);

この他に、元々デフォルトで表示されているアクションバーを
非表示にしないと新たに定義したツールバーが表示できないため、
起動時にエラーとなってしまいます。

[res/values/styles.xml]

<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">

ここまででツールバーが表示されます。
f:id:mtnanao:20200316215815p:plain:w250

オプションメニューの表示

ツールバー右上にオプションメニューを表示させる方法を紹介します。

最初にメニューの一覧を定義するリソースファイルを作成します。
リソースタイプが"Menu"の新しいxmlファイルを作成します。
f:id:mtnanao:20200316220456p:plain
f:id:mtnanao:20200316220220p:plain

この新規リソースファイルに項目を追加していきます。

<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:id="@+id/sample1"
        android:title="サンプル機能1" />
    <item
        android:id="@+id/sample2"
        android:title="サンプル機能2" />
</menu>


続いてアクティビティクラスの実装です。
onCreateOptionsMenuメソッドをオーバーライドして実装します。

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.testmenu,menu);
    return true;
}

先ほど作成したtestmenuのレイアウトをインフレートして紐づけます。
戻り値のbooleanは、trueを返すことによりオプションメニューが表示されます。
(これどういう時にfalseを返すのだろうか?)

これでオプションメニューが表示されます。
f:id:mtnanao:20200316221400p:plain:w250
f:id:mtnanao:20200316221410p:plain:w250

戻るボタンの表示

ツールバーに戻るボタンを表示させる方法を紹介します。
onCreateメソッドでsetDisplayHomeAsUpEnabledメソッドを実装します。

Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);

表示だけであればこれだけでOKです。
f:id:mtnanao:20200316222033p:plain:w250

各ボタンが押された時の処理実装

ここまで作った各ボタンが押された時の処理を実装するには、
onOptionsItemSelectedメソッドをオーバーライドして実装します。

@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {

    switch (item.getItemId()){

        // 戻るボタンが押された時の処理
        case android.R.id.home:

            text.setText("戻るが押されました" );
            break;

        // オプションメニューが押された時の処理
        case R.id.sample1:

            text.setText("サンプル機能1が押されました" );
            // オプションメニューを実行の時はtrue
            return true;

        case R.id.sample2:

            text.setText("サンプル機能2が押されました" );
            // オプションメニューを実行の時はtrue
            return true;
    }
    return super.onOptionsItemSelected(item);
}

戻るボタンが押された場合は、
ItemIdがandroid.R.id.homeになります。
また、ここでもboolean型を返す必要がありますが、
オプションメニューを実行する時にはtrueを返すようにします。

動かしてみたのがこちらになります。

・戻るを押した場合
f:id:mtnanao:20200316223900p:plain:w250

・オプションメニューのサンプル機能1を押した場合
f:id:mtnanao:20200316223921p:plain:w250

・オプションメニューのサンプル機能2を押した場合
f:id:mtnanao:20200316223950p:plain:w250




それでは今回は以上になります。
お疲れさまでした(^_^)/

【Android】ListViewを使ってリストを表示する

今回はListViewを使ったリスト表示の方法をまとめてみました!
それでは見ていきます!

ListViewのレイアウト

まずはListViewのレイアウトを作成していきます。
f:id:mtnanao:20200312223016p:plain
AndroidStudioの場合は、ここにListViewがありますね。

<ListView
    android:id="@+id/list"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

ListViewタグを記述することによっても追加できます。

ListViewに値を設定するには?

作成したListViewに値を設定していきます。

public class MainActivity extends AppCompatActivity {

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

        // 表示用のデータを準備
        List<String> list = new ArrayList<>();
        list.add("リスト1");
        list.add("リスト2");
        list.add("リスト3");
        list.add("リスト4");
        list.add("リスト5");

        // Adapterでデータとリストを紐づける
        ArrayAdapter adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1 , list);

        // ListViewにAdapterを設定する
        ListView listView = (ListView) findViewById(R.id.list);
        listView.setAdapter(adapter);
        
    }
}


ポイントは以下になります。

ArrayAdapter adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1 , list);

ListViewに値を設定するためにはAdapterを使って、
リストとデータを紐づける必要があります。
List型のデータを各行に紐づけるにはArrayAdapterクラスを使用します。

第二引数には、1行単位のレイアウトを指定します。
android.R.layout.simple_list_item_1は、デフォルトで用意されているレイアウトです。
1行に1つのデータを表示するシンプルなレイアウトになります。

画面で確認してみる

実装したものを動かしてみましょう。
f:id:mtnanao:20200312221349p:plain

このようにデータがリストで表示されていますね。


今回はここまでです!
お疲れ様でした(^_^)/

【Android】Intentを使った画面遷移のやり方

今回はAndroidアプリでIntentを使った画面遷移の方法について学んだので
記事にまとめておきます。

Intentとは

Androidでは画面を表示するための部品はアクティビティと呼ばれていますが、
アクティビティから他のアクティビティを呼ぶときにインテントという仕組みを使用します。
この仕組みの中で使われているクラスがIntentになります。
画面間のデータの受け渡しもこのIntentクラスを経由して行うことが出来ます。

画面遷移の実装方法

まずは単純な画面遷移を行うための実装を見ていきます。
遷移元にはボタン1つ配置し、onClickListenerを設定します。

[MainActivity.java]

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

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

        findViewById(R.id.button).setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        Intent subIntent = new Intent(getApplication(), SubActivity.class);
        startActivity(subIntent);
    }
}

onClickメソッドの中が今回紹介する仕組み、インテントになります。
Intentクラスをインスタンス化する際、コンストラクタの第二引数に遷移先画面の
アクティビティクラスを指定します。
startActivityメソッドの引数に渡してあげることで画面遷移が行えます。


遷移先のアクティビティクラスも載せておきます。

[SubActivity.java]

public class SubActivity extends AppCompatActivity implements View.OnClickListener {

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

        findViewById(R.id.button).setOnClickListener(this);

    }

    @Override
    public void onClick(View v) {
        finish();
    }
}

遷移先のonClickメソッドでは、finishメソッドを呼んでいます。
このメソッドを実行することにより、
当アクティビティが終了し元の画面に戻ります。

忘れがちなManifestファイルへの追加

新しいアクティビティを追加した際に忘れがちになるのが、
AndroidManifest.xmlへの追加です。
このファイルに「このアクティビティがあります!」と
宣言しておかないといけません。
SubActivityの宣言を追加したのがこちらになります。

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.test">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name=".SubActivity" />
    </application>
</manifest>

動作確認

それでは実際に動かしてみます。

遷移元の画面がこちらです。
f:id:mtnanao:20200310222031p:plain:w250
ボタンを押すと・・・

f:id:mtnanao:20200310222527p:plain:w250
このようにサブ画面へ遷移しました。
サブ画面でボタンを押せばfinishメソッドが呼ばれて
メイン画面に戻ります。



それでは今回はここまでです!
お疲れさまでした(^_^)/

【Android】OnLongClickListenerでボタンの長押し処理を実装


今回はボタンを長押しした際の処理の実装についてまとめました。
それではどうぞ。

設定するイベントリスナー

ボタン長押しというイベントを検知させるためには、
OnLongCickListenerを実装します。

findViewById(R.id.button).setOnLongClickListener(this);

長押しを検知した時の処理

次はボタンが押された時の処理を見ていきます。
onLongClickメソッドをオーバーライドして処理を実装します。

@Override
public boolean onLongClick(View v) {
    text2.setText("onLongClickメソッドが呼ばれました");
    return true;
}

メソッドの戻り値の型がbooleanなのが注目ですね!

true、falseでそれぞれ以下のように動きが変わります。

  • trueの場合

onClickメソッドは実行されない。

  • falseの場合

onClickメソッドも続けて実行される。
(もちろん実装してあれば)

実際の動きを確認してみる

サンプルのアプリケーションを作ったので、動かしてみます。

[avtivity_main.xml]

<LinearLayout 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="wrap_content"
    android:orientation="vertical"
    tools:context=".MainActivity">

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

    <TextView
        android:id="@+id/textView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:textSize="24sp" />

    <TextView
        android:id="@+id/textView2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textSize="24sp" />

    <Button
        android:id="@+id/button2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="clear" />

</LinearLayout>


[MainActivity.java]

public class MainActivity extends AppCompatActivity implements View.OnClickListener, View.OnLongClickListener {

    TextView text;
    TextView text2;

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

        findViewById(R.id.button).setOnClickListener(this);
        findViewById(R.id.button).setOnLongClickListener(this);

        findViewById(R.id.button2).setOnClickListener(this);

        text = findViewById(R.id.textView);
        text2 = findViewById(R.id.textView2);

    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.button:

                text.setText("onClickメソッドが呼ばれました");
                break;

            case R.id.button2:

                text.setText("");
                text2.setText("");
                break;
        }
    }

    @Override
    public boolean onLongClick(View v) {
        text2.setText("onLongClickメソッドが呼ばれました");
        return true;
    }
}

設置したボタンを長押しした時の動きがこのようになります。
f:id:mtnanao:20200305233619p:plain

onLongClickメソッドがtrueを返していますので、
onLongClickメソッドのみが呼ばれているのが分かると思います。

それでは、falseを返すようにして再度実行してみます。
f:id:mtnanao:20200305233836p:plain

onLongClickメソッドの後に、onClickメソッドが実行されています。


それでは、今回は以上です(^_^)/
お疲れさまでした!!

【Java】計算にはBigDecimalを使おう

実装していてBigDecimalに躓いたのでまとめておこうと思います。

BigDecimalとは

数字の計算において、誤差を出さないためにはBigDecimalを使う必要があります。
BigDecimalはクラスなので、インスタンスを生成して使います。

BigDecimal bd1 = new BigDecimal("1");

BigDecimalを使わないと?

では、BigDecimalを使わないとどのような計算結果になるか試してみたいと思います。

// BigDecimalなしで計算
System.out.println(1.2 * 3);

結果は3.6となってほしいところですが実際の結果は・・・

3.5999999999999996

誤差が出てしまっていることが分かると思います。

BigDecimalで計算してみよう

誤差を出さないようにBigDecimalを使って計算してみようと思います。

// BigDecimalで計算
BigDecimal bd1 = new BigDecimal("1.2");
BigDecimal bd2 = new BigDecimal("3");

System.out.println(bd1.multiply(bd2));

すると結果はこのようになりました。

3.6

誤差なく計算できていますね。

BigDecimalクラスのメソッド

誤差が出ないことが確認できたので、基本的な使い方を見ていきます。

上から順、足し算、引き算、掛け算、割り算をする時に使います。

四捨五入や切り上げ、切り捨てをするときに使います。
第一引数:変換後の小数点以下の桁数を設定します。
(小数第三位で四捨五入して、少数点以下2桁で表示する場合は2を設定します。)
第二引数:丸め方を指定します。
 四捨五入 BigDecimal.ROUND_HALF_UP
 切り上げ BigDecimal.ROUND_UP
 切り捨て BigDecimal.ROUND_DOWN

実際に動かしたソースと結果を張っておきます。

// BigDecimalで計算
BigDecimal bd1 = new BigDecimal("1.2");
BigDecimal bd2 = new BigDecimal("3");


// 足し算
System.out.println("足し算");
System.out.println(bd1.add(bd2));

// 引き算
System.out.println("引き算");
System.out.println(bd1.subtract(bd2));

// 掛け算
System.out.println("掛け算");
System.out.println(bd1.multiply(bd2));

// 割り算
System.out.println("割り算");
System.out.println(bd1.divide(bd2));


BigDecimal bd3 = new BigDecimal("1.25");

// 四捨五入
System.out.println("四捨五入");
System.out.println(bd3.setScale(1, BigDecimal.ROUND_HALF_UP));

// 切り上げ
System.out.println("切り上げ");
System.out.println(bd3.setScale(1, BigDecimal.ROUND_UP));

// 切り捨て
System.out.println("切り捨て");
System.out.println(bd3.setScale(1, BigDecimal.ROUND_DOWN));

結果はこのようになりました。

足し算
4.2
引き算
-1.8
掛け算
3.6
割り算
0.4
四捨五入
1.3
切り上げ
1.3
切り捨て
1.2

演算を行うときは意識してBigDecimalを使わないと
思わぬバグを作りこんでしまいますね。

それでは今回は以上です(^^)/
お疲れさまでした♪