DialogFragment不是浮动的,嵌入行为或作为另一个片段 [英] DialogFragment not floating, acts embeded or as another fragment

查看:90
本文介绍了DialogFragment不是浮动的,嵌入行为或作为另一个片段的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有这个应用程序,为此我创建了一个自定义对话框.当对话框上的.show调用确实将其启动时,我必须弄错一些原因,它看起来像是一个全新的片段,它不是浮动的,而是用其内容替换了ui.我确实在他们的DialogFragment帮助中看到了

I have this app, that I created a custom dialog for. I must of goofed something up cause while the .show call on the dialog does indeed bring it up, it looks like a whole new fragment and it is not floating but instead replacing the ui with its contents. I did see in their help for DialogFragment:

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

可以将对话框作为常规片段嵌入或不嵌入.尽管我没有做任何事情来做到这一点,所以我无法弄清为什么它的行为就像一个嵌入式片段而不是浮动的.经过考虑,这是我定义XML定义的方式吗?上面的dialogfragment示例并没有真正提供xml布局的定义,所以也许这就是我的问题所在?(甚至将引力添加到xml文件中,仍然没有骰子)

that one can embed a dialog as a regular fragment or not. Though I am not doing anything to do this so I cannot figure out why its acting like an embedded fragment and not floating. After thinking on it, is it the way I defined my XML definition? The dialogfragment example above didn't really give a definition for the xml layout, so maybe that is where my issue is? (Even added the gravity to the xml file, still no dice)

此对话框的xml定义在这里:

My xml definition for this Dialog is here:

<?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>

就像我说的那样,显示该片段的代码就可以了:

Like I said displays just fine, the code for the fragment:

        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,并且它们工作正常,但是我从另一个片段中调用的代码是:

It is called from a fragment itself? though does that matter? because I am calling a TimePIckerDialog and a DatePickerDialog and those work fine, but my calling code from my other fragment is:

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");                  
}

推荐答案

您的构造函数有误.尝试仅使用一种 static 方法 newInstance 实例化所有情况下的片段,并使用 Bundle 存储要在其中使用的参数.片段.请参考基本对话框部分此处并进行扩展视您的情况而定.

Your constructors are wrong. Try to have just one static method newInstance to instantiate the fragment for all cases and use a Bundle to store the arguments that you want to use in the fragment. Refer to Basic Dialog section here and extend it to your case.

这篇关于DialogFragment不是浮动的,嵌入行为或作为另一个片段的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