Android 開発: kotlin は、Activity にジャンプする Intent をカプセル化し、ActivityNotFoundException の問題を報告します

ヘッドアップ画像

Android 開発: kotlin は、Activity にジャンプする Intent をカプセル化し、ActivityNotFoundException の問題を報告します

序文

最近、プロジェクト開発でkotlinを使っていて、Activityページにジャンプするコードをかなり書いていたのですが、Javaとは少し矛盾していることが分かりましたが、Javaのようにパッケージ化して簡単に呼び出すことはできますか? この点について、chatGPT とチャットしたところ、彼から回答があり、CV Dafa をこのように使用したところ、信じられない問題が発生しました。それを記録しなさい。お急ぎの場合は、目次をクリックして解決する解決策を表示してください.原因の段落問題の段落はすべて楽しみのために水を吹いています.

起因

  • 原因段落

ある雨の日の午後、バージョンのイテレーションが終わった後、当面は開発タスクがありません。前の繰り返しのコードを見てください。最適化できるポイントがないか調べます。そのとき、Jump アクティビティが以前にカプセル化されていなかったことを思い出しました。これはどのように機能しますか。それからchatGPTを開いて、彼に尋ねました:

ここに画像の説明を挿入
いいやつ、読まないとわからない、見たときはショックだった、私たちの履歴書大法を使わないの?1回の施術後。プロジェクトに統合され、少し最適化されています。


/**
 * 带参数跳转的Activity  如:startActivity<TestActivity>()
 *
 * @param [T]跳转的Activity
 * @param [data]携带的数据  可为空
 */
inline fun <reified T : Activity> Context.startActivity(data: Bundle? = null) {
    
    
    val intent = Intent(this, T::class.java)
    if (data != null) {
    
    
        intent.putExtras(data)
    }
    this.startActivity(intent)

}

よし、履歴書大法が完成したので、正式に使い始めることができる。

質問

  • 質問段落

私が言わなければならないのは、これは非常に簡潔で一見明確に見えるということです. 次の例はフラグメントページで使用されているため、requireContext()プレフィックスがアクティビティにある場合は、直接使用できますstartActivity<対象アクティビティ>()メソッドは、ネーミングが Android に付属するものと同じであるため、区別する必要があることに注意してください。


    override fun onClick(view: View?) {
    
    
        view ?: return
        when (view.id) {
    
    
            R.id.lin_my_about -> {
    
    
            
                //仅打开
                requireContext().startActivity<TestActivity>()

                //传值
                val bundle = Bundle()
                bundle.putString("test","test")
                requireContext().startActivity<TestActivity>(bundle)
            }
        }
    }

喜んでプロジェクトをビルドして仮想マシンにパッケージ化していたのと同じように、このままでは事故が起きてしまいます。慎重にジャンプボタンを押すと…>

ここに画像の説明を挿入
アプリが予期せずクラッシュしました、状況は何ですか? これは単なるジャンプ コードで、数行しかなく、何も書かれていません。これはとても残念なことですか...私の心は転がり続けますが、クラッシュするため、例外がスローされるため、ログに移動して確認しましょう:

ここに画像の説明を挿入

wtf? アクティビティは異常ではありませんか? AndroidManifest.xml に登録されていませんか? そんな低レベルのミス?まさかまさか、本当に登録されてないですよね?

ここに画像の説明を挿入
コードを確認すると、AndroidManifest.xml ファイルに何かが含まれていることがわかります。何が問題なのですか? システムが誤動作している可能性はありますか?よく考えてみてください。システムの問題ではなく、コードの問題であるはずですが、ほんの数行のコードで機能しないのはなぜでしょうか? この目的のために、最も基本的なシステムを使用して、方法を試してみます。

    startActivity(Intent(requireContext(),TestActivity::class.java))

システムメソッドを使用すると、ページは正常にジャンプします。これは 100% 確実です。つまり、私たちが書いたコードに問題があるということです。エラー報告の問題を詳しく見てみましょう。

android.content.ActivityNotFoundException: 明示的なアクティビティ クラスが見つかりません{leo.study.kotlin_mvp_demo/int}; AndroidManifest.xml でこのアクティビティを宣言しましたか?

よく見てみろ、これ{leo.study.kotlin_mvp_demo/int}間違っているようです。アクティビティ パスではありません。

ここに画像の説明を挿入
エラー パスの後には、整数整数、実に法外です。その後、chatGPT に質問を続けますが、提供された回答は私たちの期待に沿うものではありません。

