0

現在、フラグメントを使用しようとしていますが、解決できない問題が発生しています。

4 つの異なるフラグメントを保持する 1 つのアクティビティがあります。このアクティビティから、Web にアクセスして必要なさまざまなデータを取得し、それをフラグメントに送信する ASyncTask を起動します。

しかし、アプリが強制終了されて再度開かれたり、向きを変更したりすると、フラグメントが明らかに再作成され、カスタム FragmentAdapter がフラグメントへの適切な参照を保持しません。

これが私の主な活動のコードです。

public class MainActivity extends FragmentActivity {
    MyPagerAdapter fgsAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //...
        FragmentManager fm = super.getSupportFragmentManager();
        fgsAdapter = new MyPagerAdapter(fm,this);
        ViewPager myPager = (ViewPager) findViewById(R.id.home_pannels_pager);
        myPager.setAdapter(fgsAdapter);
        myPager.setCurrentItem(0);
    }
    @Override
    protected void onResume() {
        super.onResume();
        ATaskGetUser task = new ATaskGetUser(callback, (ProgressBar) findViewById(R.id.PB_AsyncTask));
        task.execute();
    }
    //What's called by the ASyncTask onPostExecute()
    private void notifyDataChanged() {
        fgsAdapter.notifyFragments(user.getItems());
    }

    private class MyPagerAdapter extends FragmentPagerAdapter {
        private List<CardFragment> fragments = new ArrayList<CardFragment>();
        private Context c;

        public MyPagerAdapter(FragmentManager fm, Context c) {
            super(fm);
            CardFragment h = new HabitFragment();
            CardFragment d = new DailyFragment();
            CardFragment t = new ToDoFragment();
            CardFragment r = new RewardFragment();
            fragments.add(h);
            fragments.add(d);
            fragments.add(t);
            fragments.add(r);
        }
        public int getCount() {
            return fragments.size();
        }

        @Override
        public CardFragment getItem(int position) {
            Log.v("MainActivity_fgsmanager", "getItem()");
            CardFragment f = (CardFragment) this.fragments.get(position);
            return f;
        }
        public void notifyFragments(List<HabitItem> items) {
            for(OnTasksChanged f : fragments) {
                f.onChange(items);
            }
        }
    }
}

したがって、私ができるようにしたいのは、関数で onChange (4 つのフラグメントによって実装されたインターフェイス) を呼び出せるようにすることnotifyDataChangedです。これは可能ですか、私は間違った方法を考えていますか?

4

1 に答える 1

0

フラグメントで同じ問題が発生したことがあります。画面を回転させるたびに現在のフラグメントが失われていました。

Fragment クラス (親の FragmentActivity クラスではない) に 1 行を追加するだけで解決しました。

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

    setRetainInstance(true);//Added not to lose the fragment instance during screen rotations

(...)

アプリが強制終了されて再び開かれる場合、それが機能するかどうかはわかりません。

于 2013-05-19T02:13:34.417 に答える