android - 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
解决方案
在活动中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;
}
推荐阅读
- python - 使用 Telethon 发送 Telegram 消息:某些实体参数有效,其他参数无效?
- groovy - 我们如何在 groovy 中捕获 ManualStepTest 描述和预期结果文本框值
- karate - 如何评论空手道中的多行?
- android - service.startForeground 是否暗示唤醒锁?
- c - 在 C 中解析 tzdata 数据库的工具
- python - 从烧瓶应用程序执行 bash 命令
- git - 我应该避免在私有 git 存储库中使用密钥吗?
- arduino-uno - 在 DELPHI / ARDUINO 界面中查找 HID/PID
- powershell - 脚本绕过我的 for 循环来搜索多少个文件夹
- vaticle-typedb - grakn grqal 匹配查询返回的结果少于预期