Повторное использование макета, созданного в Fragment.onCreateView (), чтобы избежать инфляции при многократном отображении - PullRequest
0 голосов
/ 25 января 2020

Я использую DialogFragment для отображения «модального» меню нижнего листа (более подробная информация здесь: https://material.io/develop/android/components/bottom-sheet-dialog-fragment/). Поскольку оно содержит своего рода контекстное меню для элементов, содержащихся в RecyclerView, оно может отображаться несколько раз во время выполнения.

Однако всегда вызывается DialogFragment.show () , * 1008 Также вызывается * Fragment.onCreateView () , что приводит к инфляции компоновки, которую (?) Можно рассматривать как «тяжелую» задачу для вычисления в потоке пользовательского интерфейса, которую я хочу избежать из соображений производительности. Поэтому, чтобы избежать раздувания макета при каждом показе DialogFragment, я создал объект-член ViewGroup, указывающий на возвращаемое представление Fragment.onCreateView () для повторного использования, например:

public class BottomMenu extends BottomSheetDialogFragment {

    private ViewGroup mLayout;
    private TextView mLabel;

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        if (mLayout == null) {
            mLayout = (ViewGroup) LayoutInflater.from(getContext()).inflate(R.layout.bottom_sheet, container, false);
            mLabel = mLayout.findViewById(R.id.bottom_sheet_label);
        }
        return mLayout;
    }

    @Override
    public void onDismiss(@NonNull DialogInterface dialog) {
        super.onDismiss(dialog);
        // The view cannot be reused if it's already attached to the previous parent view
        ((ViewGroup) mLayout.getParent()).removeView(mLayout);
    }

    public void setLabel(String label) {
        mLabel.setText(label)
    }

}

Но однажды использованный в первый раз такое представление должно быть отсоединено от представления контейнера Fragment для повторного использования (см. метод переопределения onDismissed () для опубликованного фрагмента), что выглядит как неприятный обходной путь

Поэтому я отправляю этот вопрос чтобы проверить, знает ли кто-нибудь лучший подход для повторного использования макета для того же фрагмента

Подробнее здесь:

public class ActivityMain extends AppCompatActivity {

    private BottomMenu mBottomMenu;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        [...]
        mBottomMenu = new BottomMenu();
    }

    @Override 
    public boolean onLongClick(View v) {
        mBottomSheet.setLabel(label);
        // The following calls onCreateView() in Fragment, so try to return
        // there the previously inflated layout, if any
        mBottomSheet.show(getSupportFragmentManager(), "TAG?");
        return true;
    }

}
...