From c517367a47022bedff70f708b2e57424611a642e Mon Sep 17 00:00:00 2001 From: cloudroam <cloudroam> Date: 星期三, 02 四月 2025 09:13:02 +0800 Subject: [PATCH] fix : 样式 --- app/src/main/res/drawable/up.png | 0 app/src/main/java/com/example/firstapp/ui/home/HomeFragment.kt | 11 + app/src/main/java/com/example/firstapp/MainActivity.kt | 76 +-------------- app/src/main/java/com/example/firstapp/view/UnderlineTextView.kt | 43 ++++++++ app/src/main/res/drawable/tab_selected_background.xml | 9 + app/src/main/res/drawable/set.xml | 13 +- app/src/main/res/layout/fragment_home.xml | 109 +++++++++++---------- 7 files changed, 126 insertions(+), 135 deletions(-) diff --git a/app/src/main/java/com/example/firstapp/MainActivity.kt b/app/src/main/java/com/example/firstapp/MainActivity.kt index 9db1f81..c59ca87 100644 --- a/app/src/main/java/com/example/firstapp/MainActivity.kt +++ b/app/src/main/java/com/example/firstapp/MainActivity.kt @@ -17,29 +17,20 @@ import android.net.Uri import android.os.Build import androidx.annotation.RequiresApi -import androidx.work.ExistingPeriodicWorkPolicy -import androidx.work.PeriodicWorkRequestBuilder -import androidx.work.WorkManager import com.example.firstapp.activity.LoginActivity -import com.example.firstapp.adapter.MyAdapter import com.example.firstapp.core.Core import com.example.firstapp.database.entity.Code import com.example.firstapp.database.entity.Msg import com.example.firstapp.database.service.RetrofitClient import com.example.firstapp.database.service.RetrofitModelClient -import com.example.firstapp.ui.home.HomeViewModel import com.example.firstapp.utils.Log -import com.example.firstapp.workers.KeywordUpdateWorker import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import java.text.SimpleDateFormat -import java.time.LocalDateTime import java.util.Calendar import java.util.Date import java.util.Locale -import java.util.concurrent.TimeUnit -import java.time.ZoneId class MainActivity : AppCompatActivity() { // 安全防护关键词数组 @@ -48,9 +39,6 @@ private lateinit var binding: ActivityMainBinding private var smsReceiver: SmsReceiver? = null - - private lateinit var adapter: MyAdapter - private lateinit var homeViewModel: HomeViewModel private val multiplePermissionRequest = registerForActivityResult(ActivityResultContracts.RequestMultiplePermissions()) { permissions -> @@ -61,8 +49,6 @@ ) && permissions.getOrDefault(Manifest.permission.READ_SMS, false) -> { // 两个权限都获得授权 registerSmsReceiver() -// syncRecentSms() -// initializeSecurityKeywords() } else -> { @@ -83,13 +69,6 @@ binding = ActivityMainBinding.inflate(layoutInflater) setContentView(binding.root) setupViews() -// binding.btnLogout.setOnClickListener { -// logout() -// } - // 在此位置初始化 homeViewModel -// homeViewModel = ViewModelProvider(this).get(HomeViewModel::class.java) -// -// val navView: BottomNavigationView = binding.navView val navView = binding.navView val navController = findNavController(R.id.nav_host_fragment_activity_main) @@ -114,35 +93,6 @@ registerSmsReceiver() syncRecentSms() } -// val recyclerView = findViewById<RecyclerView>(R.id.recyclerView) -// recyclerView.layoutManager = LinearLayoutManager(this) -// -// // 初始化适配器 -// adapter = MyAdapter() -// recyclerView.adapter = adapter -// -// // 观察 LiveData 数据 -// homeViewModel.codeList.observe(this) { codeList -> -// // 如果 codeList 为 null,避免闪退 -// if (codeList != null) { -// adapter.submitList(codeList) -// // 滚动到顶部 -// recyclerView.scrollToPosition(0) -// } else { -// // 如果数据为空,可以显示空列表或其他处理 -// Toast.makeText(this, "No data available", Toast.LENGTH_SHORT).show() -// } -// } - -// // 注册广播接收器来监听数据更新 -// val filter = IntentFilter("com.example.firstapp.DATA_UPDATED") -// registerReceiver(object : BroadcastReceiver() { -// override fun onReceive(context: Context, intent: Intent) { -// // 数据已更新,刷新 LiveData -// homeViewModel.loadData() -// } -// }, filter) - } private fun registerSmsReceiver() { @@ -162,25 +112,9 @@ registerReceiver(smsReceiver, filter) } - private fun setupKeywordUpdate() { - val updateRequest = PeriodicWorkRequestBuilder<KeywordUpdateWorker>( - 1, TimeUnit.HOURS, // 每小时更新一次 - 15, TimeUnit.MINUTES // 灵活时间窗口 - ).build() - - WorkManager.getInstance(this).enqueueUniquePeriodicWork( - "keyword_update", ExistingPeriodicWorkPolicy.REPLACE, updateRequest - ) - } - private fun setupViews() { // 获取并显示当前登录的手机号 - val phone = - getSharedPreferences("user_info", Context.MODE_PRIVATE).getString("phone", "") ?: "" - -// binding.apply { -// tvPhone.text = "当前登录手机号:$phone" -// } + getSharedPreferences("user_info", Context.MODE_PRIVATE).getString("phone", "") ?: "" } private fun logout() { @@ -248,10 +182,10 @@ val msgId = Core.msg.insert(msg) // 禁用关键词拦截 - if (securityKeywordsList.any { it in messageBody }) { - android.util.Log.d("MainActivity", "历史短信含有禁用关键词,跳过处理") - continue - } +// if (securityKeywordsList.any { it in messageBody }) { +// android.util.Log.d("MainActivity", "历史短信含有禁用关键词,跳过处理") +// continue +// } // 使用协程处理API调用和数据库操作 CoroutineScope(Dispatchers.IO).launch { diff --git a/app/src/main/java/com/example/firstapp/ui/home/HomeFragment.kt b/app/src/main/java/com/example/firstapp/ui/home/HomeFragment.kt index e25ebf7..2a10248 100644 --- a/app/src/main/java/com/example/firstapp/ui/home/HomeFragment.kt +++ b/app/src/main/java/com/example/firstapp/ui/home/HomeFragment.kt @@ -33,13 +33,12 @@ import com.example.firstapp.utils.PreferencesManager import com.google.android.material.bottomsheet.BottomSheetDialog import kotlinx.coroutines.launch +import com.example.firstapp.view.UnderlineTextView class HomeFragment : Fragment() { private var _binding: FragmentHomeBinding? = null - // This property is only valid between onCreateView and - // onDestroyView. private val binding get() = _binding!! private lateinit var homeViewModel: HomeViewModel @@ -274,13 +273,17 @@ } } - private fun updateTabStyles(selectedTab: TextView) { + private fun updateTabStyles(selectedTab: UnderlineTextView) { binding.apply { val tabs = listOf(tabExpress, tabFinance, tabIncome, tabFlight, tabTrain) tabs.forEach { tab -> + // 设置文字颜色为黑色或灰色 tab.setTextColor(ContextCompat.getColor(requireContext(), - if (tab == selectedTab) R.color.tab_selected else R.color.gray)) + if (tab == selectedTab) android.R.color.black else R.color.gray)) + // 设置文字大小 tab.textSize = if (tab == selectedTab) 16f else 14f + // 设置下划线 + tab.setUnderlineVisible(tab == selectedTab) } } } diff --git a/app/src/main/java/com/example/firstapp/view/UnderlineTextView.kt b/app/src/main/java/com/example/firstapp/view/UnderlineTextView.kt new file mode 100644 index 0000000..b07faa0 --- /dev/null +++ b/app/src/main/java/com/example/firstapp/view/UnderlineTextView.kt @@ -0,0 +1,43 @@ +package com.example.firstapp.view + +import android.content.Context +import android.graphics.Canvas +import android.graphics.Paint +import android.util.AttributeSet +import androidx.appcompat.widget.AppCompatTextView +import androidx.core.content.ContextCompat + +class UnderlineTextView @JvmOverloads constructor( + context: Context, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0 +) : AppCompatTextView(context, attrs, defStyleAttr) { + + private val underlinePaint = Paint().apply { + color = ContextCompat.getColor(context, android.R.color.black) + strokeWidth = context.resources.displayMetrics.density * 2 // 2dp + } + + private var showUnderline = false + + fun setUnderlineVisible(visible: Boolean) { + showUnderline = visible + invalidate() + } + + override fun onDraw(canvas: Canvas) { + super.onDraw(canvas) + + if (showUnderline) { + val textWidth = paint.measureText(text.toString()) + val startX = (width - textWidth) / 2 + canvas.drawLine( + startX, + height - underlinePaint.strokeWidth, + startX + textWidth, + height - underlinePaint.strokeWidth, + underlinePaint + ) + } + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable/set.xml b/app/src/main/res/drawable/set.xml index cec8ed9..4ff2b5e 100644 --- a/app/src/main/res/drawable/set.xml +++ b/app/src/main/res/drawable/set.xml @@ -1,12 +1,9 @@ <vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="217.6dp" - android:height="200dp" - android:viewportWidth="1114" + android:width="48dp" + android:height="48dp" + android:viewportWidth="1024" android:viewportHeight="1024"> <path - android:pathData="M1081,394.7l-162.5,-278.6c-41.8,-72 -118.4,-116.1 -199.7,-116.1L393.7,-0c-81.3,0 -160.2,44.1 -199.7,116.1l-162.5,278.6c-41.8,72 -41.8,162.5 0,234.5l162.5,278.6c41.8,72 118.4,116.1 199.7,116.1h325.1c81.3,0 160.2,-44.1 199.7,-116.1l162.5,-278.6c41.8,-74.3 41.8,-162.5 0,-234.5zM1002,580.5l-162.5,278.6c-25.5,41.8 -72,69.7 -120.7,69.7L393.7,928.8c-48.8,0 -95.2,-25.5 -120.7,-69.7l-162.5,-278.6c-25.5,-44.1 -25.5,-97.5 0,-139.3l162.5,-278.6c25.5,-41.8 72,-69.7 120.7,-69.7h325.1c48.8,0 95.2,25.5 120.7,69.7l162.5,278.6c25.5,41.8 25.5,97.5 0,139.3z" - android:fillColor="#707070"/> - <path - android:pathData="M556.2,301.9c-116.1,0 -209,92.9 -209,209s92.9,209 209,209 209,-92.9 209,-209 -92.9,-209 -209,-209zM556.2,626.9c-65,0 -116.1,-51.1 -116.1,-116.1s51.1,-116.1 116.1,-116.1 116.1,51.1 116.1,116.1 -51.1,116.1 -116.1,116.1z" - android:fillColor="#707070"/> + android:fillColor="#FF000000" + android:pathData="M737,647c-5.6,-5.6 -11.3,-11.3 -16.9,-11.3 -16.9,0 -28.1,11.3 -28.1,28.1 0,11.3 5.6,16.9 11.3,22.5C770.8,737 815.8,815.8 821.4,905.8h50.6c-5.6,-106.9 -56.3,-196.9 -135,-258.8M523.3,551.4c-101.3,0 -185.6,-84.4 -185.6,-185.6C332,258.9 416.4,174.5 523.3,174.5 624.5,174.5 708.9,258.9 708.9,360.1c0,106.9 -84.4,191.3 -185.6,191.3zM765.1,365.8C765.1,230.8 658.3,118.3 517.6,118.3c-129.4,0 -241.9,106.9 -241.9,247.5 0,90 50.6,168.8 123.8,213.8 -140.6,39.4 -241.9,168.8 -247.5,326.3H202.6c5.6,-163.1 140.6,-292.5 303.8,-298.1H523.3c135,0 241.9,-106.9 241.9,-241.9z"/> </vector> diff --git a/app/src/main/res/drawable/tab_selected_background.xml b/app/src/main/res/drawable/tab_selected_background.xml new file mode 100644 index 0000000..e0872bf --- /dev/null +++ b/app/src/main/res/drawable/tab_selected_background.xml @@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="utf-8"?> +<layer-list xmlns:android="http://schemas.android.com/apk/res/android"> + <item android:gravity="bottom"> + <shape android:shape="rectangle"> + <size android:height="2dp" /> + <solid android:color="@android:color/black" /> + </shape> + </item> +</layer-list> \ No newline at end of file diff --git a/app/src/main/res/drawable/up.png b/app/src/main/res/drawable/up.png new file mode 100644 index 0000000..f7379a8 --- /dev/null +++ b/app/src/main/res/drawable/up.png Binary files differ diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml index 575b8ce..5305951 100644 --- a/app/src/main/res/layout/fragment_home.xml +++ b/app/src/main/res/layout/fragment_home.xml @@ -23,79 +23,84 @@ <!-- 快递/财务切换区域 --> - <LinearLayout + <FrameLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginBottom="8dp" android:layout_marginTop="8dp" - android:layout_marginHorizontal="8dp" - android:orientation="horizontal"> + android:layout_marginHorizontal="8dp"> - <TextView - android:id="@+id/tabExpress" - android:layout_width="0dp" + <LinearLayout + android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_weight="1" - android:gravity="center" - android:padding="6dp" - android:text="快递" - android:textSize="14sp" - android:textStyle="bold" /> + android:layout_marginEnd="30dp" + android:orientation="horizontal"> - <TextView - android:id="@+id/tabFinance" - android:layout_width="0dp" - android:layout_height="wrap_content" - android:layout_weight="1" - android:gravity="center" - android:padding="6dp" - android:text="还款" - android:textSize="14sp" /> + <com.example.firstapp.view.UnderlineTextView + android:id="@+id/tabExpress" + android:layout_width="0dp" + android:layout_height="wrap_content" + android:layout_weight="1" + android:gravity="center" + android:padding="6dp" + android:text="快递" + android:textSize="14sp" + android:textStyle="bold" /> - <TextView - android:id="@+id/tabIncome" - android:layout_width="0dp" - android:layout_height="wrap_content" - android:layout_weight="1" - android:gravity="center" - android:padding="6dp" - android:text="收入" - android:textSize="14sp" /> + <com.example.firstapp.view.UnderlineTextView + android:id="@+id/tabFinance" + android:layout_width="0dp" + android:layout_height="wrap_content" + android:layout_weight="1" + android:gravity="center" + android:padding="6dp" + android:text="还款" + android:textSize="14sp" /> - <TextView - android:id="@+id/tabFlight" - android:layout_width="0dp" - android:layout_height="wrap_content" - android:layout_weight="1" - android:gravity="center" - android:padding="6dp" - android:text="航班" - android:textSize="14sp" /> + <com.example.firstapp.view.UnderlineTextView + android:id="@+id/tabIncome" + android:layout_width="0dp" + android:layout_height="wrap_content" + android:layout_weight="1" + android:gravity="center" + android:padding="6dp" + android:text="收入" + android:textSize="14sp" /> - <TextView - android:id="@+id/tabTrain" - android:layout_width="0dp" - android:layout_height="wrap_content" - android:layout_weight="1" - android:gravity="center" - android:padding="6dp" - android:text="火车票" - android:textSize="14sp" /> + <com.example.firstapp.view.UnderlineTextView + android:id="@+id/tabFlight" + android:layout_width="0dp" + android:layout_height="wrap_content" + android:layout_weight="1" + android:gravity="center" + android:padding="6dp" + android:text="航班" + android:textSize="14sp" /> + + <com.example.firstapp.view.UnderlineTextView + android:id="@+id/tabTrain" + android:layout_width="0dp" + android:layout_height="wrap_content" + android:layout_weight="1" + android:gravity="center" + android:padding="6dp" + android:text="火车票" + android:textSize="14sp" /> + + </LinearLayout> <ImageButton android:id="@+id/categoryButton" android:layout_width="28dp" android:layout_height="28dp" - android:layout_gravity="center_vertical" - android:layout_marginStart="2dp" - android:layout_marginEnd="2dp" + android:layout_gravity="center_vertical|end" android:background="?attr/selectableItemBackgroundBorderless" android:contentDescription="分类设置" android:padding="4dp" android:scaleType="fitCenter" android:src="@drawable/home_add" /> - </LinearLayout> + </FrameLayout> <!-- 内容区域 --> <FrameLayout -- Gitblit v1.9.3