diff --git a/app/src/main/java/com/example/citrusclient/views/LoginActivity.java b/app/src/main/java/com/example/citrusclient/views/LoginActivity.java index 69753f4..a897689 100644 --- a/app/src/main/java/com/example/citrusclient/views/LoginActivity.java +++ b/app/src/main/java/com/example/citrusclient/views/LoginActivity.java @@ -32,12 +32,14 @@ // Androidのアクティビティは、Activity クラス(提供されている)を継承して作成される。Activity クラスは、すべてのアクティビティに共通の基本機能を提供します。そのため、アクティビティを作成する際には、Activity クラスのメソッドをoverrideしてカスタマイズすることが一般的です。 // 具体的には、onCreate メソッドは Activity クラスの一部であり、アクティビティが作成される際に呼び出される重要なメソッドです。アクティビティが初めて起動されるときには必ずこのメソッドが呼ばれます。onCreate メソッドでは、アクティビティの初期化、レイアウトの設定、リソースの読み込み、UIの構築などの処理が行われます。 protected void onCreate(Bundle savedInstanceState) { //すべてのアクティビティで実装する必要があるコールバックメソッド OnCreateメソッド 画面表示させたかったら、必ず皆かく - super.onCreate(savedInstanceState); // 最初に親クラスの onCreate メソッドを呼び出しています。これにより、親クラスで行われる初期化処理が実行されます。savedInstanceState パラメータは、アクティビティが再作成された場合に前回の状態を復元するために使用されます。 - EdgeToEdge.enable(this); - setContentView(R.layout.activity_login); // setContentViewで レイアウトを設定し、画面の初期化 - ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> { - Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars()); - v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom); + super.onCreate(savedInstanceState); // 最初に親クラスの onCreate メソッドを呼び出してる。これにより、親クラスで行われる初期化処理が実行。savedInstanceState パラメータは、前回の状態を復元 + EdgeToEdge.enable(this); // 画面を端から端まで表示するための設定を有効にする + setContentView(R.layout.activity_login); // setContentViewで activity_login.xmlというレイアウトを設定し、画面の初期化 + + // ViewCompat.setOnApplyWindowInsetsListener を使用することで、ビューがシステムバーによって隠れないように、必要な余白(パディング)を自動的に設定することができる。 + ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> { // WindowInsetsListenerの対象となる、mainというIDを持つビューを見つけます。 + Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars()); // システムバーのインセットを取得。 + v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom); // 取得したインセットを使ってビューのパディングを設定。 return insets; }); @@ -45,16 +47,16 @@ // アプリケーション全体の状態を管理する Citrus オブジェクトを取得 初期化 citrus = (Citrus) this.getApplication(); - // サーバーと通信するためのRetrofitインスタンスの作成、初期化 + // ② サーバーと通信するためのRetrofitインスタンスの作成、初期化 this.retrofit = new Retrofit.Builder() // retrofitのビルダーを作成 .baseUrl("http://nitta-lab-www.is.konan-u.ac.jp/citrus/") // サーバーのベースURLを設定 - .addConverterFactory(JacksonConverterFactory.create()) // レスポンス(通信の返信)をパース(解析、変換)するためのコンバーター(変換ツール)を追加します。この場合はJacksonを使用 + .addConverterFactory(JacksonConverterFactory.create()) // レスポンス(通信の返信)をパース(解析、変換)するためのConverter(変換ツール)を追加します。この場合はJacksonを使用 .build(); this.accountsRest = retrofit.create(AccountsRest.class); // ボタンをクリックすると... - // loginButtonというIDを持つボタンを取得し、 + // loginButtonというIDを持つボタン(私らがつけた)を取得し、 Button loginButton = (Button)findViewById(R.id.loginButton); // そのボタンにクリックリスナーを設定 loginButton.setOnClickListener(new View.OnClickListener(){ @@ -67,6 +69,7 @@ String id = editid.getText().toString().trim(); EditText editpw = (EditText) findViewById(R.id.password); String pw = editpw.getText().toString().trim(); + // Androidでスレッド間の通信を簡単に行うために使用される Handler クラスのインスタンスを作成しています final Handler handler = new Handler(); @@ -81,25 +84,29 @@ // 入力欄が適切に入力されたとき }else if(!id.isEmpty() && !pw.isEmpty() && !id.trim().isEmpty() && !pw.trim().isEmpty() ){ - // accountsRest.login(id,pw)は、Retrofit のインターフェースを使って定義されたメソッドで、サーバーに対してログイン情報を送信 + + // ② accountsRest.login(id,pw)は、Retrofit のインターフェースを使って定義されたメソッドで、サーバーに対してログイン情報を送信 Call call = accountsRest.login(id,pw); call.enqueue(new Callback() { + // ④ 通信成功 @Override public void onResponse(Call call, Response response) { // Retrofit の Response クラスで提供されているもので、HTTPリクエストの結果を表すクラス - if (response.isSuccessful()){ - if (!response.body().equals("null")) { - System.out.println("通信成功"); - //端末にtoken.id登録 - String token = response.body(); + if (response.isSuccessful()){ // リクエストが成功(ステータスコード200)し、サーバーがリクエストに対する適切なレスポンスを返した + if (!response.body().equals("null")) { // サーバー側で(AccountRest)ログイン認証が行われ、入力されたIDとパスワードが一致しない場合nullをかえすってあAccountRestに書いてる + System.out.println("通信成功"); // 通常はトークンやユーザー情報などをレスポンスとして返します。 + + // 端末に(Citrusに)tokenとidを登録。他の画面からもログイン情報を見れるようになる + String token = response.body(); // レスポンスのボディ部分にある、tokenデータをtoken変数に代入 citrus.setToken(token); citrus.setAccountId(id); // 画面遷移 handlerここで使われてる - handler.post(new Runnable() { + handler.post(new Runnable() { // Runnableはrunメソッドを持っている @Override // ログイン成功後に MainActivity へ遷移する処理 - public void run() { - Intent intent = new Intent(LoginActivity.this, MainActivity.class); + public void run() { // Runnableはrunメソッドを持っている + // Intentは、アクティビティ間の通信を管理するためのクラス + Intent intent = new Intent(LoginActivity.this, MainActivity.class); // 画面遷移 startActivity(intent); } }); @@ -117,7 +124,7 @@ } } } - //通信失敗 + // ④ 通信失敗 @Override public void onFailure(Call call, Throwable t) { System.out.println("通信失敗"); @@ -131,7 +138,8 @@ newButton.setOnClickListener(new View.OnClickListener(){ public void onClick(View v){ - Intent intent = new Intent(LoginActivity.this,SignUpActivity.class); + // Intentは、アクティビティ間の通信を管理するためのクラス + Intent intent = new Intent(LoginActivity.this,SignUpActivity.class); // 画面遷移 startActivity(intent); } }); @@ -148,4 +156,14 @@ // onFailure // Callback インターフェースのメソッド Retrofitなどのライブラリで使用される非同期通信の際に、通信が失敗した場合に呼び出されるコールバック // Response -// Retrofit の Response クラスで提供されているもので、HTTPリクエストの結果を表すクラス \ No newline at end of file +// Retrofit の Response クラスで提供されているもので、HTTPリクエストの結果を表すクラス + + + +// ①requestの作成 +// クライアント側でユーザーがログインフォームにログインIDとパスワードを入力し、送信ボタンを押します。 +// これにより、Retrofitを使ってサーバーに対するHTTPリクエストが作成 +// ②requestの送信 +// ③サーバーでの処理 +// ④リスポンスの受け取り +// \ No newline at end of file