4

フラグメント間の通信に関する設計上の 1 つの問題は、

メソッドを呼び出したいクラスの単純な静的メソッドを使用するのではなく、リスナーを実装する少し複雑なコールバックパターンを使用するのはなぜですか (いくつかのメソッド/属性にシングルトンを使用するのと似ています)。パフォーマンスの問題はありますか、それとも Android/Java の OO プログラミング手法が「単に」悪いのでしょうか? したがって、双方向通信の簡単な方法は次のようになります。

MyActivity activity
    Fragment A
    Fragment B
static method canBeCalledFromAnywhere() {}
method activityMethod()
    call FragmentA.doSomething();
    call FragmentB.doSomething();



FragmentA
    onCreate()
        onMe = this;

static method doSomething()
    do something with static or use onMe for instance;

method oneMethodFragmentA()
    call MyActivity.canBeCalledFromAnywhere();



FragmentB
onCreate()
    onMe = this;

static method doSomething()
    do something with static or use onMe for instance;

method oneMethodFragmentB()
    call MyActivity.canBeCalledFromAnywhere();
4

4 に答える 4

3

文書化されたコールバックと推奨パターンを使用する理由は、Android フレームワークに反対するのではなく、それを使用することになるからです。静的メソッドを使用すると、これが完全に回避され、単純に見えますが、2 つのレベルで問題があります。

まず、オブジェクト指向設計の観点からは、非常に異なる独立した責任を持つクラスを密結合させているため、再利用やリファクタリングが難しくなっています。フラグメントやアクティビティ クラスに静的メソッドを導入すればするほど、この問題は悪化します。

第二に、両方のタイプのオブジェクトのライフサイクル外で作業しているため、多くの苦痛が生じます。まず、フラグメントは常に Android によって破棄され、再作成されます。たとえば、デバイスを回転させてディスプレイを縦向きから横向きに変更すると、すべてのフラグメントが破棄され、再度作成されます。これは、横向きでは、異なるフラグメントを使用したり、同じフラグメントで異なるコンテンツをレンダリングしたりする可能性があるためです。ユーザーが新しいアクティビティまたは別のアプリケーションに移動したときに、フラグメントとアクティビティを一時停止することもできます。

フラグメントとアクティビティに静的メソッドを作成すると、それらのメソッドをいつでも呼び出すことができます。そうすると、フラグメントまたはアクティビティが表示されているかどうかさえわかりません。それが現在のアクティビティの一部である場合、それがライフサイクルのどの段階にあるかわからないため、これに対処するために余分なコードをたくさん書くか、まったく書かないかのどちらかです (そして非常にバグのあるアプリケーション)。

コールバックを使用すると、マルチフラグメント アクティビティで代替レイアウトに代替フラグメントを使用できることをより簡単に確認でき、使用するフラグメントを決定した親アクティビティは、兄弟フラグメントからのデータが正しいフラグメントにルーティングされることを確認できます。 .

于 2013-01-14T15:46:00.277 に答える
3

フラグメント/アクティビティの単純なユースケース シナリオがある場合、ソリューションは実行可能です。Java の純粋主義者の言うことをいつも信じてはいけません。場合によっては、慣習を窓の外に放り出し、最も迅速かつ簡単に実行できることを実行することが最善の方法です。特に、それが小さなアプリであり、誰かがそれを行うためにお金を払っている場合はなおさらです。

于 2012-11-27T16:10:10.863 に答える
2

あると仮定するよりも、明確に指定された通信インターフェイスを使用する方がよいでしょう。したがってinterface、通信を定義すると、次のようになります。

  1. 親がこのインターフェースを実装しているかどうFragmentかを簡単に確認できるため、そのニーズを伝えることができます。ActivityFragment
  2. インターフェイスを定義するには、コーディングを開始するだけでなく、少し考え直す必要があります。これにより、ある種の標準化につながり、これは良いことです。
  3. インターフェイスを変更するとコンパイラが文句を言うので、インターフェイスの更新を維持するのは簡単ですが、実装はありません。

この Android SDK の記事もお読みください。

于 2012-09-04T11:50:54.900 に答える
1

最新の Android ツール (この記事の執筆時点では SDK r20、ツール r14) をダウンロードNew > Other > Android Application Projectし、Eclipse IDE を使用して新しい Android アプリケーション プロジェクト ( ) を作成します。「アクティビティの作成」ステップで、MasterDetailFlow基本プロジェクトを選択します。これにより、コード行を記述する前に、すぐに使用できる 2 つのフラグメント (ListFragment と詳細ビュー) を持つアプリケーションがインスタンス化されます。メインのアクティビティを介して、それらがどのように通信するかを調べることができます。

于 2012-09-04T15:04:34.230 に答える