3

2 ペイン ビューとセレクター リストを管理する 1 つのアクティビティと、詳細フラグメントを管理するもう 1 つのアクティビティで、マスター/詳細パターンを使用しています。アクティビティへのフラグメント コールバックを処理するインターフェイスを使用しています。

詳細アクティビティが 2 ペイン アクティビティから多くのコールバック メソッドをコピーしているため、多くのコードの重複があるようです。必要に応じて、コンテキストが不要な静的メソッドを使用しましたが、コンテキストが必要な場合は、コードの重複をきれいに削除する方法がわかりません。

Abstract 親アクティビティによる継承はオプションですが、多くのオーバーヘッドがかかるようです。

これを行うより良い方法はありますか?

4

2 に答える 2

0

ここで同様の質問をしました:アクティビティとフラグメントの数は?

私も論理の重複を心配していましたが、私が得た答えはかなり健全な議論を引き起こしました.


最終的に、私はStephen の答えに従うことにしましたFragments

ただし、他の貢献者は、例に従ってロジックを複製することに非常に熱心であるように見えました。

于 2013-02-20T11:33:01.567 に答える
0

したがって、Frag A と Fragment B を制御する Activity AB があるとします。MY
ANSWER:
変数が Frag A と Frag B で使用される場合は、それを Activity AB に入れます。次に、必要なものすべてを Frag A または Frag B に渡します。または、Frag A または Frag B にアクティビティ AB から取得させます。変数が Frag A のみまたは Frag B のみで使用されている場合は、それぞれ Frag A または Frag B に配置します。

Frag A と Frag B の両方で使用されるメソッドの場合、それらのメソッドを別のクラスに配置し、使用する 2 つのフラグメントのそれぞれについて Frag A と Frag B 内にそのクラスのインスタンスを作成します。

以下は、私が別の方に回答したものです。しかし、それはあなたの質問に関連していると思われるので、ここに再投稿します。
フラグメント A の内部 u には、Activity AB が実装できるインターフェイスが必要です。サンプル Android コードでは、次のようになっています。

private Callbacks mCallbacks = sDummyCallbacks;

/* このフラグメントを含むすべてのアクティビティが実装する必要があるコールバック インターフェイス。このメカニズムにより、アイテムの選択をアクティビティに通知できます。*/

public interface Callbacks {
/*Callback for when an item has been selected. */    
      public void onItemSelected(String id);
}

/*A dummy implementation of the {@link Callbacks} interface that does nothing. Used only when this fragment is not attached to an activity. */    
private static Callbacks sDummyCallbacks = new Callbacks() {
    @Override
    public void onItemSelected(String id) {
    }
};

Callback インターフェイスは、フラグメントの 1 つ (フラグメント A としましょう) の中に配置されます。この Callbacks インターフェイスの目的は、Frag A 内のネストされたクラスのようなもので、どのアクティビティでも実装できると思います。したがって、フラグメント A が TV であった場合、コールバックは、アクティビティ AB がフラグメント A を使用できるようにする TV リモート (インターフェース) です。私は初心者なので、詳細については間違っているかもしれませんが、プログラムをすべての画面サイズで完全に動作させることができました。これが私が使用したものです。

フラグメント A の内部には、次のものがあります (これは Android のサンプル プログラムから取得しました)。

@Override
public void onListItemClick(ListView listView, View view, int position, long id) {
super.onListItemClick(listView, view, position, id);
// Notify the active callbacks interface (the activity, if the
// fragment is attached to one) that an item has been selected.
mCallbacks.onItemSelected(DummyContent.ITEMS.get(position).id);
//mCallbacks.onItemSelected( PUT YOUR SHIT HERE. int, String, etc.);
//mCallbacks.onItemSelected (Object);
}

そして、Activity AB 内で onItemSelected メソッドをオーバーライドします。

public class AB extends FragmentActivity implements ItemListFragment.Callbacks {
//...
@Override
//public void onItemSelected (CATCH YOUR SHIT HERE) {
//public void onItemSelected (Object obj) {
    public void onItemSelected(String id) {
    //Pass Data to Fragment B. For example:
    Bundle arguments = new Bundle();
    arguments.putString(“FragmentB_package”, id);
    FragmentB fragment = new FragmentB();
    fragment.setArguments(arguments);
    getSupportFragmentManager().beginTransaction().replace(R.id.item_detail_container, fragment).commit();
    }

したがって、Activity AB 内では、基本的にすべてを Bundle に投入して B に渡します。Bundle の使用方法がわからない場合は、クラスを調べてください。

基本的に Android が提供するサンプル コードを使用します。DummyContent のものを含むもの。新しい Android アプリケーション パッケージを作成すると、MasterDetailFlow という名前のパッケージになります。

于 2013-02-20T15:08:29.733 に答える