0

HTTP Post 経由で XML ファイルを提供する Web サービスがあります。

この xml ファイルをダウンロードしてオブジェクトに解析し、FragmentPagerAdapter. を介してこの XML ファイルを取得AsyncTaskし、リスナー インターフェイスを介してプロセスが終了したことをフラグメントに通知します。

そこから、フラグメント内のビューに Web サービスから返されたデータを入力します。向きが変わるまではこれで問題ありません。私が理解していることから、ViewPagerのアダプターは、作成したフラグメントを保持することになってonCreateViewいます。ここでの投稿やGoogleドキュメントなどを探して最後の1日ほどを費やしましたが、やりたいことを実行できる具体的な方法が見つかりません。フラグメントを保持し、すでにビューが読み込まれているので、方向が変わったときに元に戻すだけで、Web サービスへの不要な呼び出しを回避できます。

いくつかのコード スニペット:

主な活動onCreate

mViewPager = (ViewPager) findViewById(R.id.viewpager);
if (mViewPager != null) {
    mViewPager.setAdapter(new PagerAdapter(getSupportFragmentManager()));
}

if (savedInstanceState == null) {
    if (CheckCredentials()) {
        Refresh(0,0);
    } else {
        ShowCredentialsDialog(false);
    }
}

メイン アクティビティのメソッドを更新...

public void Refresh(Integer month, Integer year) {
    if (mUpdater == null) {
        mUpdater = new UsageUpdater(this);
//        mUpdater.setDataListener(this);
    }

    if (isConnected()) {
        mUpdater.Refresh(month, year);
        usingCache = false;
        mProgress.show();
    } else {
        mUpdater.RefreshFromCache();
        usingCache = true;
    }
}

これは問題のフラグメント全体であり、テキストビューなどでテキストの設定を表示することは重要ではないため、UI に入力するコードの一部を除いたものです...

public class SummaryFragment extends Fragment implements Listeners.GetDataListener {

    private static final String KEY_UPDATER = "usageupdater";
    private UsageUpdater mUpdater;
    private Context ctx;

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        this.ctx = activity;
    }

    private View findViewById(int id) {
        return ((Activity)ctx).findViewById(id);
    }

    public void onGetData() {
        // AsyncTask interface method, will be called from onPostExecute.
        // Populate view from here
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        super.onCreateView(inflater, container, savedInstanceState);
        View view = inflater.inflate(R.layout.fragment_usagesummary, container, false);
        mUpdater = (UsageUpdater) getArguments().getSerializable(KEY_UPDATER);
        mUpdater.setDataListener(this);
        return view;
    }
}

この「問題」のいずれかを理解している場合、空onCreateViewのビューを返していますが、フラグメントを保持する方法がわかりません。データが事前に入力されたビューを返し、メインアクティビティからのすべての Web サービス呼び出しを管理します。

わからない場合は、Android は私にとって主要な言語ではなく、これはおそらく修羅場のように見えます。どんな助けでも大歓迎です私はかなりイライラしています。

4

1 に答える 1

0

アクティビティが再作成されたときに代替リソースを使用していない場合は、AndroidManifest で configChange フラグを使用して、ローテーション イベントを自分で処理してみてください。

<activity
    ...
    android:configChanges="orientation|screenSize"
    ... />

コンテキスト リークが発生するため、Activity が再作成された場合、同じ事前設定されたビューを保持する方法はありません。

http://www.curious-creature.org/2008/12/18/avoid-memory-leaks-on-android/

于 2013-08-05T02:44:22.730 に答える