【问题标题】:IllegalArgument when clicking my map fragment twice两次单击我的地图片段时出现 IllegalArgument
【发布时间】:2014-05-31 18:02:58
【问题描述】:

当我单击包含地图的片段的按钮时,地图会显示。当我再次单击它或单击另一个片段按钮,然后再次单击包含地图的片段的按钮时,我的应用程序强制退出,我在 LogCat 中得到了这个解释:

致命异常:main
android.view.InflateException:BINARY XML 文件第 8 行:膨胀类片段时出错

...
原因:java .lang.IllegalArgumentException: Binary XML file line: #8: Duplicate id 0x7f070053, tag null, or parent id 0xffffffff with another fragment for com.google.android.gms.maps.MapFragment

怎么办?我猜这可能与片段事务管理器有关,但我真的不知道?

Fragment01.xml

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


<fragment
      android:id="@+id/map"
      android:layout_width="match_parent"
      android:layout_height="match_parent"
      android:name="com.google.android.gms.maps.MapFragment"/>


</LinearLayout>

Fragment01.java

public class Fragment01 extends Fragment {
MapView mapView;
GoogleMap map;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.fragment_01, container, false);
return v;
}

@Override
public void onDestroy()
{
    Fragment fragment = (getFragmentManager().findFragmentById(R.id.map));  
   FragmentTransaction ft = getActivity().getSupportFragmentManager().beginTransaction();
   ft.remove(fragment);
   ft.commit();
}

@Override
public void super.onDestroyView()
{
    Fragment fragment = (getFragmentManager().findFragmentById(R.id.map));  
   FragmentTransaction ft =     getActivity().getSupportFragmentManager().beginTransaction();
   ft.remove(fragment);
   ft.commit();
}

@Override
public void onDestroyView()
{
    Fragment fragment = (getFragmentManager().findFragmentById(R.id.map));  
   FragmentTransaction ft = getActivity().getSupportFragmentManager().beginTransaction();
   ft.remove(fragment);
   ft.commit();
}
}

MainActivity.java

public class MainActivity extends FragmentActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    FragmentManager fm = getSupportFragmentManager();
    FragmentTransaction transaction = fm.beginTransaction();
    StartFragment startfragment = new StartFragment();

    transaction.add(R.id.fragment_placeholder, startfragment);
    transaction.commit();
}

public void onSelectFragment(View view){

    Fragment newFragment;

    if (view == findViewById(R.id.btnomforetaget)) {
        newFragment = new StartFragment();
    } else if (view == findViewById(R.id.btnhittahit)) {
        newFragment = new Fragment01();
    } else if (view == findViewById(R.id.btnhemsida)) {
        newFragment = new Fragment02();
    } else {
        newFragment = new StartFragment();
    }


    FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
    transaction.replace(R.id.fragment_placeholder, newFragment);
    transaction.addToBackStack(null);
    transaction.commit();
}
}

【问题讨论】:

    标签: android android-fragments android-maps-v2


    【解决方案1】:

    问题是您一次又一次地使用同一张地图 (Duplicate id 0x7f070053) 并没有在您更改片段后首先销毁它。

    解决方案:

           public class Fragment01 extends Fragment {
    MapView mapView;
    GoogleMap map;
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View v = inflater.inflate(R.layout.fragment_01, container, false);
    return v;
    }
    
    @Override
    public void onDestroyView()
    {
       super.onDestroyView();
        Fragment fragment = (getFragmentManager().findFragmentById(R.id.map));  
       FragmentTransaction ft =     getActivity().getSupportFragmentManager().beginTransaction();
       ft.remove(fragment);
       ft.commit();
    }
    
    }
    

    替换片段时会破坏地图

    【讨论】:

    • 我修改了你的代码,使它看起来像这样Fragment fragment = (getSupportFragmentManager().findFragmentById(R.id.map)); FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); transaction.replace(R.id.fragment_placeholder, newFragment); transaction.addToBackStack(null); transaction.remove(fragment); transaction.commit(); 但现在我在 android.support.v4.app.BackStackRecord.java(651) 和其他一些地方得到了 java.langNullPointerException ?
    • @Sebbenator 对不起,你把它放在片段的 onDestroy 方法中了吗?
    • 不,我把它放在MainActivity中。我应该把它放在一个 onDestroy 方法的 MainActivity 中吗?还是我应该把它放在 Fragment01 中?
    • @Sebbenator try 而不是 onDestroy 将其更改为 onDestroyView 如果它无法从日志猫发布所有异常
    • @Sebbenator 那是因为您将 super.onDestroyView 作为名称.. 法律.. 再次编辑
    【解决方案2】:

    使用以下代码。它对我有用

    private static View view;
    
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    if (view != null) {
        ViewGroup parent = (ViewGroup) view.getParent();
        if (parent != null)
            parent.removeView(view);
    }
    try {
        view = inflater.inflate(R.layout.map, container, false);
    } catch (InflateException e) {
        /* map is already there, just return view as it is */
    }
    return view;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-28
      相关资源
      最近更新 更多