Я использую 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;
}
}