NullPointerException on super.onStart()

2019-06-27 04:50发布

Currently I'm writing Fragment that extends custom SherlockFragment that extends YouTubePlayerSupportFragment. Unfortunately, app crashes.

CODE:

    public static class YouTubeVideo extends SherlockYouTubeFragment
         implements YouTubePlayer.OnInitializedListener{
private TextView titleview;
private TextView descview;
private TextView countview;
private TextView timeview;
private Bundle data;

 private YouTubePlayer ytp;
private String title;
private String id;
private String desc;
private String count;
private String time;
private int timeint;
private int timem;
private int times;
private Tracker myTracker;
private ShareActionProvider mShareActionProvider;
@Override
public View onCreateView (LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
    data = getArguments();
    return inflater.inflate(R.layout.youtubeview, container, false);
}

@Override
public void onStart() {
     titleview = (TextView) getView().findViewById(R.id.title);
     descview = (TextView) getView().findViewById(R.id.descriptiontext);
     countview = (TextView) getView().findViewById(R.id.viewcounttext);
     timeview = (TextView) getView().findViewById(R.id.timetext);

     title = data.getString("title");
     id = data.getString("id");
     desc = data.getString("description");
     count = data.getString("viewcount");
     time = data.getString("time");
     EasyTracker.getInstance().setContext(this.getActivity());
     myTracker = EasyTracker.getInstance().getTracker();
     FragmentManager fragmentManager = getFragmentManager();
     FragmentTransaction fragmentTransaction = fragmentManager
             .beginTransaction();

     YouTubePlayerSupportFragment fragment = new YouTubePlayerSupportFragment();
      fragment.initialize(ID, this);
     fragmentTransaction.add(R.id.youtubeplayer, fragment);
     fragmentTransaction.commit();
  titleview.setText(title);
  descview.setText(desc);
  countview.setText(count);
  try {
      timeint = Integer.parseInt(time);
      timem = timeint/60;
      times = timeint - (timem*60);      
  } catch(NumberFormatException nfe) {
    // Handle parse error.
  }
  if (times<10){
timeview.setText(String.valueOf(timem)+":0"+String.valueOf(times));
 }
  else{
      timeview.setText(String.valueOf(timem)+":"+String.valueOf(times));
  }
  super.onStart();
 }

 @Override
 public void onInitializationFailure(Provider arg0,YouTubeInitializationResult arg1) {
  Toast.makeText(this.getActivity(), "Uruchamianie filmu nie powiodło się", Toast.LENGTH_LONG).show();
 }

 @Override
 public void onInitializationSuccess(Provider provider, YouTubePlayer player,boolean wasrestored) {
  ytp = player;
  player.addFullscreenControlFlag(4);
  if(ytp !=null){
        ytp.loadVideo(id);
       }
 }
 public boolean onCreateOptionsMenu(Menu menu) {
     MenuInflater inflater = getSherlockActivity().getSupportMenuInflater();
     inflater.inflate(R.menu.video_menu, menu);
     mShareActionProvider = (ShareActionProvider)menu.findItem(R.id.share).getActionProvider();
     mShareActionProvider.setShareIntent(createShareIntent());

     return true;
 }
 private Intent createShareIntent() {
     myTracker.trackEvent("videoview", "share", title + id, (long) 3);

        Intent sendIntent = new Intent();
    sendIntent.setAction(Intent.ACTION_SEND);
    sendIntent.putExtra(Intent.EXTRA_TEXT, title + " - http://ignastv.tk/id/" + id);
    sendIntent.setType("text/plain");
    mShareActionProvider.setShareIntent(sendIntent);
    return sendIntent;
}

 public boolean onOptionsItemSelected(MenuItem item) {
     int itemId = item.getItemId();

        if(itemId == R.id.vidsite){
            myTracker.trackEvent("videoview", "open-in", title + id, (long) 3);
            Intent govideo = new Intent(Intent.ACTION_VIEW);
            govideo.setData(Uri.parse(id));
            startActivity(govideo);
            return true;}

        else {
            return super.onOptionsItemSelected(item);
        }

}

}

What is most interesting is that LogCat shows there's NullPointerException that happens in line:

    super.onStart();

