java - 坏习惯 - 让 fragment 使用来自 Activity 的对象?

标签 java android android-fragments

<分区>

让 fragment 使用其持有者 Activity 中的对象是一种不好的做法,还是我应该让我的每个 fragment 都初始化它们自己的对象。

我认为这是不好的做法的原因是,现在 fragment 依赖于一个 Activity ,这剥夺了它的可重用性。请告诉我使用 fragment 的最佳做法是什么。

例如,我有一个带有抽屉导航的 Activity MainActivity。抽屉导航用于在 MainActivity 中的五个 fragment 之间切换。在 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 的 fragment 中,我想知道是否最好为每个对象初始化它自己的版本:

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 中使用它们。很明显,在这种情况下,Activity 应该具有一些功能来满足 Fragment。因此,我们可以使用接口(interface)。

public interface MyCallback {
    Object takeObject();
}

然后,制作Activity来实现这个接口(interface):

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

关于java - 坏习惯 - 让 fragment 使用来自 Activity 的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25976291/

相关文章:

android - 当 edittext 在 fragment 中显示键盘时移动布局

java - 如何使用 hibernate 在 SQL Server 数据库中存储 joda DateTime

java - 具有 Inheritance.JOINED 的 Spring Data Repository

java - 为 kafka 编写我们自己的自定义分区器

java - 在android中解析没有名称的json数组

android - 对话框中的按钮顺序

Android BackStack 抽屉导航

android - 如何从 FragmentPagerAdapter 中删除 fragment ?

Java,对象化文件中的唯一字符并通过字符对象的increment()方法计算出现次数

android - fragment 中的 onCreateOptionsMenu() 不替换 ActionBar 菜单