Использование FragmentTransaction с DialogFragment - PullRequest
11 голосов
/ 08 апреля 2011

Итак, я создал DialogFragment, который отображается в виде диалога с помощью этой методики

Теперь, когда он запущен, и после взаимодействия с пользователем в этом всплывающем окне я хочу вставить другой фрагмент в это диалоговое окно. Я пытаюсь сделать это через FragmentTransaction.add (), где я даю ему идентификатор одного из контейнеров в этом макете. В этот момент я получаю:

java.lang.IllegalArgumentException: No view found for id 0x7f09013f for fragment <fragmentClassThatIWasPushingIn>

В качестве быстрого теста я попытался вставить его в идентификатор контейнера не в диалоге, а в основной операции поддержки, и это сработало просто отлично.

Есть ли что-то в DialogFragments и его идентификаторах контейнеров, которое не допускает FragmentTransactions?

В качестве временного запрета я сказал своей транзакции скрыть текущий DialogFragment и показать этот новый фрагмент, но анимация / отображение немного раздражают, поэтому я бы очень хотел разобраться с этой проблемой.

Спасибо

Ответы [ 3 ]

16 голосов
/ 10 апреля 2011

Когда DialogFragment отображается как Dialog, это на самом деле не является действительным Fragment в представлении контейнера.Это неконтейнерный Fragment, который в основном является оберткой Dialog.

Так что нет, вы не можете показать Fragment внутри FragmentDialog.Если вы действительно хотите это сделать, я думаю, что лучшим способом было бы создать новый Activity в стиле Dialog, который вы затем можете добавить Fragments.

3 голосов
/ 06 марта 2014

alexanderblom прав, что DialogFragment действует как диалог, однако его можно заставить действовать как фрагмент с setShowsDialog(false);

В итоге у меня сработало следующее:

Файл: res / layout / wifidirect_dialog_wifidirect:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:id="@+id/dialog_wifidirect_layout">

    <LinearLayout
        android:id="@+id/frag_container"
        android:layout_width="match_parent"
        android:layout_height="250dp"
        android:orientation="vertical" >

            <!-- This is replaced during runtime -->
            <RelativeLayout
                android:id="@+id/frag_list"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:gravity="top" >
            </RelativeLayout>
    </LinearLayout>

    <!-- The Cancel Button -->
    <View
    android:layout_width="fill_parent"
    android:layout_height="1dp"
    android:layout_marginBottom="0dp"
    android:background="?android:attr/dividerVertical" />
    <Button
         android:id="@+id/dialog_wifidirect_cancel"
         style="?android:attr/buttonBarButtonStyle"
         android:layout_width="fill_parent"
         android:layout_height="wrap_content"
         android:text="@string/cancel"/>         
</LinearLayout>

Файл src /.../ WifiDirectDialog.java:

public class WiFiDirectDialog extends DialogFragment  {
        public static final String TAG = "WifiDirectDialog";
        public static final String DEVICE_LIST_FRAGMENT_TAG = "WIFIDIRECT_DEVICE_LIST_FRAGMENT";


        public static WiFiDirectDialog newInstance(){                 
             WiFiDirectDialog wDialog = new WiFiDirectDialog();
             //We want this Dialog to be a Fragment in fact,
             //otherwise there are problems with showing another fragment, the DeviceListFragment
             wDialog.setShowsDialog(false);
             //wDialog.setStyle(SherlockDialogFragment.STYLE_NORMAL,android.R.style.Theme_Holo_Light_Dialog);
             //We don't want to recreate the instance every time user rotates the phone
             wDialog.setRetainInstance(true);
             //Don't close the dialog when touched outside
             wDialog.setCancelable(false);
             return wDialog;
        }


        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
            Log.v(TAG,"onCreateView");

            View view = inflater.inflate(R.layout.wifidirect_dialog_wifidirect,container, false);

            //Log.v(TAG,"FragmentTransaction started");            
            ListFragment listFragment = new YourListFragment();

            FragmentTransaction transaction = getChildFragmentManager().beginTransaction();
            transaction.addToBackStack(DEVICE_LIST_FRAGMENT_TAG)
                .replace(R.id.frag_list,deviceListFragment,DEVICE_LIST_FRAGMENT_TAG)
                .commit();
            //Log.v(TAG,"FragmentTransaction finished");

            return view;
        };

        @Override
        public void onActivityCreated(Bundle savedInstanceState){
            Log.v(TAG,"onActivityCreated");
            super.onActivityCreated(savedInstanceState);

            Dialog dialog = getDialog();
            dialog.setTitle(R.string.wifidirect_dialog_title);

            // Set button listeners etc...///
            Button cancelButton = (Button) view.findViewById(R.id.dialog_wifidirect_cancel);
            cancelButton.setOnClickListener(new View.OnClickListener() {
                public void onClick(View v) {                
                    dismiss();
                }
            });
        }
1 голос
/ 28 декабря 2011

там действительно есть контейнер, как вы можете видеть в методе onCreateView. Вы используете контейнер для создания вашего представления.

    public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle icicle) {
    Log.d(TAG, "onCreateView");
    View v = inflater
            .inflate(R.layout.move_folder_dialog, container, false);

Похоже, FragmentManager не может получить контейнер.

Может ли это быть ошибкой?

...