как `commitNow ()` и `postDelayed` заставляют этот код работать? - PullRequest
0 голосов
/ 09 октября 2019

Я попытался сделать некоторую работу с фрагментами. Я помещаю макет просмотра макроса в макет и запускаю обзор маклера в onCreateView моего фрагмента. Наконец, я установил динамический pos ресивера с его предметами.

У меня есть такой код, чтобы он работал правильно с commitNow и postDelayed даже с задержкой в ​​0 мельниц, но я не знаю почему:

        getSupportFragmentManager()
                .beginTransaction()
                .replace(R.id.parentLayout, popupFragment)
                .commitNow();
        new Handler().postDelayed(()->popupFragment.show(), 0);

Но я попытался:

        getSupportFragmentManager()
                .beginTransaction()
                .replace(R.id.parentLayout, popupFragment)
                .commitNow();
        popupFragment.show();
        getSupportFragmentManager()
                .beginTransaction()
                .replace(R.id.parentLayout, popupFragment)
                .commitNowAllowingStateLoss();
        popupFragment.show();
        getSupportFragmentManager()
                .beginTransaction()
                .replace(R.id.parentLayout, popupFragment)
                .runOnCommit(()->popupFragment.show())
                .commitNowAllowingStateLoss();
        getSupportFragmentManager()
                .beginTransaction()
                .replace(R.id.parentLayout, popupFragment)
                .runOnCommit(()->popupFragment.show())
                .commitNow();

Все они получают неинициализированную высоту.

На мой взгляд, это примерно postDelayed, что делает код работающим в следующем цикле, однако, runOnCommit, кажется, также сначала делает коммит, а затем запускает исполняемый файл, почему это не работает?

1 Ответ

0 голосов
/ 09 октября 2019

Если вы хотите использовать «всплывающий» фрагмент, вы можете использовать класс AlertDialog следующим образом (и реорганизовать свой код из onCreateView, поскольку вы не гарантируете ссылку на действие из onCreateView):

@Override
public void onViewCreated(View view, Bundle onSaveInstanceState) {
    super.onViewCreated(view, onSaveInstanceState);
    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
    LayoutInflater inflater = LayoutInflater.from(getActivity());
    View popupFragmentsResourceView = inflater.inflate(R.layout.fragment_popup_view, null);
    builder.setView(popupFragmentsResourceView);
    //grab controls here
    //RecyclerView rv = popupFragmentsResourceView.findViewById(R.id.some_id);
    //rv.setAdapter(new CustomAdapter(getActivity));
    //set a click button for your dialog builder
    builder.show();
}
...