package com.minui.data;

import androidx.activity.result.ActivityResult;
import androidx.activity.result.ActivityResultCallback;
import androidx.activity.result.ActivityResultLauncher;
import androidx.activity.result.contract.ActivityResultContract;
import androidx.activity.result.contract.ActivityResultContracts;
import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;

public class MainActivity extends AppCompatActivity {

    EditText editEmail;
    EditText editName;
    EditText editAge;
    Button button;

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

        editEmail = findViewById(R.id.editEmail);
        editName = findViewById(R.id.editAge);
        editAge = findViewById(R.id.editAge);
        button = findViewById(R.id.button);

        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                String email = editEmail.getText().toString().trim();
                String name = editName.getText().toString().trim();
                String ageStr = editAge.getText().toString().trim();

                int age = Integer.valueOf(ageStr).intValue();

                double hiddenData = 3.1414;

                // 새로운 액티비티를 띄우고,
                // 데이터를 전달한다.
                Intent intent = new Intent(MainActivity.this, SecondActivity.class);
                intent.putExtra("email",email);
                intent.putExtra("name", name);
                intent.putExtra("age", age);
                intent.putExtra("hidden", hiddenData);

                // 데이터만 전달하는 경우
                startActivity(intent);

            }
        });
    }
}
package com.minui.data;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class SecondActivity extends AppCompatActivity {

    TextView txtEmail;
    TextView txtName;
    EditText editAge;
    Button button;

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

        // 넘어오는 데이터가 있으면 처리해 준다.
        String email = getIntent().getStringExtra("email");
        String name = getIntent().getStringExtra("name");
        int age = getIntent().getIntExtra("age", 0);
        double hiddenData = getIntent().getDoubleExtra("hidden", 0);

        // 화면과 연결
        txtEmail = findViewById(R.id.txtEmail);
        txtName = findViewById(R.id.txtName);
        editAge = findViewById(R.id.editAge);
        button = findViewById(R.id.button);

        // 데이터를 화면에 셋팅!!!!
        txtEmail.setText(email);
        txtName.setText(name);
        editAge.setText(age + "");

    }
}

Intent 객체에 putExtra(키,밸류)로 설정하고 받는 액티비티에서 getIntent().get타입Extra(키)로 받는다.

	String email = "abc@naver.com";
        Pattern pattern = android.util.Patterns.EMAIL_ADDRESS;
        
        if(pattern.matcher(email).matches()){
            //이메일 맞음!
        } else {
            //이메일 아님!
        }

 

package com.minui.multiple;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;

public class MainActivity extends AppCompatActivity {

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

        Button button = findViewById(R.id.button);

        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                // 버튼을 누르면,
                // 다른 액티비티가 화면에 나타나도록 한다.

                Intent intent = new Intent(MainActivity.this, SecondActivity.class);
                startActivity(intent);

            }
        });

        Log.i("MyMultiple", "Main : onCreate");
    }

    @Override
    protected void onResume() {
        super.onResume();
        Log.i("MyMultiple", "Main : onResume");
    }

    @Override
    protected void onPause() {
        super.onPause();
        Log.i("MyMultiple", "Main : onPause");
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.i("MyMultiple", "Main : onDestroy");
    }
}
package com.minui.multiple;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;

public class SecondActivity extends AppCompatActivity {

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

        Log.i("MyMultiple", "Second : onCreate");

        Button btnSecond = findViewById(R.id.btnSecond);

        btnSecond.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(SecondActivity.this, ThirdActivity.class);
                startActivity(intent);
            }
        });
    }

    @Override
    protected void onResume() {
        super.onResume();
        Log.i("MyMultiple", "Second : onResume");
    }

    @Override
    protected void onPause() {
        super.onPause();
        Log.i("MyMultiple", "Second : onPause");
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.i("MyMultiple", "Second : onDestroy");
    }
}
package com.minui.multiple;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;

public class ThirdActivity extends AppCompatActivity {

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

Intent 객체를 만들고 현재 액티비티와 이동할 액티비티를 대입해주고 startActivity를 호출한다.

액티비티 스택이 쌓이면 전에꺼는 Pause되고 새로운 액티비티가 만들어진다.

백버튼 누르면 전에꺼는 Resume되고 현재꺼는 Destroy된다.

package com.minui.timer;

import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;

import android.content.DialogInterface;
import android.os.Bundle;
import android.os.CountDownTimer;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

    TextView txtTimer;
    TextView txtCount;
    Button button;

    // 타이머를 사용하기 위한, 멤버변수로 선언
    CountDownTimer timer;

    final int millisInFuture = 60000;
    final int countDownInterval = 1000;

    int count = 0;
    boolean end = false;

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

        txtTimer = findViewById(R.id.txtTimer);
        txtCount = findViewById(R.id.txtCount);
        button = findViewById(R.id.button);

