bugfix> android > 投稿

似たような状況を見つけましたこの そしてこの、しかし、それでも私の問題を解決できませんでした。

私はyoutubeビデオと次のようなテキスト情報のあるスクリーンを持ちたいです:

私は使用していますアクティビティ と断片、両方とも拡張された基本クラスYouTubeBaseActivity そしてYouTubePlayerFragment

しかし、フラグメントを開こうとすると、npeが表示されますが、どこに表示されるかはわかりません。レイアウトとビューが正しくなったので、今は何が起こっているのかわかりません。

NPEの質問であるため、ダウン票を獲得しないことを願っていますが、通常とは異なり、このAPIコールではNPEの発生場所が示されず、他の人がこのような問題を抱えているのがわかりました

Obs:より多くの場所でこのビデオの動作が行われ、コードの繰り返しを避けようとしているため、この拡張ベースの概念を使用しています。

Logcat

XML

<android.support.constraint.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    tools:context=".screens.mine.fragments.MineStepsFragment">
    <com.google.android.youtube.player.YouTubePlayerView
        android:id="@+id/mine_steps_youtube_player"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:background="@color/background_white"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent">
    </com.google.android.youtube.player.YouTubePlayerView>
</android.support.constraint.ConstraintLayout>

アクティビティ

public class MineAccidentActivity extends BaseYoutubeActivity {
@Override
protected void initializeActionBar() {
    actionbarLeftBtn.setVisibility(View.VISIBLE);
    actionbarTitle.setVisibility(View.VISIBLE);
}
@Override
protected int getActionbarTitle() {
    return R.string.mine_accident;
}
@Override
protected int getContentView() {
    return R.layout.mine_accident_activity;
}
@Override
protected void assignViews() {
    MineAccidentController.getInstance().attachToActivity(this, R.id.mine_container);
}
@Override
protected void prepareViews() {}
///////////////////  BACK  ////////////////////
@Override
public void onBackPressed() {
    if (!MineAccidentController.getInstance().isFirstFragmentShown()) {
        MineAccidentController.getInstance().showPreviousFragment();
    } else {
        super.onBackPressed();
    }
}
///////////////////  LIFE CYCLE  ////////////////////
@Override
protected void onDestroy() {
    MineAccidentController.getInstance().onDestroy();
    super.onDestroy();
}
}

フラグメントコントローラー

public class MineAccidentController extends BaseYoutubeController {
private String accidentType;
@Override
protected ArrayList<android.app.Fragment> initFragments() {
    ArrayList<android.app.Fragment> fragments = new ArrayList<>();
    fragments.add(new MineStepsFragment());
    return fragments;
}
//create Class
public static MineAccidentController getInstance() {
    if (null == instance) {
        synchronized (MineAccidentController.class) {
            if (null == instance) {
                setInstance(new MineAccidentController());
            }
        }
    }
    return (MineAccidentController) instance;
}
public String getAccidentType() {
    return accidentType;
}
public void setAccidentType(String accidentType) {
    this.accidentType = accidentType;
}
}

断片

public class MineStepsFragment extends BaseYoutubeFragment {
//Not in Layout
private String videoUrl;
////////////// IMPLEMENT_METHODS //////////////
@Override
protected int getFragmentContentView() {
    return R.layout.mine_steps_fragment;
}
@Override
protected int getYoutubePlayerView() {
    return R.id.mine_steps_youtube_player;
}
@Override
protected void assignViews() {
}
@Override
protected void prepareViews() {
}
@Override
public void onInitializationSuccess(YouTubePlayer.Provider provider, YouTubePlayer youTubePlayer, boolean wasRestored) {
    if(!wasRestored){
        checkType();
        youTubePlayer.cueVideo(videoUrl);
    }
}
@Override
public void onInitializationFailure(YouTubePlayer.Provider provider, YouTubeInitializationResult youTubeInitializationResult) {
    showErrorToast(getActivity(), R.string.error_initialize_video);
}
////////////// FUNCTIONS //////////////
private void checkType() {
    if(MineAccidentController.getInstance().getAccidentType().equals(Parameters.ACCIDENT_PERSONAL)){
        videoUrl = Properties.MINE_PERSONAL_VIDEO;
    }
    else {
        videoUrl = Properties.MINE_WORK_VIDEO;
    }
}
}

基本フラグメント

public abstract class BaseYoutubeFragment extends YouTubePlayerFragment implements YouTubePlayer.OnInitializedListener {
protected View fragmentView = null;
protected YouTubePlayerView youTubePlayerView;
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    assignViews();
    prepareViews();
}
@Override
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    fragmentView = inflater.inflate(getFragmentContentView(), container, false);

    youTubePlayerView = fragmentView.findViewById(getYoutubePlayerView());
    youTubePlayerView.initialize(com.can_apps.eva_ngo.properties.Properties.API_KEY, this);

    return fragmentView;
}

///////////////////  ABSTRACT METHODS  ////////////////////
protected abstract int getFragmentContentView();        //Get Layout R.layout.name_file
protected abstract int getYoutubePlayerView();  //Get Container for YOutube Video
protected abstract void assignViews();          //Used for findById the params
protected abstract void prepareViews();         //Used for start the values of params
///////////////////  SHOW MESSAGES  ////////////////////
public void showErrorToast(Context context, final int message) {
    Toast toast = Toast.makeText(context, getString(message), Toast.LENGTH_SHORT);
    View view = toast.getView();
    view.setBackgroundResource(R.color.background_red_transparent);
    toast.show();
}
///////////////////  SNACK BAR  ////////////////////
public void showSnackBar(final int text) {
    Snackbar.make(Objects.requireNonNull(getView()), getString(text), Snackbar.LENGTH_SHORT).show();
}
public void showSnackBar(final int mainTextStringId, final int actionStringId, View.OnClickListener listener) {
    Snackbar.make(Objects.requireNonNull(getView()),
            getString(mainTextStringId),
            Snackbar.LENGTH_LONG)
            .setAction(getString(actionStringId), listener).show();
}
}

回答 1 件
  • logcatを見ると、 YouTubePlayerView のように見えます  メソッドの1つを呼び出すときはnullです。

    YouTube Player APIは非常にバグが多く、正しく使用するのが困難です。この問題(および他の問題)を解決するために、Android-YouTube-Playerという代替プレーヤーを作成しました。これはオープンソースであり、あなたはそれで何でもできます。

    あなたの場合、私の YouTubePlayerView から、フラグメントやトランザクションをいじる必要はありません。  は単なる通常のビューであり、特別なフラグメントやアクティビティは必要ありません。好きな場所にドロップできます。

    それがあなたにも役立つことを願っています!

あなたの答え