쨍쨍
#3. AI Smart Home_MainActivity 본문
[ Main 화면 ]
[ activity_main.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">
<ImageView
android:layout_width="360dp"
android:layout_height="90dp"
android:layout_gravity="center"
android:background="@drawable/ikon2"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.49"
app:layout_constraintStart_toStartOf="parent"
tools:layout_editor_absoluteY="34dp" />
<LinearLayout
android:id="@+id/linearLayout"
android:layout_width="350dp"
android:layout_height="90dp"
android:layout_gravity="center"
android:background="@drawable/edge"
android:orientation="horizontal"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.508"
app:layout_constraintStart_toStartOf="parent"
tools:layout_editor_absoluteY="134dp">
<ImageView
android:id="@+id/weather_sky"
android:layout_width="80dp"
android:layout_height="60dp"
android:contentDescription="@string/weather_image_description"
android:layout_gravity="center"
android:layout_marginStart="10dp"
android:src="@drawable/default_weather" />
<TextView
android:layout_width="150dp"
android:layout_height="80dp"
android:layout_gravity="center"
android:gravity="center"
android:text="오늘의 날씨"
android:layout_marginStart="10dp"
android:textColor="@color/black"
android:textSize="30sp" />
<ImageView
android:id="@+id/weather_pty"
android:layout_width="80dp"
android:layout_height="60dp"
android:layout_gravity="center"
android:contentDescription="@string/weather_image_description"
android:layout_marginStart="10dp"
android:src="@drawable/default_weather" />
</LinearLayout>
<LinearLayout
android:layout_width="350dp"
android:layout_height="220dp"
android:layout_gravity="center"
android:orientation="horizontal"
android:layout_marginTop="5dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.508"
app:layout_constraintStart_toStartOf="parent"
tools:layout_editor_absoluteY="234dp">
<LinearLayout
android:layout_width="170dp"
android:layout_height="220dp"
android:layout_gravity="center"
android:layout_marginEnd="5dp"
android:background="@drawable/edge"
android:orientation="horizontal">
<LinearLayout
android:layout_width="85dp"
android:layout_height="match_parent"
android:layout_gravity="center"
android:orientation="vertical">
<ImageView
android:layout_width="85dp"
android:layout_height="90dp"
android:layout_marginTop="10dp"
android:layout_marginLeft="5dp"
android:src="@drawable/temperature" />
<ImageView
android:layout_width="85dp"
android:layout_height="90dp"
android:layout_marginTop="20dp"
android:src="@drawable/humidity" />
</LinearLayout>
<LinearLayout
android:layout_width="85dp"
android:layout_height="match_parent"
android:layout_gravity="center"
android:orientation="vertical">
<TextView
android:layout_width="75dp"
android:layout_height="50dp"
android:layout_gravity="center"
android:layout_marginTop="5dp"
android:gravity="center"
android:text="온도"
android:textColor="@color/black"
android:textSize="24sp" />
<TextView
android:id="@+id/tempTextView"
android:layout_width="75dp"
android:layout_height="50dp"
android:layout_gravity="center"
android:gravity="center"
android:text=" "
android:textColor="@color/black"
android:textSize="24sp" />
<TextView
android:layout_width="75dp"
android:layout_height="50dp"
android:layout_gravity="center"
android:layout_marginTop="10dp"
android:gravity="center"
android:text="습도"
android:textColor="@color/black"
android:textSize="24sp" />
<TextView
android:id="@+id/rehTextView"
android:layout_width="80dp"
android:layout_height="50dp"
android:layout_gravity="center"
android:gravity="center"
android:text=" "
android:textColor="@color/black"
android:textSize="24sp" />
</LinearLayout>
</LinearLayout>
<LinearLayout
android:layout_width="170dp"
android:layout_height="220dp"
android:layout_gravity="center"
android:layout_marginStart="5dp"
android:background="@drawable/edge"
android:orientation="horizontal">
<LinearLayout
android:layout_width="84dp"
android:layout_height="match_parent"
android:layout_gravity="center"
android:orientation="vertical">
<ImageView
android:id="@+id/uv_image"
android:layout_width="68dp"
android:layout_height="82dp"
android:layout_gravity="center"
android:layout_marginTop="10dp"
android:src="@drawable/uv" />
<ImageView
android:id="@+id/dust_image"
android:layout_width="70dp"
android:layout_height="90dp"
android:layout_gravity="center"
android:layout_marginStart="5dp"
android:layout_marginTop="20dp"
android:src="@drawable/rain1" />
</LinearLayout>
<LinearLayout
android:layout_width="86dp"
android:layout_height="match_parent"
android:layout_gravity="center"
android:orientation="vertical">
<TextView
android:layout_width="75dp"
android:layout_height="50dp"
android:layout_gravity="center"
android:layout_marginTop="5dp"
android:gravity="center"
android:text="자외선"
android:textColor="@color/black"
android:textSize="24sp" />
<TextView
android:id="@+id/uvTextView"
android:layout_width="75dp"
android:layout_height="50dp"
android:gravity="center"
android:text=" "
android:textColor="@color/black"
android:textSize="24sp" />
<TextView
android:layout_width="90dp"
android:layout_height="50dp"
android:layout_gravity="center"
android:layout_marginTop="10dp"
android:gravity="center"
android:text="강수확률"
android:textColor="@color/black"
android:textSize="22sp" />
<TextView
android:id="@+id/popTextView"
android:layout_width="75dp"
android:layout_height="50dp"
android:layout_gravity="center"
android:gravity="center"
android:text=" "
android:textColor="@color/black"
android:textSize="20sp" />
</LinearLayout>
</LinearLayout>
</LinearLayout>
<LinearLayout
android:layout_width="350dp"
android:layout_height="225dp"
android:layout_gravity="center"
android:orientation="horizontal"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.508"
app:layout_constraintStart_toStartOf="parent"
tools:layout_editor_absoluteY="461dp">
<LinearLayout
android:layout_width="170dp"
android:layout_height="220dp"
android:layout_gravity="center"
android:layout_marginEnd="5dp"
android:orientation="vertical">
<LinearLayout
android:id="@+id/home_btn"
android:layout_width="170dp"
android:layout_height="100dp"
android:layout_marginTop="5dp"
android:layout_marginBottom="5dp"
android:background="@drawable/edge"
android:orientation="horizontal">
<ImageView
android:layout_width="80dp"
android:layout_height="80dp"
android:layout_marginStart="10dp"
android:layout_marginTop="10dp"
android:src="@drawable/home" />
<TextView
android:layout_width="80dp"
android:layout_height="50dp"
android:layout_gravity="center"
android:layout_marginTop="5dp"
android:gravity="center"
android:text="home"
android:textColor="@color/black"
android:textSize="24sp" />
</LinearLayout>
<LinearLayout
android:id="@+id/mode_btn"
android:layout_width="170dp"
android:layout_height="100dp"
android:layout_marginTop="5dp"
android:clickable="true"
android:focusable="true"
android:background="@drawable/edge"
android:orientation="horizontal">
<ImageView
android:layout_width="80dp"
android:layout_height="80dp"
android:layout_marginStart="10dp"
android:layout_marginTop="10dp"
android:src="@drawable/mode" />
<TextView
android:layout_width="80dp"
android:layout_height="50dp"
android:layout_gravity="center"
android:layout_marginTop="5dp"
android:gravity="center"
android:text="mode"
android:textColor="@color/black"
android:textSize="24sp" />
</LinearLayout>
</LinearLayout>
<LinearLayout
android:layout_width="172dp"
android:layout_height="225dp"
android:layout_gravity="center"
android:layout_marginStart="5dp"
android:layout_marginEnd="5dp"
android:orientation="vertical">
<LinearLayout
android:id="@+id/cctv_btn"
android:layout_width="170dp"
android:layout_height="100dp"
android:layout_marginTop="8dp"
android:layout_marginBottom="5dp"
android:background="@drawable/edge"
android:orientation="horizontal"
android:clickable="true"
android:focusable="true">
<ImageView
android:layout_width="70dp"
android:layout_height="83dp"
android:layout_marginStart="10dp"
android:layout_marginTop="10dp"
android:src="@drawable/cctv" />
<TextView
android:layout_width="80dp"
android:layout_height="50dp"
android:layout_gravity="center"
android:layout_marginTop="5dp"
android:gravity="center"
android:text="cctv"
android:textColor="@color/black"
android:textSize="24sp" />
</LinearLayout>
<LinearLayout
android:id="@+id/tip_btn"
android:layout_width="170dp"
android:layout_height="100dp"
android:layout_marginTop="5dp"
android:background="@drawable/edge"
android:orientation="horizontal"
android:clickable="true"
android:focusable="true">
<ImageView
android:layout_width="80dp"
android:layout_height="80dp"
android:layout_marginStart="10dp"
android:layout_marginTop="10dp"
android:src="@drawable/tip" />
<TextView
android:layout_width="80dp"
android:layout_height="50dp"
android:layout_gravity="center"
android:layout_marginTop="5dp"
android:gravity="center"
android:text="tip"
android:textColor="@color/black"
android:textSize="24sp" />
</LinearLayout>
</LinearLayout>
</LinearLayout>
</LinearLayout>
[ MainActivity.java ]
import android.annotation.SuppressLint;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
public class MainActivity extends AppCompatActivity implements SocketActivity.OnDataReceivedListener {
private static final String TAG = "MainActivity";
private LinearLayout homeLayout, tipLayout, graphLayout, cctvLayout, modeLayout;
private ImageView weatherSkyImageView, weatherPtyImageView;
private TextView tempTextView, rehTextView, uvTextView, popTextView;
private SocketActivity socketActivity;
private Handler uiHandler;
@SuppressLint("MissingInflatedId")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// UI 요소 초기화
homeLayout = findViewById(R.id.home_btn);
tipLayout = findViewById(R.id.tip_btn);
modeLayout = findViewById(R.id.mode_btn);
cctvLayout = findViewById(R.id.cctv_btn);
tempTextView = findViewById(R.id.tempTextView);
rehTextView = findViewById(R.id.rehTextView);
uvTextView = findViewById(R.id.uvTextView);
popTextView = findViewById(R.id.popTextView);
weatherSkyImageView = findViewById(R.id.weather_sky); // SKY 데이터 ImageView
weatherPtyImageView = findViewById(R.id.weather_pty); // PTY 데이터 ImageView
uiHandler = new Handler(Looper.getMainLooper());
// 버튼 클릭 리스너 설정
setButtonListeners();
// SocketActivity 인스턴스 가져오기 및 서버 연결 및 데이터 수신
socketActivity = SocketActivity.getInstance();
socketActivity.connectToServer(this); // 서버 연결 및 데이터 수신 시작
Log.d(TAG, "Attempting to connect to server...");
}
// 서버에서 데이터 수신 시 호출되는 메서드
@Override
public void onDataReceived(String data) {
Log.d(TAG, "Data received: " + data);
uiHandler.post(() -> parseAndSetData(data));
}
private void showAlertForBtnOn() {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
// 커스텀 레이아웃 인플레이션
LayoutInflater inflater = getLayoutInflater();
View dialogView = inflater.inflate(R.layout.emergency, null);
// AlertDialog에 커스텀 레이아웃 설정
builder.setView(dialogView)
.setTitle("알림")
.setPositiveButton("확인", (dialog, which) -> dialog.dismiss())
.show();
}
// 데이터를 파싱하고 UI에 설정하는 메서드
private void parseAndSetData(String data) {
Log.d(TAG, "Parsing data: " + data); // 데이터 파싱 로그 추가
runOnUiThread(() -> {
if (data.startsWith("TEMP:")) { // 온도 데이터
String TEMP = data.substring("TEMP:".length()).trim();
tempTextView.setText(TEMP + " °C"); // 온도 설정
} else if (data.startsWith("REH:")) { // 습도 데이터
String reh = data.substring("REH:".length()).trim();
rehTextView.setText(reh + " %"); // 습도 설정
} else if (data.startsWith("UV:")) { // 자외선 데이터
String uv = data.substring("UV:".length()).trim();
uvTextView.setText(uv); // 자외선 설정
} else if (data.startsWith("POP:")) { // 미세먼지 데이터
String POP = data.substring("POP:".length()).trim();
popTextView.setText(POP + " %"); // 자외선 설정
} else if (data.startsWith("SKY:")) {
String sky = data.substring("SKY:".length()).trim();
updateSkyImage(sky);
} else if (data.startsWith("PTY:")) {
String pty = data.substring("PTY:".length()).trim();
updatePtyImage(pty);
}
});
}
private void updateSkyImage(String sky) {
int imageResId = R.drawable.nope;
if (sky != null) {
switch (sky) {
case "맑음":
imageResId = R.drawable.weather_sun;
break;
case "구름많음":
imageResId = R.drawable.weather_cloudy;
break;
case "흐림":
imageResId = R.drawable.weather_mcloudy;
break;
}
}
weatherSkyImageView.setImageResource(imageResId);
}
private void updatePtyImage(String pty) {
int imageResId = R.drawable.nope; // 기본값을 nope 이미지로 설정
if (pty != null) {
switch (pty) {
case "비":
case "소나기":
imageResId = R.drawable.weather_rain;
break;
case "눈":
case "진눈깨비":
imageResId = R.drawable.weather_snow;
break;
}
}
weatherPtyImageView.setImageResource(imageResId);
}
// 버튼 클릭 리스너 설정 메서드
private void setButtonListeners() {
homeLayout.setOnClickListener(v -> startActivity(new Intent(MainActivity.this, HomeActivity.class)));
tipLayout.setOnClickListener(v -> startActivity(new Intent(MainActivity.this, TipActivity.class)));
modeLayout.setOnClickListener(v -> startActivity(new Intent(MainActivity.this, ModeActivity.class)));
cctvLayout.setOnClickListener(v -> startActivity(new Intent(MainActivity.this, CctvActivity.class)));
}
@Override
protected void onDestroy() {
super.onDestroy();
// MainActivity 종료 시 서버 연결 해제
if (socketActivity != null) {
socketActivity.disconnect();
}
}
}
'프로그래밍 코드 > Android Studio' 카테고리의 다른 글
#4. AI Smart Home_SocketActivity (3) | 2024.12.17 |
---|---|
AI 심리 분석 프로그램 도담이 (1) | 2024.07.22 |
#2. AI Smart Home_RegisterActivity (0) | 2024.03.13 |
#1. AI Smart Home_LoginActivity (0) | 2024.03.13 |
[Android Studio] 클릭 이벤트를 사용하는 4가지 방법 (0) | 2023.05.22 |