Here's LogCat:

    04-27 20:19:30.055: E/AndroidRuntime(14706): FATAL EXCEPTION: main
    04-27 20:19:30.055: E/AndroidRuntime(14706): java.lang.NullPointerException
    04-27 20:19:30.055: E/AndroidRuntime(14706):    at com.google.android.youtube.player.YouTubePlayerSupportFragment.onStart(Unknown Source)
    04-27 20:19:30.055: E/AndroidRuntime(14706):    at com.app.app.MainActivity$YouTubeVideo.onStart(MainActivity.java:519)
    04-27 20:19:30.055: E/AndroidRuntime(14706):    at android.support.v4.app.Fragment.performStart(Fragment.java:1332)
    04-27 20:19:30.055: E/AndroidRuntime(14706):    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:906)
    04-27 20:19:30.055: E/AndroidRuntime(14706):    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1080)
    04-27 20:19:30.055: E/AndroidRuntime(14706):    at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:622)
    04-27 20:19:30.055: E/AndroidRuntime(14706):    at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1416)
    04-27 20:19:30.055: E/AndroidRuntime(14706):    at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:420)
    04-27 20:19:30.055: E/AndroidRuntime(14706):    at android.os.Handler.handleCallback(Handler.java:725)
    04-27 20:19:30.055: E/AndroidRuntime(14706):    at android.os.Handler.dispatchMessage(Handler.java:92)
    04-27 20:19:30.055: E/AndroidRuntime(14706):    at android.os.Looper.loop(Looper.java:137)
    04-27 20:19:30.055: E/AndroidRuntime(14706):    at android.app.ActivityThread.main(ActivityThread.java:5039)
    04-27 20:19:30.055: E/AndroidRuntime(14706):    at java.lang.reflect.Method.invokeNative(Native Method)
    04-27 20:19:30.055: E/AndroidRuntime(14706):    at java.lang.reflect.Method.invoke(Method.java:511)
    04-27 20:19:30.055: E/AndroidRuntime(14706):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
    04-27 20:19:30.055: E/AndroidRuntime(14706):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
    04-27 20:19:30.055: E/AndroidRuntime(14706):    at dalvik.system.NativeStart.main(Native Method)

What is wrong with this code?

2条回答
ゆ 、 Hurt°
2楼-- · 2019-06-27 05:05

It's not clear in the SDK but as far as I was able to work it out, you don't extend YouTubePlayerFragment. You simply include the fragment in your layout (it works as a nested fragment too).

Basically you have two alternatives:

  • extend YouTubeBaseActivity and inflate a layout which includes a YouTubePlayerView - it works but you can't use Fragments

  • Use your favourite Activity and inflate a layout which includes the YouTubePlayerFragment. Do not extend it.

I have successfully added the YoutubePlayerFragment as a nested fragment too (update: this causes some memory leaks so you might prefer to avoid it). You can add other components around the YouTubePlayerFragment but be careful as the docs say you can't overlay this view with other view while the video is playing.

So, to solve your problem don't extend YouTubePlayerFragment, simply include it in your layout. By calling initialize on this fragment you will get a YouTubePlayer in the callback which you can use to control the video.

查看更多
你好瞎i
3楼-- · 2019-06-27 05:19

Faced the same problem and searched stackoverflow many times. Solution was just Simply extend Fragment instead of YouTubePlayerSupportFragment.

public class FragmentTrailers extends Fragment implements YouTubePlayer.OnInitializedListener {
public static final String DEVELOPER_KEY = BuildConfig.YOUTUBE_API;
private static final int RECOVERY_DIALOG_REQUEST = 1;
private String url;

YouTubePlayerSupportFragment youTubePlayerView;

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.detail_fragment_trailers, container, false);

    youTubePlayerView = YouTubePlayerSupportFragment.newInstance();
    FragmentTransaction transaction = getChildFragmentManager().beginTransaction();
    transaction.add(R.id.youtube_fragment, youTubePlayerView).commit();

    youTubePlayerView.initialize(DEVELOPER_KEY, this);

    return view;
}
}

XML Layout file.

  <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/youtube_fragment"/>
查看更多
登录 后发表回答