应用程序由“后退”崩溃来映射片段 [英] App crash by "back" to maps fragment

查看:96
本文介绍了应用程序由“后退”崩溃来映射片段的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述



当我打开应用程序时,在菜单中点击另一个片段(2, 3或4),然后按下应用程序崩溃的后退按钮。当我启动应用程序并点击 2> 3> 4 (以此顺序),然​​后按下后退按钮,我会回到 3> 2>碰撞。当我回到包含谷歌地图的mainFragment时,应用程序崩溃。



我认为我的问题与该片段中的googlemap有关(要浏览的片段回到),因为当我设置2在该视图的xml中的错误行之前输入并再次运行时,错误行号是+2。当我注释掉这个片段时,后退按钮可以正常工作。



通过导航到一个新的片段,我打电话给:

  fragmentTransaction.replace(R.id.fr_content_container,new NewsFragment())。addToBackStack(null).commit(); 

我得到的错误是

<$ p $ E / AndroidRuntime:FATAL EXCEPTION:main
过程:aaeu.app,PID:19054
android。 view.InflateException:二进制XML文件行#7:二进制XML文件行#7:在android.view中android.view.LayoutInflater.inflate(LayoutInflater.java:539)
处扩展类片段
时出错。 LayoutInflater.inflate(LayoutInflater.java:423)
at aaeu.app.presentationlayer.tab_AlertMapsOverview.onCreateView(mapsFragment.java:52)
............... ......

mapsFragment的XML是:

 <?xml version =1.0encoding =utf-8?> 
< RelativeLayout xmlns:android =http://schemas.android.com/apk/res/android
android:layout_width =fill_parent
android:layout_height =fill_parent >

片段
android:layout_width =match_parent
android:layout_height =match_parent
android:layout_weight =2
android: name =com.google.android.gms.maps.SupportMapFragment
android:id =@ + id / mapwhere/>
< / RelativeLayout>

地图片段的代码是:

  private SupportMapFragment mMapFragment; 
私人AlertManager mAlertManager;
私人GoogleMap mGoogleMap;
HashMap<标记,警报> mMarkerMap;

@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
mAlertManager = new AlertManager(getContext());