ここに画像の説明を挿入ここに画像の説明を挿入
でも、もうどうでもいいことです。実際、chatGPT は、私たちがカプセル化したコードに問題があるはずであることも明らかにしました.私たちが書いたカプセル化されたコードを詳しく見てみましょう.

ここに画像の説明を挿入
一見、問題ありません。修正して追加しただけですバンドル()値を渡しますアクティビティに変更コンテクストそれ以外は基本的に変わっていません。何が問題ですか?
「すべてには理由がある」、「どこにでも悪があり、幽霊がいるに違いない」、「革のズボンと綿のズボンには理由があるに違いない」という原則に従い、エラーレポートとパッケージを詳しく見てみましょう。コード、そして24Kゴールドのシングルドッグアイを使用して、彼は本当に少しの手がかりを発見したようです. 審査員は気づいた?

ここに画像の説明を挿入

初めTはグレー表示され、呼び出されていないことを意味し、2 番目のTはイタリック体です。この二つの商品は同じものではないようです。この点を確認するために、このイタリック体を「command + クリック」します。Tここで、新大陸が発見されました。

ここに画像の説明を挿入

元の斜体Tこのことを指しているので、エラーを報告するのも不思議ではありません~~~~~~ 理由は私のせいですアンドロイドが死ぬ自動インポート パッケージを開き、chatGPT のコードをコピーして、このクラスにパッケージを自動的にインポートします。T

解決

  • 段落を解決する

方法 1:

私たちは、私たちが書いたことを知っていますTジャンプする対象を参照するジェネリック型ですアクティビティ実際、この問題を解決するのは非常に簡単です。ジェネリックを参照するこれを配置する必要があるだけですT別の文字に変更するだけです。


/**
 * 带参数跳转的Activity  如:startAct<TestActivity>()
 *
 * @param [A]            跳转的 Activity
 * @param [data]         携带的数据  可为空
 * @param [requestCode]  请求 code 当不为0时,startActivityForResult
 */
inline fun <reified A : Activity> Context.startActivity(
    data: Bundle? = null,
    requestCode: Int? = 0
) {
    
    
    val intent = Intent(this, A::class.java)
    if (data != null) {
    
    
        intent.putExtras(data)
    }
    if (requestCode != 0) {
    
    
        requestCode?.let {
    
     (this as Activity).startActivityForResult(intent, it) }
    } else {
    
    
        this.startActivity(intent)
    }

}

現在、このジェネリックが何を指しているのかを調べています同じ赤になりました。というわけで、これで冒頭の問題は解決です。結局のところ、「もう 1 日経ちましたが、もうかなりうまくいっています」と、すぐに自分を褒めてください。

ここに画像の説明を挿入

方法 2:

この問題は主に間違ったパッケージが原因であることがわかっています。次に、パッケージをインポートする行を削除することもできます。

ここに画像の説明を挿入
削除後のコード:


/**
 * 带参数跳转的Activity  如:startAct<TestActivity>()
 *
 * @param [T]            跳转的 Activity
 * @param [data]         携带的数据  可为空
 * @param [requestCode]  请求 code 当不为0时,startActivityForResult
 */
inline fun <reified T : Activity> Context.startActivity(
    data: Bundle? = null,
    requestCode: Int? = 0
) {
    
    
    val intent = Intent(this, T::class.java)
    if (data != null) {
    
    
        intent.putExtras(data)
    }
    if (requestCode != 0) {
    
    
        requestCode?.let {
    
     (this as Activity).startActivityForResult(intent, it) }
    } else {
    
    
        this.startActivity(intent)
    }

}

要約する

以上が本記事の全文です。全文を通して、この記事は少しの乾物で段落を解決することです。他のすべては水を吹いています。他の学生はそのような問題を抱えていないかもしれません。しかし、「穴を食べて知恵を得る」ということわざにあるように、「家に悪があるときは、幽霊がいるに違いない」という同じ文章です.原因と問題の書き込みは、主に記録することです.問題を見つけ、問題を解決したと考えるプロセス。今見ると、2、3段落でしか書かれていないように見えますが、当時は心の中で何度「wtf」と叫んだこともありませんでした。特にシステムのstartActivity()メソッドが再び正常にジャンプすると、私は直接人生を疑います。

ねずみの糞の鍋は、お粥の鍋を台無しにします。この小さな大文字のジェネリックのようにT、 本当に迷惑です。

間違いや間違いがありましたらご指摘ください
ヘッドアップ画像

おすすめ

転載: blog.csdn.net/weixin_43683367/article/details/129819022