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

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

【Android】CalendarViewを使ってカレンダーを表示してみる

本日はCalendarViewを使ったカレンダーの表示方法について書いていきます。

レイアウトの実装

layoutにはCalendarViewタグを使用します。

<CalendarView
    android:id="@+id/calendar"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center" />

Activityの実装

カレンダーを表示するだけであれば、Activity側に処理を書く必要はありません。
ここでは、CalendarViewのメソッドについていくつか紹介しておきましょう。詳細は公式ドキュメントをご覧ください。

setDateとgetDate

setDateでCalendarViewに日付を設定することができます。引数の型はlong型です。
getDateで選択されている日付を取得できます。戻り値の型はlong型です。

CalendarView cal = findViewById(R.id.calendar);

// 現在日付を設定
cal.setDate(new Date().getTime());

// 現在日付を取得
Date today = new Date(cal.getDate());

setFirstDayOfWeekとgetFirstDayOfWeek

setFirstDayOfWeekで開始曜日を変更することができます。日曜始まりか、月曜始まりかは、けっこう拘る人が多いのではないでしょうか。
引数の型はintですが、Calendarクラスの定数を使用して指定しましょう。
getFirstDayOfWeekでは現在設定されている開始曜日を取得できます。

CalendarView cal = findViewById(R.id.calendar);

// 開始曜日を設定する
cal.setFirstDayOfWeek(Calendar.MONDAY);

// 開始曜日を取得する
int firstDayOfWeek = cal.getFirstDayOfWeek;

setOnDateChangeListener

選択された日付が変わった時に処理を行うときに実装します。
OnDateChangeListenerクラスのonSelectedDayChangeメソッドに処理を実装していきます。

CalendarView cal = findViewById(R.id.calendar);
calendar.setOnDateChangeListener(new CalendarView.OnDateChangeListener() {
    @Override
    public void onSelectedDayChange(@NonNull CalendarView view, int year, int month, int dayOfMonth) {

        String day = Integer.toString(year)  + "/" + String.format("%02d",month  + 1) + "/" + String.format("%02d", dayOfMonth);
        selectDay.setText(day);
    }
});

実際のアプリの動きで確認してみます。
カレンダー日付の選択が変わると、画面下部の日付が変わることを確認してみてください。

初期画面
f:id:mtnanao:20200922170807p:plain:w300



日付選択後
f:id:mtnanao:20200922170826p:plain:w300


CalendarViewの紹介は以上です。
簡単にカレンダーを実装することができますね。

最後まで読んでいただきありがとうございます。お疲れさまでした(^_^)/


最後にアプリの宣伝です!CalendarViewも使ってます!
f:id:mtnanao:20200921163938j:plain
play.google.com

【アプリ紹介】復習管理アプリを公開しました!

f:id:mtnanao:20200921163938j:plain




新しいアプリを公開したので紹介させてください!

play.google.com

※対応OSはAndroidです。

アプリ名

復習リマインダー

アプリ概要

忘却曲線」に基づいた効率的な学習を管理・通知するアプリです!

人間は復習をしないと翌日には約70%を忘れてしまうというのをご存じでしょうか。
最適なタイミングで復習することで、最小限の時間で最大限の効果を発揮することができます。

作った経緯

学生時代に予備校でアルバイトをしていた経験があるのですが、
その時に聞いた「忘却曲線」を身近な学習でも使えたらいいのに!
ということでこのアプリを作りました。

機能説明

1.科目単位で学習内容を管理します

学習内容は科目単位で管理するようにしています。
こちらが科目の管理画面です。
f:id:mtnanao:20200919164652j:plain:w250

各科目に実際に学習する内容を登録します。
こちらが学習内容の管理画面です。
f:id:mtnanao:20200919164823j:plain:w250

学習内容のカードを右にスワイプすることで次の学習ステップに
進むことができます。

2.復習タイミングは自動計算

復習タイミングは初回の学習日から自動で計算されます。
翌日の復習、1週間後の復習、2週間後の復習、1ヶ月後の復習です。
復習タイミングは詳細画面で確認できます。

3.カレンダーでスケジュールを簡単確認

日々の復習内容はカレンダーで確認できます。
「今日は何をやったらいいんだっけ・・・」という場合に活用ください。
f:id:mtnanao:20200919165250j:plain:w250

4.全科目の学習内容を一覧表示

科目別に全学習内容が確認できる一覧画面も用意しています。
検索機能もついてますので、登録した学習内容を探したい場合はこの画面から検索してみてください。
f:id:mtnanao:20200919165418j:plain:w250

5.復習日にはアプリから通知

復習する日はアプリから通知があります。
通知時間も変えられますので、自分の生活リズムに合わせて通知機能を使ってください!
f:id:mtnanao:20200919165712j:plain:w250


アプリ紹介は以上になります!
是非使ってみてください!!

play.google.com

【Android】CardViewでカード型のレイアウトを作ってみた

