片段替换/添加导致IllegalStateException

时间:2014-05-01 19:50:58

标签: java android android-fragments illegalstateexception

所以我最近开始使用片段并试图了解一切是如何工作的。我把它放在一起,但我的应用程序一直在崩溃。任何有关正在发生的事情的提示都将受到高度赞赏,同时也解释为什么它也会很棒。我试图在一个片段中加载一个youtube视频,该片段加载在一个由listview适配器传递给我的视图中。这是我的设置:

我为youtube视频设置了一个片段:

public class PlayerYouTubeFrag extends YouTubePlayerSupportFragment {

private String currentVideoID = "Adp1TUDRNtc";
private YouTubePlayer activePlayer;

public static PlayerYouTubeFrag newInstance(String url) {

PlayerYouTubeFrag playerYouTubeFrag = new PlayerYouTubeFrag();

    Bundle bundle = new Bundle();
    bundle.putString("url", url);

    playerYouTubeFrag.setArguments(bundle);

    return playerYouTubeFrag;
}

private void init() {

    initialize("AIzaSyCQxLWF1j0XFwKmros9w4Y5XSk1hqpEg6Q", new OnInitializedListener() {

        @Override
        public void onInitializationFailure(Provider arg0, YouTubeInitializationResult arg1) { }

        @Override
        public void onInitializationSuccess(YouTubePlayer.Provider provider, YouTubePlayer player, boolean wasRestored) {
            activePlayer = player;
            activePlayer.setPlayerStyle(YouTubePlayer.PlayerStyle.DEFAULT);
            if (!wasRestored) {
                activePlayer.loadVideo(getArguments().getString("url"), 0);

            }
        }
    });
}
}

现在我还有一个设置片段和交换的类:

 public class Youtube extends FragmentActivity{
 public static final String API_KEY = "MyKey";
 public static final String VIDEO_ID = "videoID";
 public  YouTubePlayerView youTubePlayerView;

 public Youtube(View view) {

     //issue here!!!
     PlayerYouTubeFrag myFragment = PlayerYouTubeFrag.newInstance("Adp1TUDRNtc");
    getSupportFragmentManager().beginTransaction().replace(view.findViewById(R.id.placeholder).getId(), myFragment).commit();
 }

最后但并非最不重要的是我的xml:

   <FrameLayout
   android:id="@+id/placeholder"
   android:layout_height="match_parent"
    android:layout_width="match_parent">
  </FrameLayout>

logcat:

05-01 15:40:42.439: E/AndroidRuntime(24550): FATAL EXCEPTION: main
05-01 15:40:42.439: E/AndroidRuntime(24550): Process: com.elmehalawi.hamra, PID: 24550
05-01 15:40:42.439: E/AndroidRuntime(24550): java.lang.IllegalStateException: Activity has been destroyed
05-01 15:40:42.439: E/AndroidRuntime(24550):    at android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1365)
05-01 15:40:42.439: E/AndroidRuntime(24550):    at and roid.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:595)
05-01 15:40:42.439: E/AndroidRuntime(24550):    at android.support.v4.app.BackStackRecord.commit(BackStackRecord.java:574)
05-01 15:40:42.439: E/AndroidRuntime(24550):    at com.elmehalawi.hamra.cards.Youtube.<init>(Youtube.java:31)
05-01 15:40:42.439: E/AndroidRuntime(24550):    at com.elmehalawi.hamra.cards.YoutubeCard.setupInnerViewElements(YoutubeCard.java:23)
05-01 15:40:42.439: E/AndroidRuntime(24550):    at it.gmariotti.cardslib.library.internal.Card.getInnerView(Card.java:250)
05-01 15:40:42.439: E/AndroidRuntime(24550):    at it.gmariotti.cardslib.library.view.CardView.setupMainView(CardView.java:364)
05-01 15:40:42.439: E/AndroidRuntime(24550):    at it.gmariotti.cardslib.library.view.CardView.buildUI(CardView.java:270)
05-01 15:40:42.439: E/AndroidRuntime(24550):    at it.gmariotti.cardslib.library.view.CardView.setCard(CardView.java:230)
05-01 15:40:42.439: E/AndroidRuntime(24550):    at com.elmehalawi.hamra.FeedAdapter.getView(FeedAdapter.java:96)
05-01 15:40:42.439: E/AndroidRuntime(24550):    at android.widget.AbsListView.obtainView(AbsListView.java:2263)
05-01 15:40:42.439: E/AndroidRuntime(24550):    at android.widget.ListView.measureHeightOfChildren(ListView.java:1263)
05-01 15:40:42.439: E/AndroidRuntime(24550):    at android.widget.ListView.onMeasure(ListView.java:1175)
05-01 15:40:42.439: E/AndroidRuntime(24550):    at android.view.View.measure(View.java:16497)
05-01 15:40:42.439: E/AndroidRuntime(24550):    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125)

3 个答案:

答案 0 :(得分:3)

您不应该在Fragment的构造函数中进行任何初始化(尤其不是Activity事务)。初始化应该在onCreate

中进行
public class Youtube extends FragmentActivity {
    public static final String API_KEY = "MyKey";
    public static final String VIDEO_ID = "videoID";
    public YouTubePlayerView youTubePlayerView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        PlayerYouTubeFrag myFragment = PlayerYouTubeFrag.newInstance("Adp1TUDRNtc");
        getSupportFragmentManager().beginTransaction().replace(view.findViewById(R.id.placeholder).getId(), myFragment).commit();
    }
}

答案 1 :(得分:1)

只需替换onCreate() method of your activity中的片段即可。也不要像现在创建的那样创建任何构造函数。

Activities onCreate() method中写下您制作片段和替换的代码。

另外,只需传递你正在使用的FrameLayout的id。

PlayerYouTubeFrag myFragment = PlayerYouTubeFrag.newInstance("Adp1TUDRNtc");
     getSupportFragmentManager().beginTransaction().replace(R.id.placeholder, myFragment).commit();

答案 2 :(得分:0)

您拥有Youtube extends FragmentActivity,并且您在new中使用setupInnerViewElements()对该活动进行了实例化。永远不要使用new实例化活动。如果您需要实例化活动,请使用Intent

此外,您不能拥有带参数的活动构造函数 - 框架需要查找并调用no-arg构造函数。它通常是隐含的,即您根本不定义构造函数。将您的活动设置代码放在onCreate()