$ b @Override
public View onCreateView(LayoutInflater inflater,ViewGroup container,
Bundled savedInstanceState){
View view = inflater.inflate(R。 layout.overview_maps_alert_tab,container,false);
ButterKnife.bind(this,view);

loadMap();

返回视图;


private void loadMap(){
mMapFragment =(SupportMapFragment)getChildFragmentManager()。findFragmentById(R.id.mapwhere);
if(mMapFragment == null){
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
mMapFragment = SupportMapFragment.newInstance();
fragmentTransaction.replace(R.id.mapwhere,mMapFragment).commit();


if(mMapFragment!= null){
mMapFragment.getMapAsync(new OnMapReadyCallback(){
@Override
public void onMapReady(GoogleMap googleMap ){
if(googleMap!= null){
googleMap.getUiSettings()。setAllGesturesEnabled(true);

LatLng marker_latlng = new LatLng(55.042684,14.125549);

CameraPosition cameraPosition = new CameraPosition.Builder()。target(marker_latlng).zoom(3.0f).build();
CameraUpdate cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition);
googleMap .moveCamera(cameraUpdate);

setGoogleMap(googleMap);
}
}
});



private void setGoogleMap(GoogleMap googleMap){
this.mGoogleMap = googleMap;
}


//此方法由下载警报的asynctask调用
@Override
public void UpdateAlerts(List< Alert> alerts) {

mMarkerMap = new HashMap< Marker,Alert>();
尝试{
for(Alert alert:alerts){
MarkerOptions marker = new MarkerOptions();
marker.position(alert.Location.get(0));
marker.title(alert.GetFullName());

标记m = mGoogleMap.addMarker(marker);
mMarkerMap.put(m,alert);


$ b m GoogleMap.setOnMarkerClickListener(
new GoogleMap.OnMarkerClickListener(){
@Override
public boolean onMarkerClick(Marker marker){
startDetailView(marker);
return false;
}
}
);
}
catch(NullPointerException e)
{
Log.i(tab_AlertMapsOverview,没有任何错误创建标记或设置clicklisteners on。是否有配置区域中的错误?);


$ / code $ / pre

$ hr

在这个问题附近,我也有一个小问题。当我有3个片段,1,2和3.当我(例如)从活动1开始并导航到2> 3> 2> 3时,我需要推回4次回到1中。是否可以使用一种用于后向导航的树系统。所以我总是去1级?也许这清理了我的意思。




我认为目前的情况还没有达到最佳,因为碎片在RAM中仍然有效?或者我错了?

解决方案

我也有同样的问题。在浪费了大量时间寻找解决方案之后,我终于做了什么,我从xml中移除了片段标签。把一个FrameLayout放在那里,每当我想添加这个片段时,我会用片段事务添加它。这对我来说是成功的。



导致问题的原因是,无论何时调用该片段的onCreateView(),xml文件都将被充满,这将膨胀片段。这将导致使用相同ID的多个片段导致此异常。


I working on my first app and got problems with the "back" function.

When i open the app an click in the menu to another fragment (2,3 or 4) and i push the back button the app crashes. When i start the app and click 2 > 3 > 4 (in this order) in the menu and push the back button i go back to 3 > 2 > crash. The app crashes when i go back to the mainFragment which contains a google map.

I think my problem has something to do with the googlemap in this fragment (the fragment to navigate back to) because when i set 2 enters before the error line in the xml of that view and run again, the error line number is +2. and when i comment out this fragment the back button works fine.

By navigate to an new fragment i call:

fragmentTransaction.replace(R.id.fr_content_container, new NewsFragment()).addToBackStack(null).commit();

The error i get is

04-01 14:26:39.679 19054-19054/aaeu.app E/AndroidRuntime: FATAL EXCEPTION: main
                                                          Process: aaeu.app, PID: 19054
                                                          android.view.InflateException: Binary XML file line #7: Binary XML file line #7: Error inflating class fragment
                                                              at android.view.LayoutInflater.inflate(LayoutInflater.java:539)
                                                              at android.view.LayoutInflater.inflate(LayoutInflater.java:423)
                                                              at aaeu.app.presentationlayer.tab_AlertMapsOverview.onCreateView(mapsFragment.java:52)
                                                          .....................

The XML of the mapsFragment is:

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent" >

        <fragment
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_weight="2"
            android:name="com.google.android.gms.maps.SupportMapFragment"
            android:id="@+id/mapwhere" />
    </RelativeLayout>

The code of the map fragment is:

    private SupportMapFragment mMapFragment;
    private AlertManager mAlertManager;
    private GoogleMap mGoogleMap;
    HashMap<Marker, Alert> mMarkerMap;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mAlertManager = new AlertManager(getContext());
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.overview_maps_alert_tab, container, false);
        ButterKnife.bind(this, view);

        loadMap();

        return view;
    }

    private void loadMap() {
        mMapFragment = (SupportMapFragment) getChildFragmentManager().findFragmentById(R.id.mapwhere);
        if (mMapFragment == null) {
            FragmentManager fragmentManager = getFragmentManager();
            FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
            mMapFragment = SupportMapFragment.newInstance();
            fragmentTransaction.replace(R.id.mapwhere, mMapFragment).commit();
        }

        if (mMapFragment != null) {
            mMapFragment.getMapAsync(new OnMapReadyCallback() {
                @Override
                public void onMapReady(GoogleMap googleMap) {
                    if (googleMap != null) {
                        googleMap.getUiSettings().setAllGesturesEnabled(true);

                        LatLng marker_latlng = new LatLng(55.042684, 14.125549);

                        CameraPosition cameraPosition = new CameraPosition.Builder().target(marker_latlng).zoom(3.0f).build();
                        CameraUpdate cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition);
                        googleMap.moveCamera(cameraUpdate);

                        setGoogleMap(googleMap);
                    }
                }
            });
        }
    }

    private void setGoogleMap(GoogleMap googleMap) {
        this.mGoogleMap = googleMap;
    }


    // This method is called by the asynctask who downloads the alerts
    @Override
    public void UpdateAlerts(List<Alert> alerts) {

        mMarkerMap = new HashMap<Marker, Alert>();
        try {
        for (Alert alert : alerts) {
            MarkerOptions marker = new MarkerOptions();
            marker.position(alert.Location.get(0));
            marker.title(alert.GetFullName());

            Marker m = mGoogleMap.addMarker(marker);
            mMarkerMap.put(m, alert);
        }


            mGoogleMap.setOnMarkerClickListener(
                    new GoogleMap.OnMarkerClickListener() {
                        @Override
                        public boolean onMarkerClick(Marker marker) {
                            startDetailView(marker);
                            return false;
                        }
                    }
            );
        }
        catch (NullPointerException e)
        {
            Log.i("tab_AlertMapsOverview","No missings to create markers for or set clicklisteners on. Are there missings in the configured Areas?");
        }
    }


Near this problem i have a little question too. When i have 3 fragments, 1, 2 and 3. When i (for example) start in activity 1 and navigate to 2 > 3 > 2 > 3 i need to push 4 times back to come back in 1. Is it posible to use a kind of "tree" system for back navigation. so i allways go up 1 level? Maybe this clears up what i mean.

I think also the current situation is far from optimal becouse the fragments are still active in RAM? or are i'am wrong?

解决方案

I too had the same Issue. After wasting a lot of time searching for the solution, what i finally did was, I removed fragment tag from xml. Put a FrameLayout there and whenever I want to add that fragment, I would add it with fragment transaction. That worked out for me.

The cause for the issue is, whenever onCreateView() for that fragment is called, the xml file will be inflated which will inflate the fragment. This will lead to multiple fragments with the same id which causes this exception.

这篇关于应用程序由“后退”崩溃来映射片段的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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