不良做法 - 使片段使用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();
}