Question

So I recently started working with fragments and trying to understand how everything works. I have put this together but my app keeps crashing. Any hints as to what is going on would be greatly appreciated, also an explanation as to why would also be great. I am trying to load a youtube video in a fragment that loads in a view thats handed to me by a listview adapter. Here is my setup:

I have a fragment set up for a youtube video:

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);

            }
        }
    });
}
}

Now I also have a class that sets up the fragments and the swap:

 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();
 }

Last but not least my xml:

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

The 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)
Was it helpful?

Solution

You shouldn't be doing any initialization (and especially not Fragment transactions) in the constructor of an Activity. Initialization should happen in 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();
    }
}

OTHER TIPS

Just replace the fragment in the onCreate() method of your activity. Also don't create any constructor as you have created now.

Write your this code of making the fragment and replacing in the Activities onCreate() method.

Also, just pass the id of the FrameLayout which you are using like this.

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

You have Youtube extends FragmentActivity and you're instantiating that activity with new in setupInnerViewElements(). Never instantiate activities with new. If you need to instantiate activities, use an Intent.

Also, you cannot have an activity constructor that takes arguments - the framework needs to find and call the no-arg constructor. Often it's implicit i.e. you don't define a constructor at all. Place your activity setup code in onCreate().

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top