2016-09-17 14 views
0

合計初心者はここにあります。断片化から断片化までのコミュニケーション - インターフェイスが本当に必要なのはなぜですか?

私が理解しているように、フラグメントは、他の状況で独立していて再利用可能な方法として、ホスティング活動を通じて互いに通信する必要があります。

これは、フラグメント内のインターフェイスを宣言し、それらをアクティビティに実装することで行う必要があります。 アクティビティがそのコミュニケーションの準備が整っていることを確認することができます(実際にコミュニケーションを処理する方法があります)。

私は、インターフェイス(とそのことについては、java /アンドロイドの他の多くのもの)の周りに私の頭をラップするのは苦労している、これはインターフェイスなしで行うことができますか?フラグメント内のホスティングアクティビティへの参照を取得し、そのアクティビティのメソッドを呼び出すことができますか?

(フラグメントクラス)

Activity activity = getActivity(); 

activity.doThatThingToOtherFrag(String myString); 

(アクティビティクラス)

Fragment otherFragment = getSupportFragmentManager().findFragmentById(R.id.myOtherFrag); 

public void doThatThingToOtherFrag(String string) { 
//do something to myOtherFrag 
} 

または私は届かない。この場合、インタフェースを実装について何か他のものはありますか?

* EDIT *

のは、私は別のアクティビティにそのフラグメントを再利用しましょう。その活動もdoThatThingToOtherFrag(文字列のmyString)メソッドを持っている限り、私はgetActivity(を通してそれへの参照を取得することができます)、まだ右、私のフラグメントからactivity.doThatThingToOtherFrag(文字列のmyString)を呼びますか?私はフラグメントコードで何かを変更する必要はありません - または私はここで何かを逃していますか?

私の質問は、次のようなものでなければなりません。/ /任意のホスト活動がdoThatThingToOtherFragメソッドを実装していることを確認するためのインターフェイスですか?あるいは、私はこのような状況でインタフェースについて知らない何か他のものがありますか?助けてくれてありがとう!

+0

うまくいけば、あなたは 'Activity'ではなく' MyActivity'であり、あなたのメソッドは '((MyActivity)activity).doThatThing'のようになります。つまり' doThatThing'は ' MyActivity'はあなたがMyActivityに密接に結合する必要があるでしょう。 – trooper

+0

...インターフェイスにプログラミングしない限り、毎回このキャストを変更する必要があります。アクティビティ(サブクラスではない)を扱う場合、インターフェイスには何のポイントもありませんが、 'doThatThing'はあなたが書いたメソッドであり、あなたの' Activity'ベースクラスにはまだ属していません。 – trooper

+0

私はActivityのサブクラス( 'FragmentActivity'など)を単に'(Activity) 'にキャストできると思っていました。doThatThingメソッドがある限り、フラグメントコードで何も変更する必要はありません。 –

答えて

2

"プログラムへのインターフェイス"オブジェクト指向プログラミングの共通点です。インターフェイスを使用せずに、アクティビティと直接通信できることは間違いありません。しかしながら、これは断片と活動との間の密接な結合を作り出す。

同じフラグメントを2つの異なるアクティビティで再利用する場合を考えてみましょう。インターフェイスを使用することでこれを柔軟に行うことができます。編集する

回答:

限り、その活動もdoThatThingToOtherFrag(文字列のmyString)メソッドを持っているとして、私は(getActivityを通してそれへの参照を取得)し、まだactivity.doThatThingToOtherFrag(文字列を呼び出すことができますmyString)を私のフラグメントからはずしましたか?

私はあなたがこのような何かを意味すると仮定します。

Activity activity = getActivity(); 
activity.doThatThingToOtherFrag(String myString); 

ActivitydoThatThingToOtherFrag()という名前のメソッドを持っていないので、これはコンパイルされません。ただし、実行すると、

FragmentCommunicationInterface activity = (FragmentCommunicationInterface) getActivity(); 
activity.doThatThingToOtherFrag(String myString); 

がコンパイルされます。これはもう一つの問題を抱えています:これが呼び出されたフラグメントがに追加された場合、であり、FragmentCommunicationInterfaceを実装していませんか?この場合、実行時エラーが発生します。

これに対する1つの可能な解決策は、フラグメントのコンストラクタの引数としてFragmentCommunicationInterfaceを取ることです。

public class MyFragment extends Fragment { 
    private FragmentCommunicationInterface communication; 

    public MyFragment(FragmentCommunicationInterface communication) { 
     this.communication = communication; 
    } 
} 

今、あなたがインターフェイスを使用する

MyFragment frag = new MyFragment(this); 

もう一つの利点を持つフラグメントがということです作成インターフェイスは任意のクラスによって実現でき、Activityを拡張するクラスだけではありません。これは、私が上記で示唆した以上の柔軟性を可能にします。それはあなたが望む任意の方法で活動や他の断片と通信するコードを整理することができます。

+0

インターフェイスは、doThatThingToOtherFragメソッドが実装されているアクティビティを保証するための方法としてのみ使用されていますか、それともまだわからない理由がありますか?可能であれば、私の編集をお読みください。ありがとう! –

+0

@ bernardo.gそれが理由の1つです。自分の編集に関する詳細については、私の編集を参照してください。 –

-1

インターフェイスは、2つのフラグメント、2つのアクティビティを通信する、または任意のクラスと通信するのに最適です。インターフェイスは、他の通信が同時に発生するために同時にトリガされるためです。

2

は実際にはではありませんが、望ましいことがあります。

一般に、インターフェイスはコードを呼び出すクラスに依存しません。どのFragmentクラスを呼び出すかはまったく気にしません。あなたが実際に気にしていることは、あなたが呼び出しているものであれば、doThisOrThat()の能力を持つ必要があるということです。

このデカップリングは、実際には多型性の使用を支援しています。コードで2つのFragmentクラスを使用することができます。ここでは1つを使用し、両方ともca n doThisOrThat()を使用します。その場合、インターフェイスを使用すると、同じメソッドを呼び出すために重複したコードを書く必要がなくなるため、コードを書き換えるのを除いて、よりクリーンなコードを書くのに役立ちます。

とにかく、実際にクラスをデカップルするには、EventBusについて知っておくとよいでしょう(どの実装でも問題ありません)。

+0

私は最近、EventBusについて聞いたことがあります。ありがとう! –

2

この方法で、インターフェイスを実装するすべてのアクティビティでフラグメントを動作させることができます。これはあなたの質問で指摘した独立性と再利用性を完全に向上させます。

アクティビティクラスのメソッドを「通信」する場合は、別のアクティビティクラスのメソッドであるため、他のアクティビティと動作(インターフェイス)することはできません。

+0

私の編集を見ていただけますか?それはここには適合しませんでした。 –

+1

フラグメントから呼び出すメソッドは、クラスまたは実行時にクラスによって実装されたインターフェイスに定義されている必要があります。覚えておいてください:実行時のJavaでは名前が存在しません。シンボルに変換されるため、厳密な定義が必須です。 – whitebrow

+1

つまり、同じ名前の2つのメソッドは、実行時に異なるシンボルを持ちます。 – whitebrow

0

上記のように実装していない理由の1つは、カップリングの緩みです。これは、うまく設計されたソフトウェアを作成するためのプログラム設計パターンです。私はStackOverflowで他の多くの議論が利用できるので、ここでそれについての新しい議論を作成するつもりはありません。

What is "loose coupling?" Please provide examples

これはプログラマとしてあなたに多くの時間を節約するように、この概念を理解するには時間がかかるしてください。

乾杯!

関連する問題