不良做法 - 使片段使用Activity中的对象?

问题描述:

让片段使用持有者活动中的对象是不好的做法,还是应该让每个片段都初始化它们自己的对象?不良做法 - 使片段使用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(); 
... 
} 

上联活性和片段正在使用回调的最佳实践。例如,让我们想象一下,您需要从托管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(); 
} 

使用接口进行通信不是最好的方法。请在这里查看我的类似答案@https://*.com/a/25976762/1677824。它谈到了otto一个事件公交android通讯库。