【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); } });
実際のアプリの動きで確認してみます。
カレンダー日付の選択が変わると、画面下部の日付が変わることを確認してみてください。
初期画面

日付選択後

CalendarViewの紹介は以上です。
簡単にカレンダーを実装することができますね。
最後まで読んでいただきありがとうございます。お疲れさまでした(^_^)/
最後にアプリの宣伝です!CalendarViewも使ってます!

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

新しいアプリを公開したので紹介させてください!
※対応OSはAndroidです。
アプリ名
復習リマインダー
アプリ概要
「忘却曲線」に基づいた効率的な学習を管理・通知するアプリです!
人間は復習をしないと翌日には約70%を忘れてしまうというのをご存じでしょうか。
最適なタイミングで復習することで、最小限の時間で最大限の効果を発揮することができます。
作った経緯
学生時代に予備校でアルバイトをしていた経験があるのですが、
その時に聞いた「忘却曲線」を身近な学習でも使えたらいいのに!
ということでこのアプリを作りました。
機能説明
1.科目単位で学習内容を管理します
学習内容は科目単位で管理するようにしています。
こちらが科目の管理画面です。

各科目に実際に学習する内容を登録します。
こちらが学習内容の管理画面です。

学習内容のカードを右にスワイプすることで次の学習ステップに
進むことができます。
2.復習タイミングは自動計算
復習タイミングは初回の学習日から自動で計算されます。
翌日の復習、1週間後の復習、2週間後の復習、1ヶ月後の復習です。
復習タイミングは詳細画面で確認できます。
3.カレンダーでスケジュールを簡単確認
日々の復習内容はカレンダーで確認できます。
「今日は何をやったらいいんだっけ・・・」という場合に活用ください。

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

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

アプリ紹介は以上になります!
是非使ってみてください!!
【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>

表示されたものがこちら
少々見づらいですが、うっすらと影が表示されカード型になっています。
CardViewの属性
最低限の実装を載せましたが、属性に応じた表示の変化を見ていきます。
cardCornerRadius
カードの角に丸みをつける属性です。
<androidx.cardview.widget.CardView android:layout_width="match_parent" android:layout_height="80dp" android:layout_margin="15dp" app:cardCornerRadius="12dp">

cardElevation
カードの高さを指定する属性です。
<androidx.cardview.widget.CardView android:layout_width="match_parent" android:layout_height="80dp" android:layout_margin="15dp" app:cardCornerRadius="12dp" app:cardElevation="20dp">

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">

雑談
要素を重ねているようなデザインは今風でおしゃれな感じがしますね!
他にも色々と学んでみたいと思います!
それでは以上です(^_^)/
最後にアプリの宣伝させてください(*^-^*)
【アプリ紹介】電卓アプリを公開しました!(税計算・割引計算・メモ機能)
久しぶりのブログ投稿です!
というのも、ずっと手を付けられていなかったアプリがついに公開されましたので紹介させてください!
play.google.com
※対応OSはAndroidです。
初めて作ったアプリです!
レベルは高くないですが、楽しく作りました!
是非インストールだけでもしてみてください!
アプリ名
メモ付き!買い物計算
作った経緯
Androidアプリ初挑戦のために電卓アプリを作りました。
「買い物してて消費税計算が面倒・・・」
「値段比較したいのにいくらだったか忘れた・・・」
そんなことを思ったので便利機能としてプラスアルファしてみたのがこのアプリです。
機能説明
1.まずは基本的な電卓機能
説明することはありません。笑

2.続いて割引計算機能
NumberPickerから割引率を選択すると計算後の結果が表示されます。

3.次は消費税計算機能
消費税計算は8% か 10% の選択式です。
消費税減税されたらアップデートしないとね

4.履歴は自動管理
計算結果の履歴は自動で登録されます。
- タップで履歴にメモを追加
- スワイプで履歴を削除
- 選択削除、全件削除もあり
- 全件削除ではメモを追加したものだけ残せる
- アプリを落としても消えない

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

雑談
コロナの影響でgoogleの審査に時間がかっているみたいですね。
このアプリの場合は、約69時間(2日と21時間)かかってようやく公開されました。
公開できたもののバナー広告が表示されない・・・
実装見直してみますかね。
[2020/07/31 追記]
admobで支払い情報を設定していなかったため広告が出なかったようです。
この設定をもってアカウントが承認されたあと、しばらくしたら表示されるようになりました。
(設定→承認→広告表示で4時間くらいでした。)
それでは以上です!
ありがとうございました(^_^)/
【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を配置します。

配置後、作成された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">
ここまででツールバーが表示されます。

オプションメニューの表示
ツールバー右上にオプションメニューを表示させる方法を紹介します。
最初にメニューの一覧を定義するリソースファイルを作成します。
リソースタイプが"Menu"の新しいxmlファイルを作成します。


この新規リソースファイルに項目を追加していきます。
<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を返すのだろうか?)
これでオプションメニューが表示されます。


戻るボタンの表示
ツールバーに戻るボタンを表示させる方法を紹介します。
onCreateメソッドでsetDisplayHomeAsUpEnabledメソッドを実装します。
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
表示だけであればこれだけでOKです。

各ボタンが押された時の処理実装
ここまで作った各ボタンが押された時の処理を実装するには、
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を返すようにします。
動かしてみたのがこちらになります。
・戻るを押した場合

・オプションメニューのサンプル機能1を押した場合

・オプションメニューのサンプル機能2を押した場合

それでは今回は以上になります。
お疲れさまでした(^_^)/
最後にアプリの宣伝させてください(*^-^*)