DialogFragment не плавает, действует как встроенный или как другой фрагмент - PullRequest
1 голос
/ 21 июля 2011

У меня есть приложение, для которого я создал собственный диалог.Я должен что-то обмануть, пока вызов .show в диалоге действительно вызывает это, он выглядит как целый новый фрагмент и не плавает, а заменяет пользовательский интерфейс своим содержимым.Я видел в их справке для DialogFragment:

http://hi -android.info / docs / reference / android / app / DialogFragment.html # Lifecycle

этотможет вставлять диалог как обычный фрагмент или нет.Хотя я ничего не делаю для этого, поэтому не могу понять, почему он действует как внедренный фрагмент, а не как плавающий.Подумав об этом, я так определил свое определение XML?Приведенный выше пример диалогового фрагмента не дал определения макета xml, так что, возможно, именно в этом моя проблема?(Даже добавил гравитацию в XML-файл, все еще без кубиков)

Мое определение XML для этого диалога здесь:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:orientation="vertical"
  android:gravity="center_horizontal"
  android:layout_width="match_parent"
  android:layout_height="match_parent">
   <LinearLayout
     xmlns:android="http://schemas.android.com/apk/res/android"
 android:orientation="horizontal"
 android:layout_width="match_parent"
 android:layout_height="wrap_content">       
    <TextView               
            android:textSize="20sp"
            android:text = "Location:" 
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:gravity="left"/>
         <Spinner 
            android:id="@+id/location_spinner"
            android:layout_width = "450sp"
            android:layout_height="wrap_content"/>
            <!-- fill out the data on the package total cost etc -->    
    </LinearLayout>
    <LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">    
               <Button android:id="@+id/location_dlg_ok"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Okay"/>
                   <Button android:id="@+id/location_dlg_cancel"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Cancel"/>
                   <Button android:id="@+id/location_dlg_new"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Create new..."/>
    </LinearLayout>
</LinearLayout>

Как я уже сказал, очень хорошо отображается код фрагмента:

        package com.viciousbytes.studiotab.subactivities.dialogfragments;

        import ... ...

        public class LocationPicker extends DialogFragment {

            ArrayList<Location> mLocations;


            public static LocationPicker newInstance()
            {
                LocationPicker loc = new LocationPicker();
                                    return loc;

            }
            private void setLocations(ArrayList<Location> loc)
            {
                mLocations=loc;     
            }

              @Override
                public void onCreate(Bundle savedInstanceState) {
                    super.onCreate(savedInstanceState);
                    // Pick a style based on the num.
                    int style = DialogFragment.STYLE_NORMAL, theme = android.R.style.Theme;         
                    setStyle(style, theme);
                }

              @Override
                public View onCreateView(LayoutInflater inflater, ViewGroup container,
                        Bundle savedInstanceState) {
                    View v = inflater.inflate(R.layout.location_dialog, container, false);


                    Spinner spinner = (Spinner)v.findViewById(R.id.location_spinner);
                    ArrayAdapter<Location> adapter = new ArrayAdapter<Location>(v.getContext(), android.R.layout.simple_spinner_item, mLocations);                  
                    adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

                    if(mLocations==null)
                        spinner.setPrompt("No Locations");
                    else
                        spinner.setAdapter(adapter);

                    spinner.setOnItemSelectedListener(new LocationSelectedListener());

                    // Watch for button clicks.
                    Button newBtn = (Button)v.findViewById(R.id.location_dlg_new);
                    newBtn.setOnClickListener(new OnClickListener() {
                        public void onClick(View v) {
                            // When button is clicked, call up to owning activity.
                            //create new start that activity...

                        }
                    });

                    // Cancel do nothing dismissthis
                    Button cancelBtn = (Button)v.findViewById(R.id.location_dlg_cancel);
                    cancelBtn.setOnClickListener(new OnClickListener() {
                        public void onClick(View v) {
                            // When button is clicked, call up to owning activity.
                            //create new start that activity...

                        }
                    });

                    // okay button means set listener with the selected location.
                    Button okBtn = (Button)v.findViewById(R.id.location_dlg_ok);
                    okBtn.setOnClickListener(new OnClickListener() {
                        public void onClick(View v) {
                            // When button is clicked, call up to owning activity.
                            //create new start that activity...

                        }
                    });


                    return v;
                }

        }

Это вызывается из самого фрагмента?хотя это имеет значение?потому что я вызываю TimePIckerDialog и DatePickerDialog, и они работают нормально, но мой код вызова из моего другого фрагмента:

void showLocationDialog() {     


                 FragmentTransaction ft = getFragmentManager().beginTransaction();
                 Fragment prev = getFragmentManager().findFragmentByTag("locpicker");
                if (prev != null) {
                   ft.remove(prev);
                  }
                ft.addToBackStack(null);

                // Create and show the dialog.
                DialogFragment newFragment = LocationPicker.newInstance();
                newFragment.show(ft, "locpicker");                  
}

1 Ответ

1 голос
/ 22 июля 2011

Ваши конструкторы не правы. Попробуйте использовать только один static метод newInstance для создания фрагмента во всех случаях и используйте Bundle для хранения аргументов, которые вы хотите использовать во фрагменте. Обратитесь к Basic Dialog section здесь и распространите его на ваш случай.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...