首页 > 解决方案 > android studio中fragment_home的VideoView中的空引用

问题描述

我正在构建像 tiktok 这样的简单应用程序,其中我在 fragment_home 的 VideoView 中收到错误 Null 引用。我用谷歌搜索了很多但无法找到答案。android 项目的层次结构如屏幕截图所示

在此处输入图像描述

家庭片段的代码如下

package com.example.musically.ui.home;

import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.MediaController;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.VideoView;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.lifecycle.Observer;
import androidx.lifecycle.ViewModelProviders;

import com.example.musically.R;

public class HomeFragment extends Fragment {

    private HomeViewModel homeViewModel;

    public View onCreateView(@NonNull LayoutInflater inflater,
                             ViewGroup container, Bundle savedInstanceState) {

        View viewInflate  = inflater.inflate(R.layout.fragment_home, container, false);
        //VideoView videoview=(VideoView)getView().findViewById(R.id.videoView);
        VideoView videoview=(VideoView)getActivity().findViewById(R.id.videoView);
        videoview.requestFocus();
        String videopath="android.resource://"+getActivity().getPackageName()+"/"+R.raw.video;
        Uri uri=Uri.parse(videopath);
        videoview.setVideoURI(uri);
        videoview.setMediaController(new MediaController(getActivity()));


        //Creating MediaControllegetExternalFilesDir(r

        //specify the location of media file

        return inflater.inflate(R.layout.fragment_home, container, false);



    }
}

它在“ VideoView videoview=(VideoView)getActivity().findViewById(R.id.videoView); ”中显示空值

fragment_home 的代码是

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">

    <VideoView android:id="@+id/videoView"
        android:layout_alignParentTop="true"
        android:layout_alignParentBottom="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentRight="true"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent">
    </VideoView>

</RelativeLayout>

MainActivity.java

package com.example.musically;

import android.os.Build;
import android.os.Bundle;
import android.view.MenuItem;
import android.widget.Toast;

import com.google.android.material.bottomnavigation.BottomNavigationView;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.content.ContextCompat;
import androidx.navigation.NavController;
import androidx.navigation.Navigation;
import androidx.navigation.ui.AppBarConfiguration;
import androidx.navigation.ui.NavigationUI;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        final BottomNavigationView bottomNavigationView = (BottomNavigationView)findViewById(R.id.nav_view);
        // Passing each menu ID as a set of Ids because each
        // menu should be considered as top level destinations.
        final AppBarConfiguration appBarConfiguration = new AppBarConfiguration.Builder(
                R.id.navigation_home, R.id.navigation_discover, R.id.navigation_upload,R.id.title_inbox,R.id.navigation_profile).build();

        bottomNavigationView.setOnNavigationItemSelectedListener(
                new BottomNavigationView.OnNavigationItemSelectedListener() {
                    @Override
                    public boolean onNavigationItemSelected(@NonNull MenuItem item) {
                        final int previousItem = bottomNavigationView.getSelectedItemId();
                        final int nextItem = item.getItemId();
                        if (previousItem != nextItem) {
                            switch (nextItem) {
                                case R.id.navigation_home:
                                    //Add your action onClickR.id
                                    progressload();
                                    videoload();
                                    break;
                                case R.id.navigation_discover:

                                    break;

                                case R.id.navigation_upload:

                                    break;


                                case R.id.title_inbox:

                                    break;

                                case R.id.navigation_profile:

                                    break;


                            }
                        }
                        return true;
                    }
                }
        );
       // NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment);
        //NavigationUI.setupActionBarWithNavController(this, navController, appBarConfiguration);
        //NavigationUI.setupWithNavController(navView, navController);
    }
    public void progressload(){

    }
    public void videoload()
    {

    }
}

错误