        timer = new CountDownTimer(millisInFuture, countDownInterval) {
            @Override
            public void onTick(long l) {
                // 남은 시간을 계산해서
                // 텍스트뷰에 보여준다.
                // Log.i("MyTimer", "남은 시간 : " + l);
                // int remain = (int) l / 1000;
                long remain = l / 1000;

                txtTimer.setText("남은 시간 : " + remain);
            }

            @Override
            public void onFinish() {
                // Log.i("MyTimer", "타이머 끝났다!!");
                end = true;

                // 알러트 다이얼로그 (팝업)를 띄어서,
                // 한번 더 할것인지, 앱을 종료할것인지 물어본다.

                AlertDialog.Builder alert = new AlertDialog.Builder(MainActivity.this);
                alert.setTitle("게임 종료!");
                alert.setMessage("한번 더 하시겠습니까???");
                alert.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialogInterface, int i) {
                        end = false;
                        count = 0;
                        txtCount.setText("탭한 갯수 : " + count);
                        timer.start();
                    }
                });
                alert.setNegativeButton("No", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialogInterface, int i) {
                        // 현재 이 액티비티를 종료시키는 코드
                        finish();
                    }
                });
                // 이 알러트 다이얼로그의 버튼을
                // 안누르면, 화면이 넘어가지 않도록 하는 방법
                alert.setCancelable(false);
                // 알러트 다이얼로그를 화면에 표시
                alert.show();
            }
        };

        timer.start();
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (end) {
                    return;
                }
                count++;
                txtCount.setText("탭한 갯수 : " + count)  ;
            }
        });
    }
}

AlertDialog.Builder 객체를 만들고 제목 메시지를 만들어준다.

긍정 버튼을 누를 때와 부정 버튼을 누를 때 실행시킬 코드를 각각 적어준다.

package com.minui.timer;

import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;

import android.content.DialogInterface;
import android.os.Bundle;
import android.os.CountDownTimer;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

    TextView txtTimer;
    TextView txtCount;
    Button button;

    // 타이머를 사용하기 위한, 멤버변수로 선언
    CountDownTimer timer;

    final int millisInFuture = 60000;
    final int countDownInterval = 1000;

    int count = 0;
    boolean end = false;

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

        txtTimer = findViewById(R.id.txtTimer);
        txtCount = findViewById(R.id.txtCount);
        button = findViewById(R.id.button);

        timer = new CountDownTimer(millisInFuture, countDownInterval) {
            @Override
            public void onTick(long l) {
                // 남은 시간을 계산해서
                // 텍스트뷰에 보여준다.
                // Log.i("MyTimer", "남은 시간 : " + l);
                // int remain = (int) l / 1000;
                long remain = l / 1000;

                txtTimer.setText("남은 시간 : " + remain);
            }

            @Override
            public void onFinish() {
                // Log.i("MyTimer", "타이머 끝났다!!");
                end = true;

                // 알러트 다이얼로그 (팝업)를 띄어서,
                // 한번 더 할것인지, 앱을 종료할것인지 물어본다.

                AlertDialog.Builder alert = new AlertDialog.Builder(MainActivity.this);
                alert.setTitle("게임 종료!");
                alert.setMessage("한번 더 하시겠습니까???");
                alert.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialogInterface, int i) {
                        end = false;
                        count = 0;
                        txtCount.setText("탭한 갯수 : " + count);
                        timer.start();
                    }
                });
                alert.setNegativeButton("No", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialogInterface, int i) {
                        // 현재 이 액티비티를 종료시키는 코드
                        finish();
                    }
                });
                // 이 알러트 다이얼로그의 버튼을
                // 안누르면, 화면이 넘어가지 않도록 하는 방법
                alert.setCancelable(false);
                // 알러트 다이얼로그를 화면에 표시
                alert.show();
            }
        };

        timer.start();
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (end) {
                    return;
                }
                count++;
                txtCount.setText("탭한 갯수 : " + count)  ;
            }
        });
    }
}

timer라는 변수에 CountDownTimer 객체를 만든다.

millisInFuture은 타이머 총 시간 밀리세컨드 단위이고, countDownInterval은 몇초 마다 함수를 호출할 건지 정한다.

이때 onTick이 호출되고 끝나면 onFinish까 호출된다.

themes.xml 파일에서 원하는 위체에 색을 넣으면 된다. 색은 colors.xml 파일에 있다.

스크롤뷰를 만들고 안의 리니어레이아웃에 원하는 위젯을 넣으면 그림처럼 스크롤이 된다.

