在DialogFragment配售SupportMapFragment [英] Placing SupportMapFragment on DialogFragment
问题描述
我想补充SupportMapFragment上DialogFragment,但它返回错误充气类片段
。我无法弄清楚,为什么它返回错误充气类片段
。我想我使用的方法是正确的。我需要从DialogFragment延伸,因为我想显示对话框地图。
有人能帮助我吗?
感谢。
下面是我的DialogFragment:
进口android.support.v4.app.DialogFragment;进口android.os.Bundle;
进口android.view.View;
进口android.view.ViewGroup;
进口android.view.LayoutInflater;/ *对于窗口小部件* /
进口android.widget.TextView;
进口android.widget.ImageView;
进口android.widget.Button;/ *图像下载档案库* /
进口com.squareup.picasso.Picasso;/ *对于字符串格式化器* /
进口com.yai.app.math.support.StringFormater;/ *对于对象* /
进口com.yai.app.object.support.Property;
进口com.yai.app.object.support.User;/ *对于中* /
进口android.content.Context;进口com.google.android.gms.maps.CameraUpdateFactory;/ *对于地图* /
进口com.google.android.gms.maps.GoogleMap;
进口com.google.android.gms.maps.SupportMapFragment;
进口com.google.android.gms.maps.model.CameraPosition;
进口com.google.android.gms.maps.model.Marker;
进口com.google.android.gms.maps.model.MarkerOptions;公共类DialogFragmentReadAdvertisement扩展DialogFragment {
私有财产propertyData;
私人用户用户数据;
私人语境contextData; 私人GoogleMap的mapDetail; @覆盖
公共无效的onCreate(捆绑savedInstanceState){
super.onCreate(savedInstanceState); propertyData = MainActivity.activeProperty;
用户数据= MainActivity.activeUser;
contextData = App.getContext();
} @覆盖
公共查看onCreateView(LayoutInflater充气器,容器的ViewGroup,捆绑savedInstanceState){
查看查看= inflater.inflate(R.layout.dialog_fragment_read_advertisement,集装箱,FALSE); mapDetail =((SupportMapFragment)getFragmentManager()。findFragmentById(R.id.map_data))
.getMap(); mapDetail.addMarker(
新的MarkerOptions()位置(propertyData.getLocation())
); CameraPosition cameraPosition =新CameraPosition.Builder()
.TARGET(propertyData.getLocation())
.zoom(19)
.tilt(0)
.bearing(0)
。建立(); mapDetail.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition)); 返回视图。
}
}
下面是我的XML布局:
<?XML版本=1.0编码=UTF-8&GT?;
<滚动型的xmlns:机器人=http://schemas.android.com/apk/res/android
机器人:layout_width =match_parent
机器人:layout_height =match_parent
机器人:方向=垂直> <! - 了滚动一种观点 - >
<的LinearLayout
机器人:layout_width =match_parent
机器人:layout_height =WRAP_CONTENT
机器人:方向=垂直> <! - 13号线波纹管 - >
<片段
机器人:ID =@ + ID / map_data
机器人:layout_width =match_parent
机器人:layout_height =match_parent
类=com.google.android.gms.maps.SupportMapFragment/> < / LinearLayout中>
< /滚动型>
下面是我的LogCat中:
16 07-14:28:46.291:E / AndroidRuntime(28121):致命异常:主要
07-14 16:28:46.291:E / AndroidRuntime(28121):android.view.InflateException:二进制XML文件行#13:错误充气类片段
07-14 16:28:46.291:E / AndroidRuntime(28121):在android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:704)
07-14 16:28:46.291:E / AndroidRuntime(28121):在android.view.LayoutInflater.rInflate(LayoutInflater.java:746)
07-14 16:28:46.291:E / AndroidRuntime(28121):在android.view.LayoutInflater.rInflate(LayoutInflater.java:749)
07-14 16:28:46.291:E / AndroidRuntime(28121):在android.view.LayoutInflater.inflate(LayoutInflater.java:489)
07-14 16:28:46.291:E / AndroidRuntime(28121):在android.view.LayoutInflater.inflate(LayoutInflater.java:396)
07-14 16:28:46.291:E / AndroidRuntime(28121):在com.yai.properti.tujuh.tujuh.tujuh.DialogFragmentReadAdvertisement.onCreateView(DialogFragmentReadAdvertisement.java:55)
07-14 16:28:46.291:E / AndroidRuntime(28121):在android.support.v4.app.Fragment.performCreateView(Fragment.java:1500)
07-14 16:28:46.291:E / AndroidRuntime(28121):在android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:927)
07-14 16:28:46.291:E / AndroidRuntime(28121):在android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1082)
07-14 16:28:46.291:E / AndroidRuntime(28121):在android.support.v4.app.FragmentActivity.onCreateView(FragmentActivity.java:310)
07-14 16:28:46.291:E / AndroidRuntime(28121):在android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:676)
07-14 16:28:46.291:E / AndroidRuntime(28121):在android.view.LayoutInflater.rInflate(LayoutInflater.java:746)
07-14 16:28:46.291:E / AndroidRuntime(28121):在android.view.LayoutInflater.rInflate(LayoutInflater.java:749)
07-14 16:28:46.291:E / AndroidRuntime(28121):在android.view.LayoutInflater.inflate(LayoutInflater.java:489)
07-14 16:28:46.291:E / AndroidRuntime(28121):在android.view.LayoutInflater.inflate(LayoutInflater.java:396)
07-14 16:28:46.291:E / AndroidRuntime(28121):在com.yai.properti.tujuh.tujuh.tujuh.DialogFragmentReadAdvertisement.onCreateView(DialogFragmentReadAdvertisement.java:55)
07-14 16:28:46.291:E / AndroidRuntime(28121):在android.support.v4.app.Fragment.performCreateView(Fragment.java:1500)
07-14 16:28:46.291:E / AndroidRuntime(28121):在android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:927)
07-14 16:28:46.291:E / AndroidRuntime(28121):在android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1104)
07-14 16:28:46.291:E / AndroidRuntime(28121):在android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682)
07-14 16:28:46.291:E / AndroidRuntime(28121):在android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1467)
07-14 16:28:46.291:E / AndroidRuntime(28121):在android.support.v4.app.FragmentManagerImpl $ 1.run(FragmentManager.java:440)
07-14 16:28:46.291:E / AndroidRuntime(28121):在android.os.Handler.handleCallback(Handler.java:615)
07-14 16:28:46.291:E / AndroidRuntime(28121):在android.os.Handler.dispatchMessage(Handler.java:92)
07-14 16:28:46.291:E / AndroidRuntime(28121):在android.os.Looper.loop(Looper.java:137)
07-14 16:28:46.291:E / AndroidRuntime(28121):在android.app.ActivityThread.main(ActivityThread.java:4895)
07-14 16:28:46.291:E / AndroidRuntime(28121):在java.lang.reflect.Method.invokeNative(本机方法)
07-14 16:28:46.291:E / AndroidRuntime(28121):在java.lang.reflect.Method.invoke(Method.java:511)
07-14 16:28:46.291:E / AndroidRuntime(28121):在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:994)
07-14 16:28:46.291:E / AndroidRuntime(28121):在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:761)
07-14 16:28:46.291:E / AndroidRuntime(28121):在dalvik.system.NativeStart.main(本机方法)
07-14 16:28:46.291:E / AndroidRuntime(28121):java.lang.IllegalArgumentException异常:二进制XML文件行#13:由造成重复ID 0x7f05009e,标记为空,或父母ID为0x0与com.google另一片段.android.gms.maps.SupportMapFragment
07-14 16:28:46.291:E / AndroidRuntime(28121):在android.support.v4.app.FragmentActivity.onCreateView(FragmentActivity.java:296)
07-14 16:28:46.291:E / AndroidRuntime(28121):在android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:676)
07-14 16:28:46.291:E / AndroidRuntime(28121):30 ...更多
在情况下别人一起类似的问题来... ...
要回答你原来的问题,InflateException(错误充气类片段的)发生,因为嵌套的片段 - 也就是一个DialogFragment里面你SupportMapFragment - 不能从静态XML布局充气
请参阅从开发文档本说明:
注意:你不能夸大布局成一个片段时,该布局包括
<片断>
结果嵌套的片段而已。当添加到编程片段支持。
块引用>结果
所以,你的layout.xml应该包含一个<的FrameLayout ... />
为您SupportMapFragment而不是明确<片段... /方式>
,那么你只通过code与布局通胀添加地图片段和自的 嵌套片段 的必须通过从的 getChildFragmentManager(),
你要改变现有的 getFragmentManager()呼叫
以编程方式添加地图片段设置您的FragmentTransaction时(不要忘记承诺!)。对于一个很好的例子,再来看看在
R.layout.mapdialog
XML例子,相关处理在second SO链接
您最初包含在你的问题。I'm trying to add SupportMapFragment on DialogFragment, but it return
error inflating class fragment
. I cannot figure it out why its returnederror inflating class fragment
. I think the method I use is correct. I need to extends from DialogFragment because i want show map in dialog.I have followed this answer, and this answer too, and no one can solve my problem.
Somebody could help me?
Thanks.
Here is my DialogFragment :
import android.support.v4.app.DialogFragment; import android.os.Bundle; import android.view.View; import android.view.ViewGroup; import android.view.LayoutInflater; /* For widget */ import android.widget.TextView; import android.widget.ImageView; import android.widget.Button; /* Image Downloader Library */ import com.squareup.picasso.Picasso; /* For string formater */ import com.yai.app.math.support.StringFormater; /* For object */ import com.yai.app.object.support.Property; import com.yai.app.object.support.User; /* For context */ import android.content.Context; import com.google.android.gms.maps.CameraUpdateFactory; /* For map */ import com.google.android.gms.maps.GoogleMap; import com.google.android.gms.maps.SupportMapFragment; import com.google.android.gms.maps.model.CameraPosition; import com.google.android.gms.maps.model.Marker; import com.google.android.gms.maps.model.MarkerOptions; public class DialogFragmentReadAdvertisement extends DialogFragment{ private Property propertyData; private User userData; private Context contextData; private GoogleMap mapDetail; @Override public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); propertyData = MainActivity.activeProperty; userData = MainActivity.activeUser; contextData = App.getContext(); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){ View view = inflater.inflate(R.layout.dialog_fragment_read_advertisement, container, false); mapDetail = ((SupportMapFragment) getFragmentManager().findFragmentById(R.id.map_data)) .getMap(); mapDetail.addMarker( new MarkerOptions().position(propertyData.getLocation()) ); CameraPosition cameraPosition = new CameraPosition.Builder() .target(propertyData.getLocation()) .zoom(19) .tilt(0) .bearing(0) .build(); mapDetail.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition)); return view; } }
Here is my xml layout :
<?xml version="1.0" encoding="utf-8"?> <ScrollView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <!-- One view for ScrollView --> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <!-- Line 13 bellow --> <fragment android:id="@+id/map_data" android:layout_width="match_parent" android:layout_height="match_parent" class="com.google.android.gms.maps.SupportMapFragment"/> </LinearLayout> </ScrollView>
Here is my LogCat :
07-14 16:28:46.291: E/AndroidRuntime(28121): FATAL EXCEPTION: main 07-14 16:28:46.291: E/AndroidRuntime(28121): android.view.InflateException: Binary XML file line #13: Error inflating class fragment 07-14 16:28:46.291: E/AndroidRuntime(28121): at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:704) 07-14 16:28:46.291: E/AndroidRuntime(28121): at android.view.LayoutInflater.rInflate(LayoutInflater.java:746) 07-14 16:28:46.291: E/AndroidRuntime(28121): at android.view.LayoutInflater.rInflate(LayoutInflater.java:749) 07-14 16:28:46.291: E/AndroidRuntime(28121): at android.view.LayoutInflater.inflate(LayoutInflater.java:489) 07-14 16:28:46.291: E/AndroidRuntime(28121): at android.view.LayoutInflater.inflate(LayoutInflater.java:396) 07-14 16:28:46.291: E/AndroidRuntime(28121): at com.yai.properti.tujuh.tujuh.tujuh.DialogFragmentReadAdvertisement.onCreateView(DialogFragmentReadAdvertisement.java:55) 07-14 16:28:46.291: E/AndroidRuntime(28121): at android.support.v4.app.Fragment.performCreateView(Fragment.java:1500) 07-14 16:28:46.291: E/AndroidRuntime(28121): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:927) 07-14 16:28:46.291: E/AndroidRuntime(28121): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1082) 07-14 16:28:46.291: E/AndroidRuntime(28121): at android.support.v4.app.FragmentActivity.onCreateView(FragmentActivity.java:310) 07-14 16:28:46.291: E/AndroidRuntime(28121): at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:676) 07-14 16:28:46.291: E/AndroidRuntime(28121): at android.view.LayoutInflater.rInflate(LayoutInflater.java:746) 07-14 16:28:46.291: E/AndroidRuntime(28121): at android.view.LayoutInflater.rInflate(LayoutInflater.java:749) 07-14 16:28:46.291: E/AndroidRuntime(28121): at android.view.LayoutInflater.inflate(LayoutInflater.java:489) 07-14 16:28:46.291: E/AndroidRuntime(28121): at android.view.LayoutInflater.inflate(LayoutInflater.java:396) 07-14 16:28:46.291: E/AndroidRuntime(28121): at com.yai.properti.tujuh.tujuh.tujuh.DialogFragmentReadAdvertisement.onCreateView(DialogFragmentReadAdvertisement.java:55) 07-14 16:28:46.291: E/AndroidRuntime(28121): at android.support.v4.app.Fragment.performCreateView(Fragment.java:1500) 07-14 16:28:46.291: E/AndroidRuntime(28121): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:927) 07-14 16:28:46.291: E/AndroidRuntime(28121): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1104) 07-14 16:28:46.291: E/AndroidRuntime(28121): at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682) 07-14 16:28:46.291: E/AndroidRuntime(28121): at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1467) 07-14 16:28:46.291: E/AndroidRuntime(28121): at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:440) 07-14 16:28:46.291: E/AndroidRuntime(28121): at android.os.Handler.handleCallback(Handler.java:615) 07-14 16:28:46.291: E/AndroidRuntime(28121): at android.os.Handler.dispatchMessage(Handler.java:92) 07-14 16:28:46.291: E/AndroidRuntime(28121): at android.os.Looper.loop(Looper.java:137) 07-14 16:28:46.291: E/AndroidRuntime(28121): at android.app.ActivityThread.main(ActivityThread.java:4895) 07-14 16:28:46.291: E/AndroidRuntime(28121): at java.lang.reflect.Method.invokeNative(Native Method) 07-14 16:28:46.291: E/AndroidRuntime(28121): at java.lang.reflect.Method.invoke(Method.java:511) 07-14 16:28:46.291: E/AndroidRuntime(28121): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:994) 07-14 16:28:46.291: E/AndroidRuntime(28121): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:761) 07-14 16:28:46.291: E/AndroidRuntime(28121): at dalvik.system.NativeStart.main(Native Method) 07-14 16:28:46.291: E/AndroidRuntime(28121): Caused by: java.lang.IllegalArgumentException: Binary XML file line #13: Duplicate id 0x7f05009e, tag null, or parent id 0x0 with another fragment for com.google.android.gms.maps.SupportMapFragment 07-14 16:28:46.291: E/AndroidRuntime(28121): at android.support.v4.app.FragmentActivity.onCreateView(FragmentActivity.java:296) 07-14 16:28:46.291: E/AndroidRuntime(28121): at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:676) 07-14 16:28:46.291: E/AndroidRuntime(28121): ... 30 more
解决方案In case someone else comes along with a similar issue...
To answer your original question, the InflateException (Error inflating class fragment) has occurred because nested fragments - i.e., your SupportMapFragment inside a DialogFragment - may not be inflated from static XML layouts.
See this note from the developer docs:
Note: You cannot inflate a layout into a fragment when that layout includes a
<fragment>
.
Nested fragments are only supported when added to a fragment programmatically.
So your layout.xml should contain a<FrameLayout.../>
for your SupportMapFragment instead of the explicit<fragment.../>
, then you'll just add the map fragment via code versus layout inflation.And since nested fragments must be managed via a FragmentManager from getChildFragmentManager(), you'll want to change the existing getFragmentManager() call when setting up your FragmentTransaction for adding the map fragment programmatically (don't forget to commit!).
For a great example, take another look at the
R.layout.mapdialog
XML example and associated handling shown in the second SO link you originally included in your question.这篇关于在DialogFragment配售SupportMapFragment的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!