フラグメントはgetActivityを使用する理由は、()nullである---ソースコードの分析

問題:

空ポインタのリマインダーがあるだろうAS断片でgetActivityを呼び出す()メソッドを使用します

  1. 考えます

  • なぜこのような状況が存在し、現在の活動はおそらく存在し、getActivityは、()を取得することができますフラグメントである使用し、空であってはなりません

  •  

    その答えのほとんどはこれです:ほとんどの場合、その理由:あなたはgetActivity()を呼び出すときに、現在のフラグメントがonDetach()ホスト活性を有します。たとえば:あなたはフラグメントをポップした後、非同期タスクの断片はまだ実行、およびNULLポインタになりますgetActivity()メソッドと呼ばれる実行完了、後にされています。

    getActivity()の代わりに、現在のフラグメントonDetach()はどのように行います、その中に現在の断片で呼び出すの?

  • ソース

  1. ライフサイクルのフラグメント
    公式フラグメントのライフ・サイクル・チャート
  2. フラグメントは、いくつかの余分なライフサイクルコールバック比活性よりも多くを見ることができます:

    ONATTACH:ONATTACH()調査と活動曲に関連付けられた断片後。初期化断片パラメータはgetArguments()断片をアクティビティーに装着されたとき、しかし、あなたがsetArgumentsを呼び出すことはできません()から得ることができることに留意すべきです。だから、冒頭に加えて、他の回は、初期化パラメータにコンテンツを追加することはできません。

    onCreate:フラグメントが最初に作成されたときに呼び出されます。それはのOnCreate()関数の活動のように見えますが、これだけの断片を作成するために使用されているが。私たちのフラグメント活動の一部が作成されると、この時点での活動はまだ、作成されていません。あなたは、リソースの活動の一部を使用したいのであれば、あなたが少なくなります。たとえば、次のように活動して他のFramentコントロールのインスタンスを取得します。あなたが関連する活動がonActivityCreatedに取得する必要があるリソースを取得したい場合は、次のように:)(コードです。

    onCreateView:その構成ユーザインターフェースビュー(レイアウト)と呼ばれるこの断片。

    onActivityCreated:OnCreate関数(内活性)の終了後、このメソッドを呼び出します。そこでここでは、とき、活動は作成されています!活動は、この関数内のすべてのリソースを使用することができます。ここで、次のコード場合は、取得しbtn_Tryの値は、もはや空になりません!

    ONSTART:ときのOnStart()は、断片は、ユーザに表示されます。しかし、ユーザーは、まだフラグメントとの対話を開始していません。ライフサイクルでは、結合されたののOnStartフラグメント()活動のOnStartメソッド()の手順で手順を参照してくださいすることができます。その意味は同じです。達成するためのフラグメントを使用しているときに、コードを処理するためのOnStart()で書く前に活動を、あなたはまだ()を処理するのOnStartを配置することができます。

    onResume:ユーザーと通話に見えるこのフラグメントが実行されています。コールバックのフラグメントは、ユーザと対話する前に、これが最後です。OnResume断片のOnResumeとアクティビティが互いに結合されたライフサイクルの比較から、あなたが見ることができ、意味は同じです。それは、それを含むActivity.onResumeの活性に依存します。OnResume()最後に、我々は正式にユーザと対話することができます。

    onPause:このコールバックとOnPauseの活動は、()OnPause()感覚の活動のように結合しました。

    onStop:同じ意味、と結合したOnStopのこのコールバックとアクティビティ()。フラグメントは、その後OnResume()を呼び出し、のOnStart()コールバックに直接返すことができます停止。

    onDestroyView約フラグメントが終了または保存する場合は、撤退の方向の次のプルバックはonDestoryViewになります()。onCreateViewビューでは、このフラグメントの分離を使用して作成されます。次回、このフラグメントを表示するには、新しいビューを作成します。コールonStop前と後のこのonDestroy。同じコールonCreateViewビューは何の関係も持っていない場合、このメソッドはnull以外を返します。これは、潜在的な状態で保存され、このビューは、その親を回復呼び出す前図です。

    onDestroy:このフラグメントはもはや使用されたときに呼び出されません。それも、onDestroy()相、まだ見つかっ活動した後、からそれは切り離していないために留意すべきです。

    onDetach:最後のコールバックの断片ライフサイクル)が(onDetachです。それを呼び出した後、フラグメントは、もはや活動にバインドされていないこと、それはもはやすべてのリソースが解放され、ビュー階層を持っていません。

  3. 以下のソースベースのAPI 26
    1. getActivityはおそらくヌルに、ソースコードに従って、あなたはgetActivityは()mHostがnullの場合、それはヌルを返し、mHostメンバ変数によって活性を得るためにである見ることができます。
        final public Activity getActivity() { return mHost == null ? null : mHost.getActivity(); }
    1. mHostは、それがメンバ変数である何それ?ときに割り当て?
      • mHost:抽象クラスandroid.app.FragmentHostCallback、連続:android.app.FragmentContainer
      • 次のようにmHost初期化時間アクティビティ入来ソースコードで、渡されました:
    2. )(getActivityを呼び出すときに、断片はActivityからonDetachを()があります。これは、NULLポインタが発生します。
    3. アプリが再びアプリに長い時間のためにバックグラウンドで実行されている場合、それはそのように、再構築することができますが、リサイクルされているの復旧活動の断片と、作成したフラグメントバンドル内部に保存されますないクラッシュ、活動の回収システムを表示される場合があります活性の損失のためのフラグメントの原因。

            私は解決策は、メソッドをonSaveInstanceState書き換える同時にFragmetnアクティビティ破壊が内部活動で破壊された時間を結合し、そしてsuper.onSaveInstanceState(outState)をコメントすることだと思います。この問題を解決するために、状態の活性フラグメントが保存されていませんしましょう。..

ソリューション

  • ONATTACH BaseFragment get()メソッド活動中とメンバ変数に割り当てられ、その後、メンバ変数がそれを使用してgetActivity()を使用する必要があります。

 

 

レコード:フラグメントの作成

FragmentManager manager = getSupportFragmentManager(); FragmentTransaction transaction = manager.beginTransaction(); Fragment1 fragment1 = new Fragment1(); transaction.add(R.id.fragment_container, fragment1); transaction.commit(); 

動的に追加するフラグメントは、4つのステップに分かれています。
getSupportFragmentManager経由V4パケットに、1. FragmentManagerを取得し、システムがgetFragmentManagerフラグメントが得られネイティブです。
2. openメソッドのbeginTransaction呼び出すことにより、トランザクションをオンにします。
断片3は、典型的には、受信インスタンスIDと断片容器ニーズ、追加または交換方法を使用して実装、容器に添加しました。
4.提出方法をコミット呼び出して、トランザクションをコミットします。
操作の関連するフラグメントのこの部分は非常にそれは問題ではない理解することはできません、我々はマネジメントの特定の断片について話します、次のセクション!

空ポインタのリマインダーがあるだろうAS断片でgetActivityを呼び出す()メソッドを使用します

  1. 考えます

  • なぜこのような状況が存在し、現在の活動はおそらく存在し、getActivityは、()を取得することができますフラグメントである使用し、空であってはなりません

  •  

    その答えのほとんどはこれです:ほとんどの場合、その理由:あなたはgetActivity()を呼び出すときに、現在のフラグメントがonDetach()ホスト活性を有します。たとえば:あなたはフラグメントをポップした後、非同期タスクの断片はまだ実行、およびNULLポインタになりますgetActivity()メソッドと呼ばれる実行完了、後にされています。

    getActivity()の代わりに、現在のフラグメントonDetach()はどのように行います、その中に現在の断片で呼び出すの?

  • ソース

  1. ライフサイクルのフラグメント
    公式フラグメントのライフ・サイクル・チャート
  2. フラグメントは、いくつかの余分なライフサイクルコールバック比活性よりも多くを見ることができます:

    ONATTACH:ONATTACH()調査と活動曲に関連付けられた断片後。初期化断片パラメータはgetArguments()断片をアクティビティーに装着されたとき、しかし、あなたがsetArgumentsを呼び出すことはできません()から得ることができることに留意すべきです。だから、冒頭に加えて、他の回は、初期化パラメータにコンテンツを追加することはできません。

    onCreate:フラグメントが最初に作成されたときに呼び出されます。それはのOnCreate()関数の活動のように見えますが、これだけの断片を作成するために使用されているが。私たちのフラグメント活動の一部が作成されると、この時点での活動はまだ、作成されていません。あなたは、リソースの活動の一部を使用したいのであれば、あなたが少なくなります。たとえば、次のように活動して他のFramentコントロールのインスタンスを取得します。あなたが関連する活動がonActivityCreatedに取得する必要があるリソースを取得したい場合は、次のように:)(コードです。

    onCreateView:その構成ユーザインターフェースビュー(レイアウト)と呼ばれるこの断片。

    onActivityCreated:在Activity的OnCreate()结束后,会调用此方法。所以到这里的时候,Activity已经创建完成!在这个函数中才可以使用Activity的所有资源。如果把下面的代码放在这里,获取到的btn_Try的值将不会再是空的!

    onStart:当到OnStart()时,Fragment对用户就是可见的了。但用户还未开始与Fragment交互。在生命周期中也可以看到Fragment的OnStart()过程与Activity的OnStart()过程是绑定的。意义即是一样的。以前你写在Activity的OnStart()中来处理的代码,用Fragment来实现时,依然可以放在OnStart()中来处理。

    onResume:当这个fragment对用户可见并且正在运行时调用。这是Fragment与用户交互之前的最后一个回调。从生命周期对比中,可以看到,Fragment的OnResume与Activity的OnResume是相互绑定的,意义是一样的。它依赖于包含它的activity的Activity.onResume。当OnResume()结束后,就可以正式与用户交互了。

    onPause:此回调与Activity的OnPause()相绑定,与Activity的OnPause()意义一样。

    onStop:这个回调与Activity的OnStop()相绑定,意义一样。已停止的Fragment可以直接返回到OnStart()回调,然后调用OnResume()。

    onDestroyView:如果Fragment即将被结束或保存,那么撤销方向上的下一个回调将是onDestoryView()。会将在onCreateView创建的视图与这个fragment分离。下次这个fragment若要显示,那么将会创建新视图。这会在onStop之后和onDestroy之前调用。这个方法的调用同onCreateView是否返回非null视图无关。它会潜在的在这个视图状态被保存之后以及它被它的父视图回收之前调用。

    onDestroy:当这个fragment不再使用时调用。需要注意的是,它即使经过了onDestroy()阶段,但仍然能从Activity中找到,因为它还没有Detach。

    onDetach:Fragment生命周期中最后一个回调是onDetach()。调用它以后,Fragment就不再与Activity相绑定,它也不再拥有视图层次结构,它的所有资源都将被释放。

  3. 以下源码基于 API 26
    1. getActivity 可能为 Null, 跟进源码,可以看到 getActivity() 是通过 mHost 成员变量获取 activity ,假如 mHost 为 null , 就返回一个 Null 。
        final public Activity getActivity() { return mHost == null ? null : mHost.getActivity(); }
    1. 那成员变量 mHost 是什么呢?什么时候赋值的?
      • mHost: 抽象类 android.app.FragmentHostCallback,继承之: android.app.FragmentContainer
      • mHost 传入,是在 Activity 初始化的时候传入的,源码如下:
    2. 当调用 getActivity() 的时候,Fragment 已经 onDetach() 从 Activity 中。所以会造成空指针。
    3. アプリが再びアプリに長い時間のためにバックグラウンドで実行されている場合、それはそのように、再構築することができますが、リサイクルされているの復旧活動の断片と、作成したフラグメントバンドル内部に保存されますないクラッシュ、活動の回収システムを表示される場合があります活性の損失のためのフラグメントの原因。

            私は解決策は、メソッドをonSaveInstanceState書き換える同時にFragmetnアクティビティ破壊が内部活動で破壊された時間を結合し、そしてsuper.onSaveInstanceState(outState)をコメントすることだと思います。この問題を解決するために、状態の活性フラグメントが保存されていませんしましょう。..

ソリューション

  • ONATTACH BaseFragment get()メソッド活動中とメンバ変数に割り当てられ、その後、メンバ変数がそれを使用してgetActivity()を使用する必要があります。

 

 

レコード:フラグメントの作成

FragmentManager manager = getSupportFragmentManager(); FragmentTransaction transaction = manager.beginTransaction(); Fragment1 fragment1 = new Fragment1(); transaction.add(R.id.fragment_container, fragment1); transaction.commit(); 

動的に追加するフラグメントは、4つのステップに分かれています。
getSupportFragmentManager経由V4パケットに、1. FragmentManagerを取得し、システムがgetFragmentManagerフラグメントが得られネイティブです。
2. openメソッドのbeginTransaction呼び出すことにより、トランザクションをオンにします。
断片3は、典型的には、受信インスタンスIDと断片容器ニーズ、追加または交換方法を使用して実装、容器に添加しました。
4.提出方法をコミット呼び出して、トランザクションをコミットします。
操作の関連するフラグメントのこの部分は非常にそれは問題ではない理解することはできません、我々はマネジメントの特定の断片について話します、次のセクション!

おすすめ

転載: www.cnblogs.com/tingtasia/p/11545014.html