65

この質問は主に、私のアプリを処理する最善の方法について意見を求めるためのものです。1 つのアクティビティで 3 つのフラグメントを処理しています。フラグメント A には写真という 1 つのクリック可能な要素があり、フラグメント B にはボタンという 4 つのクリック可能な要素があります。もう一方のフラグメントは、写真がクリックされたときに詳細を表示するだけです。私はActionBarSherlockを使用しています。

スクリーンショット

進むボタンと戻るボタンは、写真をそれぞれ次または前のポーズに変更する必要があります。写真とボタンを同じフラグメントに保持することもできますが、タブレットで再配置したい場合に備えて、それらを別々に保持したいと考えました.

アドバイスが必要です。フラグメント A と B を結合する必要がありますか? そうでない場合は、3 つのクリック可能なアイテムのインターフェイスを実装する方法を理解する必要があります。

Roboguice の使用を検討しましたが、既に SherlockFragmentActivity を使用して拡張しているため、それはできません。Otto についての言及は見ましたが、プロジェクトに含める方法についての適切なチュートリアルは見当たりませんでした。ベスト デザイン プラクティスはどうあるべきだと思いますか?

また、フラグメントとアクティビティ間の通信方法を理解するための助けも必要です。ポーズ ID など、一部のデータをアプリケーションで「グローバル」に保持したいと考えています。ストックアンドロイド開発者の情報以外に、私が見ることができるサンプルコードはありますか? それだけでは役に立ちません。

ところで、私はすでに各ポーズに関するすべての情報を SQLite データベースに保存しています。それは簡単な部分です。

4

11 に答える 11

87

アクティビティとフラグメントの間で通信する最も簡単な方法は、インターフェイスを使用することです。アイデアは、基本的に、特定のフラグメント A 内にインターフェイスを定義し、アクティビティにそのインターフェイスを実装させることです。

そのインターフェースを実装したら、それがオーバーライドするメソッドで必要なことを何でも行うことができます。

インターフェイスのもう 1 つの重要な部分は、フラグメントから抽象メソッドを呼び出し、それをアクティビティにキャストすることを忘れないことです。正しく行われなかった場合、ClassCastException をキャッチする必要があります。

この種のことを正確に行う方法については、 Simple Developer Blogに優れたチュートリアルがあります。

これがお役に立てば幸いです。

于 2014-08-19T20:38:10.500 に答える
24

フラグメント間の通信に推奨される方法は、メインのアクティビティによって管理されるコールバック\リスナーを使用することです。

このページのコードはかなり明確だと思います: http://developer.android.com/training/basics/fragments/communicating.html

事実上の参照アプリとして設計されている IO 2012 スケジュール アプリを参照することもできます。ここで見つけることができます: http://code.google.com/p/iosched/

また、ここに良い情報を含む SO の質問があります: フラグメント間でデータを渡す方法

于 2013-01-09T23:13:49.483 に答える
20

Callback インターフェイスによって実装されます。

まず、インターフェースを作成する必要があります。

public interface UpdateFrag {
     void updatefrag();
}

アクティビティで次のコードを実行します。

UpdateFrag updatfrag ;

public void updateApi(UpdateFrag listener) {
        updatfrag = listener;
}

アクティビティでコールバックを起動する必要があるイベントから:

updatfrag.updatefrag();

Fragment でCreateView、次のコードを実行してインターフェイスを実装します。

 ((Home)getActivity()).updateApi(new UpdateFrag() {
        @Override
        public void updatefrag() {
              .....your stuff......
        }
 });
于 2016-09-03T17:48:14.173 に答える
2

アクティビティ、フラグメント、サービスなどの間で通信する方法はいくつかあります。明らかな方法は、インターフェイスを使用して通信することです。しかし、それはコミュニケーションの生産的な方法ではありません。リスナーなどを実装する必要があります。

私の提案は、イベント バスを使用することです。イベント バスはパブリッシュ/サブスクライブ パターンの実装です。

アクティビティでイベントをサブスクライブしてから、そのイベントをフラグメントなどに投稿できます。

このブログ投稿では、このパターンの詳細と、使用法を示すサンプル プロジェクトを見つけることができます。

于 2016-04-08T13:45:57.177 に答える
1

何をしたいのかよくわかりませんが、フラグメント間で通信するための推奨される方法は、フラグメント間で直接ではなく、アクティビティでコールバックを使用することです。こちらをご覧くださいhttp://developer.android.com/training/basics/fragments/communicating.html

于 2013-01-09T23:08:20.323 に答える
0

フラグメントで関数宣言を使用してパブリック インターフェイスを宣言し、アクティビティでインターフェイスを実装できます。次に、フラグメントから関数を呼び出すことができます。

于 2013-06-07T13:52:55.657 に答える
0

インテントを使用して、アクションをメイン アクティビティに戻します。主なアクティビティは、onNewIntent(Intent インテント) をオーバーライドしてこれらをリッスンすることです。メイン アクティビティは、たとえば、これらのアクションを対応するフラグメントに変換します。

したがって、次のようなことができます。

public class MainActivity extends Activity  {

    public static final String INTENT_ACTION_SHOW_FOO = "show_foo";
    public static final String INTENT_ACTION_SHOW_BAR = "show_bar";


   @Override
   protected void onNewIntent(Intent intent) {
        routeIntent(intent);
   }

  private void routeIntent(Intent intent) {
       String action = intent.getAction();
       if (action != null) {               
            switch (action) {
            case INTENT_ACTION_SHOW_FOO:
                // for example show the corresponding fragment
                loadFragment(FooFragment);
                break;
            case INTENT_ACTION_SHOW_BAR:
                loadFragment(BarFragment);
                break;               
        }
    }
}

次に、フラグメント内で foo フラグメントを表示します。

Intent intent = new Intent(context, MainActivity.class);
intent.setAction(INTENT_ACTION_SHOW_FOO);
// Prevent activity to be re-instantiated if it is already running.
// Instead, the onNewEvent() is triggered
intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP);
getContext().startActivity(intent);
于 2015-12-16T11:17:58.153 に答える