try {
        // JSONObject에서, 내가 가져올 데이터가 문자열이면, getString("키)
        // 내가 가져올 데이터가 정수이면, getInt("키)
        // 내가 가져올 데이터가 float 이면, getFloat("키)
        // 내가 가져올 데이터가 double 이면, getDouble("키)
        // 내가 가져올 데이터가 리스트이면, getJsonArray("키)
        // 내가 가져올 데이터가 딕셔너리형태이면, getJsonObject("키)
        // 로 데이터를 가져올 수 있다.
        String lyrics = response.getString("lyrics");
        txtLyrics.setText(lyrics);
        } catch (JSONException e) {
        e.printStackTrace();
        Toast.makeText(getApplicationContext(), "네트워크 에러입니다.", Toast.LENGTH_SHORT).show();
        return;
    }

response 에서 데이터타입에 따른 함수적용으로 가져오고

try catch문으로 감싸준다.

우선 xml 폴더에 network_security_config.xml 파일을 만들고

<?xml version="1.0" encoding="utf-8" ?>

<network-security-config>
    <domain-config cleartextTrafficPermitted="false">
        <domain includeSubdomains="true">*.lyrics.ovh</domain>
    </domain-config>
</network-security-config>

도메인에 원하는 도메인 적어준다.

그리고 manifests 폴더에 AndroidManifest.xml 파일에 코드 작성해준다.

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="com.minui.lyrics"
    android:targetSandboxVersion="1">

    <uses-permission android:name="android.permission.INTERNET"/>

    <application
        android:usesCleartextTraffic="true"
        android:networkSecurityConfig="@xml/network_security_config"
        android:allowBackup="true"
        android:dataExtractionRules="@xml/data_extraction_rules"
        android:fullBackupContent="@xml/backup_rules"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.Lyrics"
        tools:targetApi="31">
        <activity
            android:name=".MainActivity"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

targetSandboxVersion은 에뮬레이터 인터넷 설정

uses-permission 은 인터넷 허용

usesCleartextTraffic 은 cleartext 네트워크 트래픽 사용 여부

networkSecurityConfig는 아까만들어둔 xml 파일을 넣는다.

package com.minui.lyrics;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

import com.android.volley.DefaultRetryPolicy;
import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.toolbox.JsonObjectRequest;
import com.android.volley.toolbox.Volley;

import org.json.JSONObject;

public class MainActivity extends AppCompatActivity {

    EditText editName;
    EditText editSong;
    Button btnLyrics;
    TextView txtLyrics;

    final String URL = "https://api.lyrics.ovh/v1/";

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

        editName = findViewById(R.id.editName);
        editSong = findViewById(R.id.editSong);
        btnLyrics = findViewById(R.id.btnLyrics);
        txtLyrics = findViewById(R.id.txtLyrics);

        // 가사가져오기 버튼 누르면
        // 네트워크를 통해 API 를 호출하고,
        // 호출한 결과를 화면에 표시한다.

        btnLyrics.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                // 1. 버튼을 누르면, 에디트텍스트에서 유저가 입력한 문자열을
                //    가지고 온다.
                String name = editName.getText().toString().trim();
                String song = editSong.getText().toString().trim();

                // 1-1. 이름과 노래는 데이터가 꼭 있어야 한다. 둘중에 하나라도
                // 데이터가 없으면, 유저한테 둘다 필수로 입력하라고 알려준다.
                if(name.isEmpty() || song.isEmpty()) {
                    Toast.makeText(getApplicationContext(), "이름이나 노래제목은 필수로 입력하세요", Toast.LENGTH_SHORT).show();
                    return;
                }

                // 2. 해당 데이터들을 조합하여 API를 호출한다.
                String apiUrl = URL + name + "/" + song;

                RequestQueue requestQueue = Volley.newRequestQueue(MainActivity.this);
                // 네트워크 통신을 위한 Request를 만들어야 하는데,
                // Json으로 통신하기 때문에
                // JsonObjectRequest 클래스를 객체 생성한다.
                // 생성자는 : http 메소드, API URL, 전달할 데이터, 응답받으면 실행할 코드, 에러를 받으면 실행할 코드
                JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.GET, apiUrl, null, new Response.Listener<JSONObject>() {
                    @Override
                    public void onResponse(JSONObject response) {
                        // 3. 서버로부터 응답(Response)를 받아서, 텍스트뷰에 표시한다.
                        // API를 호출한 결과가 여기서 실행된다.
                        // 따라서 우리는 여기에다가, 가사를 화면에 보여주는 코드를 작성.
                        // 즉, txtLyrics 에 가사를 보여준다.

                        Log.i("MyLyrics", response.toString());
                        txtLyrics.setText(response.toString());
                    }
                }, null);

                jsonObjectRequest.setRetryPolicy(new DefaultRetryPolicy(15000,
                        DefaultRetryPolicy.DEFAULT_MAX_RETRIES,
                        DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
                requestQueue.add(jsonObjectRequest);
            }
        });
    }

}

RequestQueue에 현재 클래스 객체를 넣어준다.

그리고 JsonObjectRequest 클래스를 객체 생성하고 파라미터 순서대로 대입하고

add로 통신시작한다.

 

+ Recent posts