当前位置: 首页 > 知识库问答 >
问题:

在片段节上使用YoutubePlayerView

越学文
2023-03-14

但当我试图打开碎片时,它显示了一个npe,但它没有显示在哪里。由于我得到了布局和视图正确,我现在不知道是怎么回事。

我希望它不会因为是一个npe问题而被否决,但与通常不同的是,这个API调用没有显示npe发生的地方,我看到其他人有这样的问题

OBS:我使用这个扩展的基本概念,因为更多的地方会有这种视频行为,而且我正在努力避免代码重复。

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

}

暂时还没有答案

 类似资料:
  • 问题内容: 如何获取片段中的上下文? 我需要用我的数据库其构造函数采用的背景下,但并没有工作,所以我能做些什么? 数据库构造函数 问题答案: 你可以使用,返回与关联的活动。 活动是(自扩展以来)。

  • 我有一个TabLayout或TabHost的设计,无论你想考虑什么。假设这是选项卡- Tab1 | Tab2 | Tab3 | Tab4 | Tab5 在此情况下,将执行以下操作- 表1-打开碎片1 表2-打开碎片2 Tab3-在现有片段上打开一个覆盖图,显示半透明的黑色视图 表4-打开碎片3 表5-打开碎片4 你知道怎么解决这个问题吗?提前感谢!! 更新:我使用的解决方案 我试过这个,但不得不进

  • 是否有一种方法可以检查堆栈中的前一个片段是否是包含SupportMap的片段?

  • 有没有人知道我怎么在工会上使用碎片?我已经看到了React的文档(https://www.apollographql.com/docs/React/advanced/fragments/#fragment-on-unions-and-interfaces),但对Vue的介绍不多。我有一个返回两个片段的查询,都带有__TypeName。 当vue应用程序运行时,我收到一个错误:“您正在查询中使用片段

  • 我正在尝试在MVVMCross Xamarin Adroid应用程序中使用ActionBar。我能够在片段中加载布局,问题是上下文总是指向MainView而不是布局视图。我试图更改上下文,但资源异常。错误是 Java.Lang.NullPointerException:尝试在 null 对象引用上调用虚拟方法 'android.content.res.Resources android.conte

  • 我在一个activity里有多个碎片。在一个按钮点击我开始一个新的片断,将它添加到backstack。我自然希望调用当前片段的方法和新片段的。但这并没有发生。 我所期待的是, 单击按钮时,LoginFragment将被替换为HomeFragment、LoginFragment的以及HomeFragment的将被调用 按下“上一步”时,将弹出HomeFragment并看到LoginFragment,