2020-05-18 17:08:21.045 28646-28646/com.example.musically E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.musically, PID: 28646
    android.view.InflateException: Binary XML file line #6: Binary XML file line #6: Error inflating class com.my_lib.base.VideoView
    Caused by: android.view.InflateException: Binary XML file line #6: Error inflating class com.my_lib.base.VideoView
    Caused by: java.lang.ClassNotFoundException: Didn't find class "com.my_lib.base.VideoView" on path: DexPathList[[zip file "/data/app/com.example.musically-OMaJSnd6EFYsyHyVc-cCpw==/base.apk"],nativeLibraryDirectories=[/data/app/com.example.musically-OMaJSnd6EFYsyHyVc-cCpw==/lib/arm64, /system/lib64]]
        at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:134)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:379)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
        at android.view.LayoutInflater.createView(LayoutInflater.java:612)
        at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:852)
        at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:775)
        at android.view.LayoutInflater.rInflate(LayoutInflater.java:925)
        at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:886)
        at android.view.LayoutInflater.inflate(LayoutInflater.java:521)
        at android.view.LayoutInflater.inflate(LayoutInflater.java:429)
        at com.example.musically.ui.home.HomeFragment.onCreateView(HomeFragment.java:29)
        at androidx.fragment.app.Fragment.performCreateView(Fragment.java:2698)
        at androidx.fragment.app.FragmentStateManager.createView(FragmentStateManager.java:320)
        at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1187)
        at androidx.fragment.app.FragmentManager.addAddedFragments(FragmentManager.java:2224)
        at androidx.fragment.app.FragmentManager.executeOpsTogether(FragmentManager.java:1997)
        at androidx.fragment.app.FragmentManager.removeRedundantOperationsAndExecute(FragmentManager.java:1953)
        at androidx.fragment.app.FragmentManager.execPendingActions(FragmentManager.java:1849)
        at androidx.fragment.app.FragmentManager.dispatchStateChange(FragmentManager.java:2629)
        at androidx.fragment.app.FragmentManager.dispatchActivityCreated(FragmentManager.java:2577)
        at androidx.fragment.app.Fragment.performActivityCreated(Fragment.java:2722)
        at androidx.fragment.app.FragmentStateManager.activityCreated(FragmentStateManager.java:346)
        at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1188)
        at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1356)
        at androidx.fragment.app.FragmentManager.moveFragmentToExpectedState(FragmentManager.java:1434)
        at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1497)
        at androidx.fragment.app.FragmentManager.dispatchStateChange(FragmentManager.java:2625)
        at androidx.fragment.app.FragmentManager.dispatchActivityCreated(FragmentManager.java:2577)
        at androidx.fragment.app.FragmentController.dispatchActivityCreated(FragmentController.java:247)
        at androidx.fragment.app.FragmentActivity.onStart(FragmentActivity.java:541)
        at androidx.appcompat.app.AppCompatActivity.onStart(AppCompatActivity.java:201)
        at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1391)
        at android.app.Activity.performStart(Activity.java:7279)
        at android.app.ActivityThread.handleStartActivity(ActivityThread.java:3194)
        at android.app.servertransaction.TransactionExecutor.performLifecycleSequence(TransactionExecutor.java:185)
        at android.app.servertransaction.TransactionExecutor.cycleToPath(TransactionExecutor.java:170)
        at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:147)
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:73)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2036)
        at android.os.Handler.dispatchMessage(Handler.java:106)
        at android.os.Looper.loop(Looper.java:224)
        at android.app.ActivityThread.main(ActivityThread.java:7081)
        at java.lang.reflect.Method.invoke(Native Method)
2020-05-18 17:08:21.045 28646-28646/com.example.musically E/AndroidRuntime:     at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:536)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:928)
2020-05-18 17:08:21.068 28646-28646/com.example.musically I/Process: Sending signal. PID: 28646 SIG: 9

标签: android

解决方案


在活动中findViewById()可通过关键字访问,但对于片段,它是您膨胀的视图,例如
View mainView = inflater.inflate (R.layout.lout_selected_layer,null); 在这里你膨胀了 maniView,现在所有的 Id 都可以被 mainView访问

看看下面的例子

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {

        View mainView = inflater.inflate (R.layout.lout_selected_layer,null);
        tvHeader = (TextView) mainView.findViewById(R.id.tv_header);
        tvHeader.setText(headerMessage.toString() + "");


        lvItems = (ListView) mainView.findViewById(R.id.lv_groups);
        lvItems.setAdapter(new AdapterLayer1Items(Layer1Fragment.this.getActivity(), 0,
                layer1Objs));
        ((MainActivity) this.getActivity()).setBannerVisibility(View.VISIBLE);

        llGpAdView = (LinearLayout) mainView.findViewById(R.id.gpAdd);


        return mainView;
    }

推荐阅读