쨍쨍
#6. Al Smart Home_TipActivity 본문
[ tip 화면 및 기능 ]

[ activity_tip.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=".TipActivity">
<ImageView
android:layout_width="355dp"
android:layout_height="80dp"
android:layout_gravity="center"
android:layout_marginTop="5dp"
android:background="@drawable/tip2"/>
<!-- android:contentDescription="@string/StringValue" />-->
<LinearLayout
android:layout_width="355dp"
android:layout_height="500dp"
android:layout_gravity="center"
android:layout_marginTop="10dp"
android:layout_marginBottom="10dp"
android:orientation="vertical">
<TextView
android:id="@+id/user_temp"
android:layout_width="350dp"
android:layout_height="50dp"
android:layout_gravity="center"
android:layout_marginTop="30dp"
android:gravity="center"
android:text=" "
android:textColor="@color/black"
android:textSize="24sp" />
<LinearLayout
android:layout_width="350dp"
android:layout_height="70dp"
android:layout_gravity="center"
android:background="@color/Skyblue"
android:layout_marginTop="10dp"
android:layout_marginBottom="10dp"
android:orientation="horizontal">
<ImageView
android:layout_width="30dp"
android:layout_height="30dp"
android:layout_marginTop="10dp"
android:layout_marginStart="2dp"
android:src="@drawable/ai" />
<!-- android:contentDescription="@string/StringValue"-->
<TextView
android:id="@+id/textview"
android:layout_width="320dp"
android:layout_height="70dp"
android:layout_gravity="center"
android:text=" "
android:gravity="center"
android:textColor="@color/black"
android:textSize="18sp" />
</LinearLayout>
<TextView
android:id="@+id/out_rain"
android:layout_width="350dp"
android:layout_height="50dp"
android:layout_marginTop="20dp"
android:layout_gravity="center"
android:gravity="center"
android:text=" "
android:textColor="@color/black"
android:textSize="24sp" />
<LinearLayout
android:layout_width="350dp"
android:layout_height="70dp"
android:layout_gravity="center"
android:background="@color/Skyblue"
android:layout_marginTop="10dp"
android:layout_marginBottom="10dp"
android:orientation="horizontal">
<ImageView
android:layout_width="30dp"
android:layout_height="30dp"
android:layout_marginTop="10dp"
android:layout_marginStart="2dp"
android:src="@drawable/ai" />
<!-- android:contentDescription="@string/StringValue"-->
<TextView
android:id="@+id/textview2"
android:layout_width="320dp"
android:layout_height="70dp"
android:layout_gravity="center"
android:text=" "
android:gravity="center"
android:textColor="@color/black"
android:textSize="18sp" />
</LinearLayout>
<TextView
android:id="@+id/liv_temp2"
android:layout_width="350dp"
android:layout_height="50dp"
android:layout_gravity="center"
android:layout_marginTop="20dp"
android:gravity="center"
android:text="총정리"
android:textColor="@color/black"
android:textSize="24sp" />
<LinearLayout
android:layout_width="350dp"
android:layout_height="70dp"
android:layout_gravity="center"
android:background="@color/Skyblue"
android:layout_marginTop="10dp"
android:layout_marginBottom="10dp"
android:orientation="horizontal">
<ImageView
android:layout_width="30dp"
android:layout_height="30dp"
android:layout_marginTop="20dp"
android:layout_marginStart="2dp"
android:src="@drawable/ai" />
<!-- android:contentDescription="@string/StringValue"-->
<TextView
android:id="@+id/textview3"
android:layout_width="320dp"
android:layout_height="70dp"
android:layout_gravity="center"
android:gravity="center"
android:text=" "
android:textColor="@color/black"
android:textSize="18sp" />
</LinearLayout>
<TextView
android:id="@+id/weather_pre"
android:layout_width="350dp"
android:layout_height="50dp"
android:layout_gravity="center"
android:layout_marginTop="15dp"
android:gravity="center"
android:text="오늘도 행복한 하루 보내세요 :)"
android:textColor="@color/black"
android:textSize="16sp" />
</LinearLayout>
</LinearLayout>
[ TipActivity.java ]
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.TextView;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
public class TipActivity extends AppCompatActivity implements SocketActivity.OnDataReceivedListener {
private static final String TAG = "TipActivity";
private TextView userTempTextView, rainTextView, textView, textView2, textView3;
private Handler uiHandler;
private SocketActivity socketActivity;
private int messageIndex = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_tip);
// UI 요소 초기화
userTempTextView = findViewById(R.id.user_temp);
rainTextView = findViewById(R.id.out_rain);
textView = findViewById(R.id.textview);
textView2 = findViewById(R.id.textview2);
textView3 = findViewById(R.id.textview3);
// 텍스트뷰 초기값 설정
textView.setText("");
textView2.setText("");
textView3.setText("");
uiHandler = new Handler(Looper.getMainLooper());
// SocketActivity 인스턴스를 가져와서 서버 연결 시작
socketActivity = SocketActivity.getInstance();
// SocketActivity의 활성화된 액티비티 설정
// socketActivity.getInstance().setActiveActivity("TipActivity");
socketActivity.connectToServer(this); // 서버 연결 및 데이터 수신
}
// 서버에서 데이터 수신 시 호출되는 메서드
@Override
public void onDataReceived(String data) {
Log.d(TAG, "Data received: " + data);
uiHandler.post(() -> parseAndSetData(data));
if (data.equals("BTN_ON")) {
runOnUiThread(this::showAlertForBtnOn); // UI 스레드에서 팝업 실행
}
}
// 비상버튼 팝업창
private void showAlertForBtnOn() {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
// 팝업창(AlertDialog)을 구성하는 객체를 생성.
// 커스텀 레이아웃 인플레이션
LayoutInflater inflater = getLayoutInflater();
View dialogView = inflater.inflate(R.layout.emergency, null);
// XML 레이아웃 파일(R.layout.emergency)을 View 객체로 변환.
// R.layout.emergency는 비상 팝업창의 레이아웃 파일.
// AlertDialog에 커스텀 레이아웃 설정
builder.setView(dialogView)
// setView(dialogView)를 호출하여 팝업창의 UI를 커스텀 레이아웃으로 설정.
.setTitle("알림")
// 팝업창의 제목으로 "알림"을 지정.
.setPositiveButton("확인", (dialog, which) -> dialog.dismiss())
// 확인 버튼 클릭 시 dialog.dismiss()를 호출하여 팝업창 닫기.
.show();
// builder로 구성한 AlertDialog를 화면에 표시.
}
// 데이터를 파싱하고 UI에 설정하는 메서드
private void parseAndSetData(String data) {
Log.d(TAG, "Parsing data: " + data);
if (data.startsWith("TEMP:")) { // 온도 데이터
// data 문자열이 "TEMP:"로 시작하는 경우.
String temp = data.substring("TEMP:".length()).trim();
// "TEMP:" 이후의 문자열을 추출 (substring)하고, 공백을 제거 (trim).
userTempTextView.setText("오늘의 기온은 " + temp + " °C 도입니다.");
// userTempTextView를 업데이트하여 "오늘의 기온은 XX°C 도입니다." 형식의 텍스트를 표시.
} else if (data.startsWith("POP:")) { // 강수확률 데이터
String pop = data.substring("POP:".length()).trim();
rainTextView.setText("오늘의 강수확률은 " + pop + " % 입니다.");
} else if (data.matches("^[1-3]\\.\\s*.*")) { // data가 **숫자 1, 2, 3 + 점(.) + 공백(optional)**으로 시작하는 경우
Log.d(TAG, "General message received. Passing to displayGeneralMessage.");
displayGeneralMessage(data);
} else {
Log.d(TAG, "Ignored non-Tip_Data message: " + data);
// 위의 조건들(TEMP:, POP:, 일반 메시지)에 해당하지 않는 경우.
// 로그를 출력하여 무시된 데이터를 기록하고 UI 업데이트 없이 데이터를 처리하지 않음.
}
}
private void displayGeneralMessage(String message) {
// 번호와 점만 제거하고 공백은 그대로 유지
String cleanedMessage = message.replaceFirst("^\\d+\\.", "");
uiHandler.post(() -> {
Log.d(TAG, "Displaying Tip_Data message: " + cleanedMessage);
// 메시지를 가공한 후 TextView에 설정
if (messageIndex == 0) {
textView.setText(cleanedMessage);
} else if (messageIndex == 1) {
textView2.setText(cleanedMessage);
} else if (messageIndex == 2) {
textView3.setText(cleanedMessage);
}
messageIndex++;
// 3개 이상의 메시지를 처리하지 않도록 순환 설정
if (messageIndex >= 3) {
messageIndex = 0;
}
});
}
@Override
protected void onDestroy() {
super.onDestroy();
if (socketActivity != null) {
socketActivity.disconnect();
}
}
}
'프로그래밍 코드 > Android Studio' 카테고리의 다른 글
#8. AI Smart Home_CctvActivity (1) | 2024.12.17 |
---|---|
#7. AI Smart Home_ModeActivity (0) | 2024.12.17 |
#5. Al Smart Home_HomeActivty (3) | 2024.12.17 |
#4. AI Smart Home_SocketActivity (3) | 2024.12.17 |
AI 심리 분석 프로그램 도담이 (1) | 2024.07.22 |