3

以前は、Fragment時間のかかるフェッチデータに基づいてUIを更新するがあります。

public class HomeMenuFragment extends SherlockFragment {
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        Infos arg1 = performTimeConsumingDataStructureLoading();

        // Add in various UI views in v, according to information in loaded
        // data structure.
        View v = inflater.inflate(R.layout.home_menu, container, false);
        // ...
        // Adding several LinearLayout and TextView into v, based on
        // information from loaded data structure (arg1)
        // ...
        return v;
    }
    ....
}

これは本当に良いデザインではありません。場合によってperformTimeConsumingDataStructureLoadingは、5秒以上かかることがあり、ANR(アプリケーションが応答しません)を取得します

http://developer.android.com/reference/android/content/AsyncTaskLoader.htmlを参照することで、より良い解決策が得られます。私が遭遇した例は、UIを介して間接的に更新することArrayAdapterです。

public class HomeMenuFragment extends SherlockFragment implements LoaderManager.LoaderCallbacks<HomeMenuFragment.Infos> {
    @Override
    public void onLoadFinished(Loader<Infos> arg0, Infos arg1) {
        LayoutInflater inflater = this.getLayoutInflater(null);
        ViewGroup container = (ViewGroup)this.getView().getParent();
        // Remove previous old views, as onLoadFinished might be triggered
        // by onContentChanged too.
        container.removeAllViews();

        View v = inflater.inflate(R.layout.home_menu, container, false);
        // ...
        // Adding several LinearLayout and TextView into v, based on
        // information from loaded data structure (arg1)
        // ...
        container.addView(v);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        return super.onCreateView(inflater, container, savedInstanceState);
    }     
    ....
}

ArrayAdapter私は使用していないので、私は持っていませんListFragment。私がやりたいのは、いくつかTextViewをいくつかに追加することLinearLayoutです。次に、のコンテナに追加LinearLayoutします。Fragment

ただし、次のコードではnullポインタ例外が発生します。

ViewGroup container = (ViewGroup)this.getView().getParent();

onLoadFinishedから後にフラグメントUIを動的に更新する正しい方法は何AsyncTaskLoaderですか?

4

2 に答える 2

4

ただし、私が遭遇するほとんどの例は、ArrayAdapterを介して間接的にUIを更新することです。

を使用する場合は、Loaderを使用する必要はありませんListView。アプリケーションでターゲットとするビューを更新できます。

AsyncTaskLoaderからonLoadFinishedした後、フラグメントUIを動的に更新する正しい方法は何ですか?

Fragment追加のビューを配置して新しいビューを追加する'sビューからコンテナへの参照を取得します。

@Override
public void onLoadFinished(Loader<Infos> arg0, Infos arg1) {      
    // for some reason the fragment's view isn't built yet so abort things 
    if (getView() == null) {
         ViewGroup container = (ViewGroup) getView().findViewById(R.id.containerId);
         ViewGroup container = getViewcontainer.removeAllViews();
         // ...
         // Adding several LinearLayout and TextView into v, based on
         // information from loaded data structure (arg1)
         // ...
         container.addView(v);
    }
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    return inflater.inflate(R.layout.home_menu, container, false);;
}    
于 2013-03-20T07:12:50.710 に答える
0

しばらくの間、私も同じことを達成しようとしていました。上記の答えに基づいて、私のために働いたのはこれでした:

@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
    adapter.swapCursor(cursor);

    ViewGroup container = (ViewGroup) getView().findViewById(R.id.fragment_oam);

    if (container != null) {
        if (adapter.getCount() == 0) {
            Log.v(TAG, "Count is: " + adapter.getCount());
            container.setBackgroundColor(Color.BLUE);
        } else {
            Log.v(TAG, "Count is: " + adapter.getCount());
            container.setBackgroundColor(Color.WHITE);
        }   
    } else {
        Log.v(TAG, "Container is null");
    }
}

そして、私のレイアウトxmlは次のとおりです。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/background"
    android:background="#FFF">    
<fragment
    android:name="com.myapp.OAMCursorLoader"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/fragment_oam">
</fragment>

これで、ContentResolverがカーソルを更新し、onLoadFinishedが、表示されている画面のこの背景に基づいて、カーソルが空であるか、コンテンツが含まれているかどうかを確認します。つまり、ListFragmentが変更されます。

背景設定をいじったり、色の代わりに描画可能な画像を使用したりできます。それはあなた次第です。

于 2014-10-11T14:39:56.620 に答える