DialogFragment не плавает, действует как встроенный или как другой фрагмент

1

У меня есть это приложение, для которого я создал специальный диалог. Мне нужно что-то придумать, потому что вызов.show в диалоговом окне действительно вызывает его, он выглядит как целый новый фрагмент, и он не плавает, а вместо этого заменяет ui своим содержимым. Я видел в их помощи для 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");                  
}
Теги:
android-fragments

1 ответ

1

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

  • 0
    Я использовал этот пример. Скопировал его почти дословно и до сих пор возникают проблемы. То же самое, я озадачен. В действии в их примере их newInstance не был объявлен публичным, поэтому его использование в другой деятельности не сработало, если не было объявлено публичным (для меня).
  • 0
    на самом деле я понял, тема была неправильной, мне нужна была тема 0, которая, как я предполагал, была android.R.style.Theme, но не должна была быть, установка theme = 0 сделала свое дело.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню