AS第二节实验课

如何解决按钮一直不变换颜色,保持主题紫色的问题(2023年版本的AS)

昨晚搜了一整晚的博客,没找到适合我的AS体质的解决方案。有的说的是改主题,但怎么改都没用,最多是改变了下主题的默认颜色,但是按钮背景色还是遵循主题色;有的说改主题色,比如colorPrimary,colorSecondary之类的,但这还是不能让我自定义button颜色;还有的说用android:backgroundTint,但这个带Tint的好像是跟矢量资源相关的。
今早在YouTube上搜,有不少视频资源的,居然很快找到了解决方案,这个video也是最近发布的。
具体解决方案就是其他跟主题相关的都不用改,把activity_main.xml中的Button改成androidx.appcompat.widget.AppCompatButton就行。
就像这样:

1
2
3
4
5
6
7
8
<androidx.appcompat.widget.AppCompatButton
android:id="@+id/bt_CE"
android:layout_width="270px"
android:layout_height="270px"
android:text="CE"
android:clickable="true"
style="@style/CustomButtonStyle"
android:textColor="@color/black" />

💡注:按钮自定义样式style="@style/CustomButtonStyle"的介绍在下面。

按钮自定义样式笔记

然后就是关于按钮自定义样式了,打算记一下笔记。
如上,这里style="@style/CustomButtonStyle"CustomButtonStyle需要定义一下。
可以在themes.xml中添加自定义的样式,也可以自己在values文件夹下添加一个styles.xml,如图:
文件夹图示
然后写上如下代码:

1
2
3
4
5
6
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="CustomButtonStyle" parent="android:Widget.Button">
<item name="android:background">@drawable/button_selector</item>
</style>
</resources>

对应的,我们需要在@drawable文件夹下创一个selector标签的文件,取名为button_selector,代码:

1
2
3
4
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/light_gray_bg" android:state_pressed="false" />
<item android:drawable="@drawable/dark_gray_bg" android:state_pressed="true" />
</selector>

意思是按钮按下前是@drawable/light_gray_bg样式,按下后是@drawable/dark_gray_bg样式,然后我们分别写@drawable文件夹下的light_gray_bgdark_gray_bg文件。
light_gray_bg文件代码:

1
2
3
4
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="@color/light_gray" /> <!-- 这里设置背景颜色 -->
</shape>

dark_gray_bg文件代码:

1
2
3
4
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="@color/dark_gray" /> <!-- 这里设置背景颜色 -->
</shape>

