📜  如何使用 Starter Pattern 在 Android 中编写好的代码?

📅  最后修改于: 2022-05-13 01:58:44.621000             🧑  作者: Mango

如何使用 Starter Pattern 在 Android 中编写好的代码?

在 Android 中编写代码并不难。您所要做的就是阅读一些文章或教程并为 Android 应用程序创建一些代码。但是,您为同一个应用程序生成的代码质量使您有别于其他 Android 开发人员。体面的 Android 代码不仅可以让您与其他开发人员区分开来,还可以帮助您防止您或 Android 在构建时可能遗漏的一些运行时问题。因此,在本文中,我们将学习如何使用 Starter Pattern 来构建良好的 Android 代码。

究竟是什么问题?

在看答案之前,我们必须先了解问题所在。让我们看一个例子来更好地理解这种情况。我们的示例中有一个PostDetailActivity ,其中包含帖子的详细信息,例如标题和图片 URL。另外,绕过标题和图片URL,这个PostDetailActivity是从两个Activity开始的,分别是MainActivityPostListActivity。我们还有一个常量类,用于声明常量值。结果,常量类的代码如下:

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 中启动。这将减少运行时错误,并有助于检测在处理集体项目时可能发生的任何错误。