スマホをいじってて、「あのカードみたいなのどうやって出すんだろう」と
ふと思ったので調べてみました。
CardViewというものがあるみたいなので実装方法をまとめておきます。

依存関係の追加

build.gradleにCardView利用のための依存関係を追加します。

dependencies {
    implementation 'androidx.cardview:cardview:1.0.0'
}

レイアウトの作成

CardViewのタグをxmlに記述するだけでカード型のレイアウトが表示されます。

<?xml version="1.0" encoding="utf-8"?>
<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="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <androidx.cardview.widget.CardView
        android:layout_width="match_parent"
        android:layout_height="80dp"
        android:layout_margin="15dp">

        <TextView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:gravity="center_vertical"
            android:text="CardView"
            android:textSize="24sp"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toTopOf="parent" />
    </androidx.cardview.widget.CardView>

</LinearLayout>

f:id:mtnanao:20200801110122p:plain:w250
表示されたものがこちら

少々見づらいですが、うっすらと影が表示されカード型になっています。

CardViewの属性

最低限の実装を載せましたが、属性に応じた表示の変化を見ていきます。

cardCornerRadius

カードの角に丸みをつける属性です。

    <androidx.cardview.widget.CardView
        android:layout_width="match_parent"
        android:layout_height="80dp"
        android:layout_margin="15dp"
        app:cardCornerRadius="12dp">

f:id:mtnanao:20200801110209p:plain:w250

cardElevation

カードの高さを指定する属性です。

    <androidx.cardview.widget.CardView
        android:layout_width="match_parent"
        android:layout_height="80dp"
        android:layout_margin="15dp"
        app:cardCornerRadius="12dp"
        app:cardElevation="20dp">

f:id:mtnanao:20200801110241p:plain:w250

cardBackgroundColor

カードの色を変更する属性です。

    <androidx.cardview.widget.CardView
        android:layout_width="match_parent"
        android:layout_height="80dp"
        android:layout_margin="15dp"
        app:cardCornerRadius="12dp"
        app:cardElevation="20dp"
        app:cardBackgroundColor="@color/colorAccent">

f:id:mtnanao:20200801110302p:plain:w250

雑談

要素を重ねているようなデザインは今風でおしゃれな感じがしますね!
他にも色々と学んでみたいと思います!



それでは以上です(^_^)/


最後にアプリの宣伝させてください(*^-^*)

play.google.com

【アプリ紹介】電卓アプリを公開しました!(税計算・割引計算・メモ機能)

久しぶりのブログ投稿です!
というのも、ずっと手を付けられていなかったアプリがついに公開されましたので紹介させてください!

play.google.com
※対応OSはAndroidです。


初めて作ったアプリです!
レベルは高くないですが、楽しく作りました!
是非インストールだけでもしてみてください!

アプリ名

メモ付き!買い物計算

作った経緯

Androidアプリ初挑戦のために電卓アプリを作りました。
 「買い物してて消費税計算が面倒・・・」
 「値段比較したいのにいくらだったか忘れた・・・」
そんなことを思ったので便利機能としてプラスアルファしてみたのがこのアプリです。

機能説明

1.まずは基本的な電卓機能

説明することはありません。笑
f:id:mtnanao:20200731110329j:plain:w250

2.続いて割引計算機能

NumberPickerから割引率を選択すると計算後の結果が表示されます。
f:id:mtnanao:20200731110729j:plain:w250

3.次は消費税計算機能

消費税計算は8% か 10% の選択式です。
消費税減税されたらアップデートしないとね
f:id:mtnanao:20200731111002j:plain:w250

4.履歴は自動管理

計算結果の履歴は自動で登録されます。

  • タップで履歴にメモを追加
  • スワイプで履歴を削除
  • 選択削除、全件削除もあり
  • 全件削除ではメモを追加したものだけ残せる
  • アプリを落としても消えない

f:id:mtnanao:20200731111129j:plain:w250

5.履歴にメモ追加機能

履歴にメモを追加することができます。
あとで比べたいからこの計算結果取っておきたい。
そんな時はメモを追加してみてください。
メモを追加した履歴が一目でわかるように、鉛筆マークも表示されます。
f:id:mtnanao:20200731111601j:plain:w250

雑談

コロナの影響でgoogleの審査に時間がかっているみたいですね。
このアプリの場合は、約69時間(2日と21時間)かかってようやく公開されました。


公開できたもののバナー広告が表示されない・・・
実装見直してみますかね。

[2020/07/31 追記]
admobで支払い情報を設定していなかったため広告が出なかったようです。
この設定をもってアカウントが承認されたあと、しばらくしたら表示されるようになりました。
(設定→承認→広告表示で4時間くらいでした。)



それでは以上です!
ありがとうございました(^_^)/

play.google.com

【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();

    }
}

最後にアプリの宣伝させてください(*^-^*)

play.google.com

【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


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


最後にアプリの宣伝させてください(*^-^*)

play.google.com

【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




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


最後にアプリの宣伝させてください(*^-^*)

play.google.com