2013-02-20 39 views
3

我正在使用主/細節模式來管理2窗格視圖和選擇器列表以及管理細節片段的其他活動。我正在使用一個接口來處理活動的分段回調。如何避免代碼重複與片段回調的細節活動?

雖然詳細信息活動複製了2窗格活動中的許多回調方法,但好像有很多代碼複製。在適當的情況下,我使用了不需要上下文的靜態方法,但需要上下文的地方我不確定如何整潔地刪除代碼重複。

繼承與抽象父活動是一個選項,但似乎有很多開銷。

有沒有更好的方法來做到這一點?

回答

0

我在這裏問類似的問題:How many Activities vs Fragments?

我也很擔心邏輯的重複,答案我被引起了健康的辯論。


最後我選擇跟隨Stephen's answer,把儘可能多的邏輯進入Fragments自己。

然而,其他貢獻者似乎非常熱衷於按照示例複製邏輯。

0

因此,可以說u有活動AB控制破片A和片段B
我的回答:
如果變量使用的大亂A和破片B,把它放在活動AB。然後將它傳遞給Frag A或Frag B他們需要的一切。或者讓Frag A或Frag B從Activity AB中檢索它。 如果該變量僅由Frag A或Frag B使用,則分別將其置於Frag A或Frag B中。

對於Frag A和Frag B都使用的方法,將這些方法放在另一個類中,併爲要使用的2個片段中的每個片段在Frag A和Frag B中創建該類的實例。

以下是我給另一個人的答案。但是,它似乎與你的問題有關,所以我在這裏重新發布它。
內部片段您需要一個活動AB可以實現的接口。 在示例機器人碼,它們有:

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) { 
    } 
}; 

回調接口能夠把裏面的一個片段(假設片段A)。我認爲這個Callbacks接口的目的就像任何Activity可以實現的Frag A中的嵌套類。所以如果Fragment A是一臺電視機,CallBacks就是電視遙控器(接口),允許Activity AB使用Fragment A.我可能錯誤的細節,因爲我是一個noob,但我確實讓我的程序在所有屏幕尺寸上完美地工作,這就是我使用的。因此片段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); 
} 

而且裏面活動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(); 
    } 

所以內部活動AB ,你基本上把所有東西都扔到一個Bundle中,然後傳遞給B.如果你不確定如何使用Bundle,那麼看看這個類。

我基本上是由Android提供的示例代碼。與DummyContent的東西。當你製作一個新的Android應用程序包時,它是一個名爲MasterDetailFlow的標題。