帮我用kotlin写一个安卓登录查看天气预报的项目
时间: 2023-10-09 19:14:23 浏览: 166
好的,下面是一个使用 Kotlin 编写的安卓登录查看天气预报的项目,供您参考。该项目使用了 MVVM 架构,网络请求使用 Retrofit 和 OkHttp,天气数据来源于和风天气 API。
首先,在 build.gradle 文件中添加以下依赖项:
```
// Retrofit 和 OkHttp
implementation 'com.squareup.retrofit2:retrofit:2.9.0'
implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
implementation 'com.squareup.okhttp3:logging-interceptor:4.9.0'
// LiveData 和 ViewModel
implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.3.1'
implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1'
// Kotlin 协程
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.1'
// Glide 图片加载库
implementation 'com.github.bumptech.glide:glide:4.12.0'
```
然后,在 activity_login.xml 中创建登录界面的 UI,包括用户名、密码输入框和登录按钮。代码如下:
```
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:gravity="center">
<EditText
android:id="@+id/username"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="请输入用户名" />
<EditText
android:id="@+id/password"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="请输入密码"
android:inputType="textPassword" />
<Button
android:id="@+id/login"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="登录" />
</LinearLayout>
```
接着,在 activity_weather.xml 中创建查看天气预报的 UI,包括城市名、天气图标和温度等信息的显示。代码如下:
```
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:gravity="center">
<TextView
android:id="@+id/city_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="24sp" />
<ImageView
android:id="@+id/weather_icon"
android:layout_width="100dp"
android:layout_height="100dp"
android:padding="16dp" />
<TextView
android:id="@+id/temperature"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="48sp" />
</LinearLayout>
```
接着,创建 WeatherViewModel.kt 文件,用于获取天气数据。代码如下:
```
class WeatherViewModel : ViewModel() {
private val _weather = MutableLiveData<Weather>()
val weather: LiveData<Weather> = _weather
private val apiService = Retrofit.Builder()
.baseUrl("https://devapi.qweather.com/")
.addConverterFactory(GsonConverterFactory.create())
.client(OkHttpClient.Builder()
.addInterceptor(HttpLoggingInterceptor().apply {
level = HttpLoggingInterceptor.Level.BODY
})
.build())
.build()
.create(ApiService::class.java)
fun fetchWeather(city: String) {
viewModelScope.launch {
try {
val response = apiService.getWeather(city)
if (response.isSuccessful) {
val data = response.body()?.data
if (data != null) {
val weather = Weather(
city = data.city,
iconUrl = data.forecast[0].iconUrl,
temperature = "${data.forecast[0].tempMin}℃ ~ ${data.forecast[0].tempMax}℃"
)
_weather.value = weather
}
}
} catch (e: Exception) {
Log.e("WeatherViewModel", "fetchWeather error", e)
}
}
}
}
```
在 WeatherViewModel 中,我们定义了一个 LiveData 对象 _weather,用于保存天气数据。在 fetchWeather() 方法中,我们使用 Retrofit 和 OkHttp 发起网络请求,获取天气数据,并将其转换为 Weather 对象,最后将其赋值给 _weather 对象。
接着,在 WeatherActivity.kt 中实现查看天气预报的功能。代码如下:
```
class WeatherActivity : AppCompatActivity() {
private lateinit var viewModel: WeatherViewModel
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_weather)
val cityName = intent.getStringExtra("cityName") ?: "北京"
viewModel = ViewModelProvider(this).get(WeatherViewModel::class.java)
viewModel.weather.observe(this, { weather ->
cityNameText.text = weather.city
Glide.with(this).load(weather.iconUrl).into(weatherIcon)
temperatureText.text = weather.temperature
})
viewModel.fetchWeather(cityName)
}
}
```
在 WeatherActivity 中,我们首先获取从 LoginActivity 传递过来的城市名 cityName,并创建一个 WeatherViewModel 对象 viewModel。然后,我们通过 observe() 方法观察 viewModel 中的 weather 对象,当 weather 发生变化时,更新 UI 上的城市名、天气图标和温度等信息。最后,我们调用 viewModel.fetchWeather(cityName) 方法获取天气数据。
最后,在 LoginActivity.kt 中实现登录功能和跳转到 WeatherActivity 的功能。代码如下:
```
class LoginActivity : AppCompatActivity() {
private lateinit var usernameEditText: EditText
private lateinit var passwordEditText: EditText
private lateinit var loginButton: Button
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_login)
usernameEditText = findViewById(R.id.username)
passwordEditText = findViewById(R.id.password)
loginButton = findViewById(R.id.login)
loginButton.setOnClickListener {
val username = usernameEditText.text.toString()
val password = passwordEditText.text.toString()
if (username == "admin" && password == "123456") {
val intent = Intent(this, WeatherActivity::class.java)
intent.putExtra("cityName", "北京")
startActivity(intent)
} else {
Toast.makeText(this, "用户名或密码错误", Toast.LENGTH_SHORT).show()
}
}
}
}
```
在 LoginActivity 中,我们通过 findViewById() 方法获取用户名、密码输入框和登录按钮的引用,并在登录按钮的点击事件中校验用户名和密码。如果校验成功,就跳转到 WeatherActivity,并将城市名 "北京" 作为参数传递过去。
这样,我们就实现了一个使用 Kotlin 编写的安卓登录查看天气预报的项目。
阅读全文