如何使用 Starter Pattern 在 Android 中编写好的代码?
在 Android 中编写代码并不难。您所要做的就是阅读一些文章或教程并为 Android 应用程序创建一些代码。但是,您为同一个应用程序生成的代码质量使您有别于其他 Android 开发人员。体面的 Android 代码不仅可以让您与其他开发人员区分开来,还可以帮助您防止您或 Android 在构建时可能遗漏的一些运行时问题。因此,在本文中,我们将学习如何使用 Starter Pattern 来构建良好的 Android 代码。
究竟是什么问题?
在看答案之前,我们必须先了解问题所在。让我们看一个例子来更好地理解这种情况。我们的示例中有一个PostDetailActivity ,其中包含帖子的详细信息,例如标题和图片 URL。另外,绕过标题和图片URL,这个PostDetailActivity是从两个Activity开始的,分别是MainActivity和PostListActivity。我们还有一个常量类,用于声明常量值。结果,常量类的代码如下:
Kotlin
object GeeksforGeeksConstants {
internal const val POST_TITLE = "android_post"
internal const val POST_URL = "gfg_url"
}
Kotlin
class AndroidArticle : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.article_title)
val articleTitle = intent.getStringExtra(Constants.POST_TITLE)
val articleImage = intent.getStringExtra(Constants.POST_IMAGE_URL)
}
}
Kotlin
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val intent = Intent(this@MainActivity, ArticleActivity::class.java)
intent.putExtra(Constants.ARTICLE_TITLE, "android")
intent.putExtra(Constants.POST_IMAGE_URL, "gfg")
startActivity(intent)
}
}
Kotlin
object GfGConstants {
internal const val POST_TITLE = "android_post"
internal const val POST_IMAGE_URL = "image_url"
internal const val POST_THUMBNAIL = "thumbnail"
}
Kotlin
class ArticleDetails : AppCompatActivity() {
companion object {
// all the constants values
internal const val ARTICLE_TITLE = "ARTICLE_TITLE"
internal const val POST_IMAGE_URL = "post_image_url"
// starter function
fun getStartIntent(context: Context, POST_TITLE: String, postImageUrl: String): Intent {
val intent = Intent(context, ArticleDetails::class.java)
intent.putExtra(ARTICLE_TITLE, POST_TITLE)
intent.putExtra(POST_IMAGE_URL, postImageUrl)
return intent
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_post_detail)
val POST_TITLE = intent.getStringExtra(ARTICLE_TITLE)
val postImageUrl = intent.getStringExtra(POST_IMAGE_URL)
}
}
Kotlin
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val intent = PostDetailActivity.getStartIntent(this@PostActivity, "android", "geeksforgeeks")
startActivity(intent)
}
}
Kotlin
class PostDetailActivity : AppCompatActivity() {
partner object {
// constants
internal const val POST_TITLE = "post_title"
internal const val POST_URL = "POST_URL"
internal const val POST_THUMBNAILS = "post_image_thumbnail_url"
// starter function
fun getStartIntent(context: Context, gfgPostTitle: String, postImageUrl: String, postImageThumbailUrl: String):Intent {
val intent = Intent(context, PostDetailActivity::class.java)
intent.putExtra(POST_TITLE, gfgPostTitle)
intent.putExtra(POST_URL, postImageUrl)
intent.putExtra(POST_THUMBNAILS, postImageThumbailUrl)
return intent
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_post_detail)
val gfgPostTitle = intent.getStringExtra(POST_TITLE)
val postImageUrl = intent.getStringExtra(POST_URL)
val postImageThumbnailUrl = intent.getStringExtra(POST_THUMBNAILS)
}
}
Kotlin
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val gfgIntent = PostDetailActivity.getStartIntent(this@MainActivity, "android", "postImageUrl", "imageThumbnail")
startActivity(gfgIntent)
}
}
PostDetailsActivity的代码如下:
科特林
class AndroidArticle : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.article_title)
val articleTitle = intent.getStringExtra(Constants.POST_TITLE)
val articleImage = intent.getStringExtra(Constants.POST_IMAGE_URL)
}
}
MainActivity的代码如下:
科特林
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val intent = Intent(this@MainActivity, ArticleActivity::class.java)
intent.putExtra(Constants.ARTICLE_TITLE, "android")
intent.putExtra(Constants.POST_IMAGE_URL, "gfg")
startActivity(intent)
}
}
那么,此时代码是否正常工作?它应该运行良好。然而,当在协作环境中工作时,多个开发人员在同一个项目上工作时,就会出现问题。例如,假设您需要在某个时候向应用程序添加缩略图。因此,在 Constant 类中,您只需添加一个 const 值:
科特林
object GfGConstants {
internal const val POST_TITLE = "android_post"
internal const val POST_IMAGE_URL = "image_url"
internal const val POST_THUMBNAIL = "thumbnail"
}
因为你不是唯一一个在这个项目上工作的人。其他一些开发人员可能在MainActivity中包含缩略图链接,但在PostListActivity中没有。这里永远不会出现编译时错误。但是,您会在使用该程序时发现一些错误,尤其是PostListActivity ,这些错误应仅在开发阶段解决。此外,如果您正在处理一个大型项目,这些常量可能会更大,您需要将每个常量都包含在调用PostDetailActivity的活动中。
val articleImageThumbnails = intent.getStringExtra(Constants.POST_TITLE)
解决方案
因此,我们已经讨论了任何开发人员都可能出现的问题。如果您没有编写正确的代码(语法方面),您可能会在运行时发现错误。
Starter Pattern 中的代码可以用来解决上面提到的问题。
科特林
class ArticleDetails : AppCompatActivity() {
companion object {
// all the constants values
internal const val ARTICLE_TITLE = "ARTICLE_TITLE"
internal const val POST_IMAGE_URL = "post_image_url"
// starter function
fun getStartIntent(context: Context, POST_TITLE: String, postImageUrl: String): Intent {
val intent = Intent(context, ArticleDetails::class.java)
intent.putExtra(ARTICLE_TITLE, POST_TITLE)
intent.putExtra(POST_IMAGE_URL, postImageUrl)
return intent
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_post_detail)
val POST_TITLE = intent.getStringExtra(ARTICLE_TITLE)
val postImageUrl = intent.getStringExtra(POST_IMAGE_URL)
}
}
我们在 Starter Pattern 中使用了几个静态方法,首先,将在我们的活动中使用的值。我们可以在同一个类中定义一个类所需的值,而不是为常量值创建一个单独的常量类。因此,您只能在需要时从该类访问这些变量。我们在 getStartIntent()函数中添加 extras 值,并在上面的代码 () 中的 onCreate()函数中获取值。
使用下面的代码,您现在可以从 MainActivity 调用 PostDetailActivity:
科特林
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val intent = PostDetailActivity.getStartIntent(this@PostActivity, "android", "geeksforgeeks")
startActivity(intent)
}
}
科特林
class PostDetailActivity : AppCompatActivity() {
partner object {
// constants
internal const val POST_TITLE = "post_title"
internal const val POST_URL = "POST_URL"
internal const val POST_THUMBNAILS = "post_image_thumbnail_url"
// starter function
fun getStartIntent(context: Context, gfgPostTitle: String, postImageUrl: String, postImageThumbailUrl: String):Intent {
val intent = Intent(context, PostDetailActivity::class.java)
intent.putExtra(POST_TITLE, gfgPostTitle)
intent.putExtra(POST_URL, postImageUrl)
intent.putExtra(POST_THUMBNAILS, postImageThumbailUrl)
return intent
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_post_detail)
val gfgPostTitle = intent.getStringExtra(POST_TITLE)
val postImageUrl = intent.getStringExtra(POST_URL)
val postImageThumbnailUrl = intent.getStringExtra(POST_THUMBNAILS)
}
}
我们将在此处再添加一个字段,即缩略图 URL。
如果您忘记在这种情况下使用 PostDetailActivity 提供任何活动的缩略图 URL,您将收到编译时错误。然后,您可以添加或传递所需的变量。 MainActivity 示例如下:
科特林
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val gfgIntent = PostDetailActivity.getStartIntent(this@MainActivity, "android", "postImageUrl", "imageThumbnail")
startActivity(gfgIntent)
}
}
结论
如果您想编写出色的 Android 代码并脱颖而出,请开始使用 Starter Pattern。 Starter Pattern 用于构造代码,使变量都在同一个 Activity 中启动。这将减少运行时错误,并有助于检测在处理集体项目时可能发生的任何错误。