自定义片段无法转换为其他自定义片段

时间:2012-06-10 13:34:39

标签: android android-fragments

我尝试简单地用另一个自定义片段替换一个自定义片段。第一个自定义片段称为MenuFragment并扩展ListFragment。创建活动时(onCreate)我将它插入到我用XML定义的布局(称为layout_container)中:

FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
MenuFragment menufragment = new MenuFragment(); 
fragmentTransaction.add(R.id.layout_container, menufragment);
fragmentTransaction.commit();

在这里,我没有问题。

然后,当用户点击某些内容时,我想用名为AlbumsFragment的第二个片段(也扩展ListFragment)替换它。在我的onClick事件中,我把:

AlbumsFragment albumsfragment = new AlbumsFragment(); 
FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
fragmentTransaction.replace(R.id.layout_container, albumsfragment);
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();

这里新片段很好地显示并取代了菜单片段,但同时应用程序崩溃并且LogCat说:

 E/AndroidRuntime(25105): java.lang.ClassCastException: com.music.musicapp.AlbumsFragment cannot be cast to com.music.musicapp.MenuFragment

我只使用并定位Api等级15,因此我不使用Android支持包。

编辑: 这是我的Album片段代码,非常简单,它只是一个包含两个项目“Album1”和“Album2”的列表。点击完成后,我可以看到这两个项目,但是即时应用程序崩溃了。

package com.music.musicapp;

import java.util.ArrayList;

import android.app.ListFragment;
import android.os.Bundle;
import android.widget.ArrayAdapter;

public class AlbumsFragment extends ListFragment {

            // declare the array list
             ArrayList<String> array = new ArrayList<String>();

             @Override
                public void onActivityCreated(Bundle savedInstanceState) {
                    super.onActivityCreated(savedInstanceState);


                // Fill up Array 
                    array.add("album1");
                    array.add("album2");

                    setListAdapter(new ArrayAdapter<String>(getActivity(),
                            android.R.layout.simple_list_item_1, array));


                 }   

}

1 个答案:

答案 0 :(得分:1)

问题解决了,

我有另一个需要MenuFragment的方法,因此,当这个片段被AlbumsFragment替换时,这个方法会让应用程序崩溃,因为它引用了一个不存在的片段。

所以问题不在发布的代码中,抱歉。重要的是要考虑替换片段的影响,并在引用它时要小心(检查它是否仍在UI上或者是否已经发送到后栈等等。)

感谢您的回答并抱歉没有看到我的问题不存在(但是当项目变得复杂时,很难总是看到问题出现的地方:/)。