Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/221.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在Android中完成异步任务后更新片段?_Java_Android_Android Fragments - Fatal编程技术网

Java 如何在Android中完成异步任务后更新片段?

Java 如何在Android中完成异步任务后更新片段?,java,android,android-fragments,Java,Android,Android Fragments,可能有一种非常简单的方法可以做到这一点,它只需要一两行代码,但我不知道如何做到这一点 我想让片段最初在屏幕中央显示加载gif,然后它将启动一个异步任务,从我的服务器下载信息。异步任务完成后,我需要将片段的内容视图设置为不同的xml文件,然后显示从服务器获得的一些内容 我想应该有一些函数类型,比如Fragment.invalidate()或Fragment.refresh(),可以帮助更新片段,但我似乎找不到任何这样的函数 此外,如果我在onCreateView函数之外的其他函数中更新片段,我是否

可能有一种非常简单的方法可以做到这一点,它只需要一两行代码,但我不知道如何做到这一点

我想让片段最初在屏幕中央显示加载gif,然后它将启动一个异步任务,从我的服务器下载信息。异步任务完成后,我需要将片段的内容视图设置为不同的xml文件,然后显示从服务器获得的一些内容

我想应该有一些函数类型,比如
Fragment.invalidate()
Fragment.refresh()
,可以帮助更新片段,但我似乎找不到任何这样的函数

此外,如果我在
onCreateView
函数之外的其他函数中更新片段,我是否需要创建变量来保存最初传递给它的
LayoutInflater
ViewGroup
对象,或者我可以使用函数调用访问这些对象?下面是我大致想要做的

public class HomeFragment extends Fragment
{
    public HomeFragment(){}

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
    {
        View view = inflater.inflate(R.layout.loading, container, false);

        (new GetDataTask()).execute(1);

        return view;
    }


    private class GetDataTask extends AsyncTask<Integer, Void, ServerResponse>
    {
        @Override
        protected void onPreExecute(){}

        @Override
        protected ServerResponse doInBackground(Integer... args)
        {
            int page_num = args[0];
            return Server.getPosts(page_num);
        }

        @Override
        protected void onPostExecute(ServerResponse result)
        {
            /*
                1. Update the content view to R.layout.multi_post_list
                2. Change specific text views and image views (I know how to do this part)
                3. Notify that changes have been made to the Fragment, so it needs redrawn
            */
        }
    }
}
公共类HomeFragment扩展了片段
{
公共HomeFragment(){}
@凌驾
CreateView上的公共视图(布局、充气机、视图组容器、捆绑包保存状态)
{
视图=充气机。充气(右布局。装载,容器,假);
(新建GetDataTask())。执行(1);
返回视图;
}
私有类GetDataTask扩展了AsyncTask
{
@凌驾
受保护的void onPreExecute(){}
@凌驾
受保护的ServerResponse doInBackground(整数…参数)
{
int page_num=args[0];
return Server.getPosts(页码);
}
@凌驾
受保护的void onPostExecute(服务器响应结果)
{
/*
1.将内容视图更新为R.layout.multi_post_列表
2.更改特定的文本视图和图像视图(我知道如何执行此部分)
3.通知已对片段进行了更改,因此需要重新绘制
*/
}
}
}
注意:ServerResponse是我创建的一个类,Server.getPosts是一个返回ServerResponse的静态函数。我知道这些在我的情况下是有效的。我需要关于我的
onPostExecute
类的
GetDataTask
部分中的第1点和第3点的帮助


谢谢

您可以使用findFragmentByTag

DetailsFragment df = getFragmentManager().findFragmentByTag("details");
    if (df != null) {
        df.setShownIndex(getSelectedIndex());
    } else {
        df = DetailsFragment.newInstance(getSelectedIndex());
    }
    fragmentTransaction.replace(R.id.frame, df, "details").commit();
三件事:

  • 使用AsyncTaskLoader而不是AsyncTask来防止在屏幕旋转后重新加载数据。或者对片段调用
    setRetainInstance(true)
    ,以防止片段在旋转时被破坏。(小心处理分离状态)
  • 您可以通过调用
    getActivity().findviewbyd(android.R.id.content)
    获取活动的根视图,并根据需要对其进行操作。您也可以只创建一个布局,其中包含状态和显示/隐藏它们所需的部分
  • 您可以随时从(getActivity())调用
    LayoutInflater.from来获取充气机。

  • 不确定此
    getSelectedIndex()
    来自何处?在Fragment.java中没有类似的方法