java - 如何将数据加载到 FragmentActivity 中以供嵌套 fragment 使用?

标签 java android android-activity android-asynctask

我有一个带有两个 Fragment 的 FragmentActivity。这两个 Fragment 依赖于一个共享对象。该对象由 AsyncTask 加载。所以这里的问题是,当 Activity 创建并显示 fragment 时,对象尚未加载。是否有任何方法可以暂停 Fragment 创建或类似的方法?

场景是这样的:

FragmentActivity

public class MainActivity extends FragmentActivity {

    private Object sharedObject;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        new FooAsyncTask(...).execute();
    }

    ...

    public void onAsyncTaskCompleted(result) {
        sharedObject = result;
    }

    // Pager adapter -------------------------------------------------------
    private class SectionsPagerAdapter extends FragmentPagerAdapter {

        public SectionsPagerAdapter(FragmentManager fm) {
            super(fm);
        }

        @Override
        public Fragment getItem(int position) {
            switch(position) {
                case 0:
                    return FooFragment.newInstance(sharedObject);
                case 1:
                    return BarFragment.newInstance(sharedObject);
                default:
                    throw new IllegalStateException();
            }
        }

        @Override
        public String getPageTitle(int position) {
            switch(position) {
                case 0:
                    return "Foo";
                case 1:
                    return "Bar";
                default:
                    throw new IllegalStateException();              
            }
        }

        @Override
        public int getCount() {
            return 2;
        }

    }
}

FooFragment

public class FooFragment extends Fragment {
    public FooFragment newInstance(Object sharedObject) {
        FooFragment f = new FooFragment();
        f.setObject(sharedObject);
        return f;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ...
    }

    ...

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        ...
        // Here I use the object to show data
    }
}

BarFragment

public class BarFragment extends Fragment {
    public BarFragment newInstance(Object sharedObject) {
        BarFragment f = new BarFragment();
        f.setObject(sharedObject);
        return f;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ...
    }

    ...

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        ...
        // Here I use the object to show data
    }
}

最终想法

因此,如您所见,我需要两个 fragment 具有相同的数据,并且该数据需要加载到 AsyncTask 中。对我来说理想的行为是:

  1. 加载MainActivity
  2. 显示 ProgressDialog 并在后台加载数据
  3. 关闭进度对话框
  4. 显示 fragment 并使用数据

最佳答案

你这样做是错误的。你不应该暂停任何事情。相反,当父 Activity 加载所需内容时,它应该告诉 fragment 这一点。事实上,我会采取不同的方式 - 通过使用监听器 - 因此我的 fragment 需要在创建时注册,并且加载我的数据的对象将在加载任务完成后广播消息。

关于java - 如何将数据加载到 FragmentActivity 中以供嵌套 fragment 使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17489164/

相关文章:

java - 需要在java中生成超集

java - 在 Mac Os X 上用 Java 获取网络摄像头流

android - 单击持续通知时返回上一个 Activity

Android ProgressBar 从非 Activity 类开始

android - 根据用户选择将不同的字符串传递给 Activity

java - java、printf 和小数的问题

java - 在AsyncTask android中下载进度

android - 在 manifest.xml 中注册一个具有许多操作的接收器

Android 4.2 破坏了我的 AES 加密/解密代码

java - 如何在java中从WEB读取或下载整个文件夹/目录