💡注:这里的@color/*的介绍在下面。

@color/*

在values文件夹下创建colors.xml,若以有请忽略(忘了新建项目时它是否自带了)。

写上形如下的代码:

1
2
3
4
5
6
7
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="black">#FF000000</color>
<color name="white">#FFFFFFFF</color>
<color name="light_gray">#E6E6E6</color>
<color name="dark_gray">#CFCFCF</color>
</resources>

插入图片

drawable文件夹下放图片,然后引用的时候只写文件名,不要带扩展名。
代码如下:

1
2
3
4
5
6
<ImageView
android:id="@+id/android"
android:layout_width="wrap_content"
android:layout_height="400sp"
android:src="@drawable/android"
tools:ignore="MissingConstraints" />

这里有个关于文字可能被图片遮盖而无法显示的问题!

在 XML 布局文件中,各个组件的顺序会影响它们在界面中的显示顺序以及布局层叠的顺序。

具体来说,后面声明的视图会叠放在前面声明的视图上方。这意味着如果两个视图有重叠部分,后面声明的视图会覆盖在前面声明的视图之上。

比如以下代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<ImageView
android:id="@+id/android"
android:layout_width="wrap_content"
android:layout_height="400sp"
android:src="@drawable/android"
tools:ignore="MissingConstraints" />
<TextView
android:id="@+id/countdown_text"
android:layout_width="0dp"
android:layout_height="100sp"
android:layout_marginTop="184dp"
android:text="5"
android:gravity="center"
android:textSize="80sp"
app:layout_constraintEnd_toEndOf="@id/android"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toStartOf="@id/android"
app:layout_constraintTop_toTopOf="@id/android" />

后声明的TextView会叠放在ImageView上方,也就是说文字显示在图片上放,不会被图片遮盖。

帮室友debug之activity创建的问题

室友是直接创建两个文件,一个.xml,一个.java,但是这样是不会被识别成activity的,只会被识别成一个普通的.xml文件。

然后new了一个activity,AS给自动生成.xml和.java文件后,把原先的代码粘贴进去,就可以完美运作了。

因此创建activity还是需要用new。

名词理解&解释

module

首先一个application可以new多个module(这个老师上课就一直在强调)。老师第一节实验课就说了,可以用new module的方法,这样我们之后需要多做几个app的时候就不需要疯狂地new projects了。

activity

activity相当于是页面。官方点的解释是这样的:

Activity 是 Android 应用程序中的一个核心组件,它代表了用户界面的一个单独屏幕或窗口。每个 Activity 都提供了一个用于与用户交互的界面,可以包括按钮、文本输入框、图像等。

在 Android 应用程序中,通常会有多个 Activity,每个 Activity 负责处理不同的用户界面和交互逻辑。用户可以在这些 Activity 之间进行切换,从而让应用程序能够提供多个不同的功能。

每个 Activity 都有一个生命周期(Lifecycle),包括以下主要阶段:

  1. 创建阶段(onCreate): Activity 第一次被创建时调用,通常在这里进行初始化操作。
  2. 启动阶段(onStart): Activity 可见但未获得用户焦点时调用。
  3. 恢复阶段(onResume): Activity 获得用户焦点时调用。
  4. 暂停阶段(onPause): Activity 失去用户焦点但仍然可见时调用,常用于释放资源。
  5. 停止阶段(onStop): Activity 不可见时调用。
  6. 销毁阶段(onDestroy): Activity 被销毁时调用,通常在这里进行资源释放。
  7. 重新创建阶段(onRestart): Activity 从停止状态重新启动时调用。

Activity 之间可以通过 Intent 进行通信和切换,可以传递数据和启动其他 Activity。

💡注:在 AndroidManifest.xml 文件中,需要在其中注册所有的 Activity,以便系统知道如何管理它们。

Intent

Intent(意图)是在 Android 中用于在不同组件(如 Activity、Service、BroadcastReceiver 等)之间进行通信的一种机制。它用于描述应用程序中的一个操作,比如启动一个新的 Activity、启动一个 Service、发送一个广播等。

“Intent” 这个单词在英语中表示一种意图、目的或者打算。在 Android 开发中,”Intent” 被用作一种通信机制,它表示了执行一个特定动作或者实现一个特定目的的意图。

Intent 可以用来:

  1. 启动组件: 通过 Intent 可以启动另一个 Activity、Service、BroadcastReceiver 或者 Content Provider。
  2. 传递数据: 通过 Intent 可以在不同组件之间传递数据,比如字符串、整数、对象等。
  3. 发起动作: 通过 Intent 可以发起某种动作,比如打开一个网页、拨打电话、发送邮件等。
  4. 接收系统广播: 通过注册 BroadcastReceiver 并使用 IntentFilter,你可以接收系统发出的广播消息,比如网络状态变化、电池状态变化等。

总的来说,Intent 是 Android 中实现组件之间通信和协作的重要机制,它能够将不同组件连接起来,实现复杂的应用逻辑。

例如,你可以使用 Intent 启动一个新的 Activity,传递一些数据给它,然后在新的 Activity 中处理这些数据。

1
2
3
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
intent.putExtra("key", "value"); // 传递数据
startActivity(intent); // 启动新的 Activity

💡注:这里的`"key"`是用于在 Intent 中标识传递数据的唯一字符串。它用于在发送和接收数据时对数据进行标识和匹配。 当你使用 putExtra() 方法将数据放入 Intent 时,你需要提供一个字符串键(key)和对应的数值或者对象。这个键就是用来在接收端识别和获取对应数据的标识符。

在 SecondActivity 中可以通过获取 Intent 中的数据来处理:

1
2
Intent intent = getIntent();
String value = intent.getStringExtra("key"); // 获取传递的数据

总的来说,Intent 在 Android 开发中是非常重要的一个概念,它是实现组件之间通信的桥梁。