0

選択したラジオボタンが変更されたときにアクティビティのフラグメントを変更するラジオグループがあります。私はこのコードを持っています:

@Override
    public void onCheckedChanged(RadioGroup group, int checkedId) {
        switch (checkedId) {
            case R.id.main_menu1:
                showOffersFragment();
                break;
            case R.id.main_menu2:
                openMap();
                break;
            case R.id.main_menu3:
                showProductsFragment();
                break;
        }
    }

    private void showProductsFragment() {
        fm = getFragmentManager();
        ft = fm.beginTransaction();
        if (productsFragment == null) {
            bundle = new Bundle();
            bundle.putSerializable(ActivityConstants.PRODUCT_ITEMS, products);
            productsFragment = new ProductFragment();
            productsFragment.setArguments(bundle); ft.add(R.id.main_frag_container, productsFragment, "products");

        } else {
            //TODO
            ft.replace(R.id.main_frag_container, productsFragment, "products");
            productsFragment.loadList(products);
        }

        ft.commit();
    }
private void showOffersFragment() {
        Log.d(TAG, "OFFERS NULL OR :" + (offersFragment == null)+" ITEMS ="+items.size());

        fm = getFragmentManager();
        ft = fm.beginTransaction();

        if (offersFragment == null) {
            bundle = new Bundle();
            bundle.putSerializable(ActivityConstants.OFFER_ITEMS, items);
            offersFragment = new OffersFragment();
            offersFragment.setArguments(bundle);
            ft.add(R.id.main_frag_container, offersFragment,"offers");
        } else {
            ft.replace(R.id.main_frag_container, offersFragment,"offers");
        }
        ft.commit();
    }
  private void openMap() {
        fm = getFragmentManager();
        ft = fm.beginTransaction();
        if(mapFragment==null){
            mapFragment = new MapFragment();
            ft.add(R.id.main_frag_container, mapFragment, "Map");
        }else{
            ft.replace(R.id.main_frag_container, mapFragment, "Map");
        }
        ft.commit();
        mapFragment.getMapAsync(this);
    }

問題は、フラグメントを切り替えるときです。フラグメントをすぐに変更しないため、応答があまり良くありません。フラグメントが表示されるように、それらを数回切り替える必要があります。

どうすれば適切に最適化/動作させることができるか教えてもらえますか?

4

1 に答える 1

1

最初に各オプションを選択すると、この行が run になるため、すぐには応答しません。これはft.add(R.id.main_frag_container, mapFragment, "Map");、古いフラグメントを置き換えるのではなく、同じコンテナーに新しいフラグメントを追加することを意味します。

ft.replace(R.id.main_frag_container, mapFragment, "Map");の代わりに使用しft.add(R.id.main_frag_container, mapFragment, "Map");ます。私は間違っているかもしれませんが、コンテナー (ここでは R.id.main_fragment_container) にはフラグメントが既に追加されている必要があります。1 つのオプションは、コンテナーが空の場合にのみフラグメントを追加し、それ以外の場合は置き換えることです。

前のフラグメントに戻りたい場合は、addToBackStackをチェックすることをお勧めします。

于 2015-02-13T10:25:24.797 に答える