2014-09-22 22 views
1

讓片段使用持有者活動中的對象是不好的做法,還是應該讓每個片段都初始化它們自己的對象?不良做法 - 使片段使用Activity中的對象?

我認爲這是不好的做法的原因是因爲現在片段依賴於一個活動,這會消除其重用性。請告訴我什麼是使用片段的最佳做法。

例如,我有一個活動MainActivity,它有一個導航抽屜。導航抽屜用於在MainActivity中的五個片段之間切換。在MainActivity,我已經初始化:

public class MainActivity extends SherlockFragmentActivity { 

private DrawerLayout mDrawerLayout; 
private ListView mDrawerList; 
private ActionBarDrawerToggle mDrawerToggle; 
private ArrayList<String> navItems; 
private NavigationAdapter navAdapter; 
private ArrayList<Series> series; 
private ArrayList<Episode> history; 
private ArrayList<NewsItem> news; 
FlowAdapter flowAdapter; 
CardAdapter cardAdapter; 
NewsAdapter newsAdapter; 
Server SP = new Server(); 
Processor CPU = new Processor(); 
Parser mParser = new Parser(); 
... 
} 

而在我的片段,被稱爲HomeFragment之一,我想知道,如果它要成爲更好的初始化自己的每個對象的版本:

public class HomeFragment extends SherlockFragment implements 
    OnNavigationListener { 

GridView homeList; 
ArrayAdapter<CharSequence> modeList; 
ActionBar mActionBar; 
int current_item; 
SherlockFragmentActivity main; 
private ArrayList<Series> series; 
FlowAdapter flowAdapter; 
Bundle savedInstanceState; 
ImageFetcher mFetcher; 
boolean flag_loading; 
Server SP = new Server(); 
Processor CPU = new Processor(); 
int page; 
... 
} 

...或通過使用一些功能,像在MainActivity讓他們:

@Override 
public void onActivityCreated(Bundle savedInstanceState) { 
    super.onActivityCreated(savedInstanceState); 
    SP = ((MainActivity) getActivity()).getServer(); 
... 
} 

回答

1

上聯活性和片段正在使用回調的最佳實踐。例如,讓我們想象一下,您需要從託管Activity獲取一些對象,並在您的Fragment處使用它們。很明顯,在這種情況下,Activity應具有一些功能來滿足Fragment。因此,我們可以使用接口。

public interface MyCallback { 
    Object takeObject(); 
} 

然後,使Activity實現此接口:

public class MyActivity extends Activity implements MyCallback { 

} 

之後,你可以在onAttach回調保存鏈接到本Activity

public class MyFragment extends Fragment { 

    MyCallback callback; 

    @Override 
    public void onAttach(Activity activity) { 
     try { 
      callback = (MyCallback) activity; 
     } catch (ClassCastException ex){ 
      throw new ClassCastException("Hosting activity must implement " 
       + MyCallback.class.getSimpleName()); 
     } 
     super.onAttach(activity); 
    } 
} 

在後面的代碼你可以使用此回調如下:

if (callback != null){ 
    Object object = callback.takeObject(); 
} 
相關問題