0

私はマスター/詳細フローを使用しており、すべてのフラグメントにviewpagerいくつかのフォームが含まれていますが、マスター リストから他のリンクをクリックすると、その内容viewpagerが失われます。このコンテンツを保存して、同じ選択肢をクリックするたびにデータを見つける方法。
私のコード:

@Override
    public void onItemSelected(String id) {
        if (mTwoPane) {
            // In two-pane mode, show the detail view in this activity by
            // adding or replacing the detail fragment using a
            // fragment transaction.

            if(id.contains("1"))
            {
                Bundle arguments = new Bundle();

                ItemDetailFragment fragment = new ItemDetailFragment();
                fragment.setRetainInstance(true);
                fragment.setArguments(arguments);
                getSupportFragmentManager().beginTransaction()
                        .replace(R.id.item_detail_container, fragment).commit();
            }
            else if(id.contains("2"))
            {
                Bundle arguments = new Bundle();

                ItemDetailFragment2 fragment = new ItemDetailFragment2();
                fragment.setRetainInstance(true);
                fragment.setArguments(arguments);
                getSupportFragmentManager().beginTransaction()
                        .replace(R.id.item_detail_container, fragment).commit();
            }
        } else {
            // In single-pane mode, simply start the detail activity
            // for the selected item ID.
            Intent detailIntent = new Intent(this, ItemDetailActivity.class);
            detailIntent.putExtra(ItemDetailFragment.ARG_ITEM_ID, id);
            startActivity(detailIntent);
        }
    }

編集: 私は自分のコードをこのように変更しようとしました:

if (id.contains("1")) {
Fragment currFragment = fm.findFragmentByTag(lastTag);

                ItemDetailFragment newFragment = (ItemDetailFragment) fm.findFragmentByTag("f"+1);
                FragmentTransaction ft = fm.beginTransaction();

                ft.hide(currFragment);

                    if(newFragment==null)
                    {lastTag="f"+1;

                    newFragment=new ItemDetailFragment();
                    ft
                    .replace(R.id.item_detail_container, newFragment);}
                    else {
                        ft.show(newFragment);
                    }


                ft.commit();
}

しかし、私はで取得しNullPointerExceptionましたandroid.support.v4.app.BackStackRecord.run(BackStackrecord.java:656)

4

3 に答える 3

0

arrayList に保存することをお勧めします。Onclick でイメージ ID を arrayList に保存します。

于 2013-09-20T10:38:50.923 に答える
0

フラグメント onCreate() で setRetainInstance(true) を呼び出してみてください

ここに書かれているように、トランザクションをバックスタックに追加しないと、削除または置換時にフラグメントが破棄されます。代わりに現在のフラグメントを非表示にしてから、新しいフラグメントを追加できます。そのように:

int currPage = 0;

public void goToPage(int num) {
    FragmentManager fm = getSupportFragmentManager();
    Fragment currFragment = fm.findFragmentByTag("f" + currPage);
    Fragment newFragment = fm.findFragmentByTag("f" + num);
    FragmentTransition ft = fm.beginTransaction();

    ft.hide(currFragment);

    if(newFragment == null) {
        // First use. Create new instance for page.
        newFragment = new MyFragment();
        ft.add(R.id.item_detail_container, newFragment, "f" + num);
    } else {
        // Fragment for page already added. Just show it.
        ft.show(newFragment);
    }

    ft.commit();
    this.currPage = num;
}

また、最初のページ フラグメントにもタグを指定することを忘れないでください。

于 2013-09-20T12:02:38.653 に答える
0

onPause()フラグメントのまたはメソッドを実装し、onStop()そのメソッドが呼び出されたときにデータを保存できます。これは、それらが削除されると自動的に行われます。

または、savedInstanceState を使用することもできます。

于 2013-09-20T10:51:05.263 に答える