找到片段视图元素并在asynctask完成后更新它们

时间:2013-11-24 00:16:53

标签: java android android-fragments android-asynctask

我有一个包含多个片段的活动。每个片段都实现了我的UpdateRequest接口,其中每个片段都执行一些asynctask并从Web服务下载数据。我的问题是我真的不明白如何更新现有的片段。我读了这个

Android Refreshing Fragment View after AsyncTask

但我仍然无法弄清楚如何定位每个片段的视图然后更新它们。我举个例子:

有一个UserFragment,它应代表用户个人资料:

public class UserFragment extends SherlockFragment implements
        UpdateRequest {

    View rootView;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        rootView = inflater.inflate(R.layout.fragment_user_info,
                container, false);
        return rootView;
    }
    ...
    public void update(final OnFragmentUpdatedListener context) {
    ...
    asyntask
     ...
    }

}

fragment_user_info看起来像这样:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >



    <ImageView
        android:id="@+id/fragment_user_picture"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:contentDescription="@string/image_of_user" />

    <TextView
        android:id="@+id/fragment_user_name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/user_info" />

</RelativeLayout>

我想要的是找到UserFragment的实例,然后在其AsyncTask.onPostExecute()方法中将fragment_user_name textView中的文本更改为asynctask返回的内容。

1 个答案:

答案 0 :(得分:0)

最简单的方法是在片段中创建一个final变量来保存对TextView的引用。然后,作为片段的匿名内部类的AsyncTask将直接访问它。所以,像这样:

public class UserFragment extends SherlockFragment实现了UpdateRequest {

private View rootView;


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    rootView = inflater.inflate(R.layout.fragment_user_info, container, false);
    return rootView;
}
...
public void update(final OnFragmentUpdatedListener context) {
    final TextView userNameView = (TextView) rootView.findViewById(R.id.fragment_user_name);
    ...
    asyntask
    ...
    onPostExecute() {
        userNameView.setText(....);
    }

}