在Activity中使用VideoSupportFragment触发NullPointerException求助
使用VideoSupportFragment时触发NullPointerException问题
我在Activity中尝试使用VideoSupportFragment时遇到了NullPointerException,已将该Fragment直接添加到Activity中,但仍触发此错误。唯一能解决问题的方法是将Fragment类型改为普通Fragment,但这样就无法再使用VideoSupportFragment的专属功能。我已将Leanback库版本从1.0.0升级到1.2.0-alpha04。
报错信息
FATAL EXCEPTION: main Process: com.example.firstdemotv, PID: 32115 java.lang.NullPointerException: Attempt to invoke virtual method 'androidx.leanback.widget.VerticalGridView androidx.leanback.app.RowsSupportFragment.getVerticalGridView()' on a null object reference at androidx.leanback.app.PlaybackSupportFragment.setupChildFragmentLayout(PlaybackSupportFragment.java:780) at androidx.leanback.app.PlaybackSupportFragment.onStart(PlaybackSupportFragment.java:955) at androidx.fragment.app.Fragment.performStart(Fragment.java:3021) at androidx.fragment.app.FragmentStateManager.start(FragmentStateManager.java:589) at androidx.fragment.app.FragmentStateManager.moveToExpectedState(FragmentStateManager.java:300) at androidx.fragment.app.FragmentStore.moveToExpectedState(FragmentStore.java:112) at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1647)
相关代码
ListFragment(继承自RowsSupportFragment)
class ListFragment : RowsSupportFragment() { private var itemSelectedListener: ((DataModel.Result.Detail) -> Unit)? = null private var itemClickListener: ((DataModel.Result.Detail) -> Unit)? = null private val listRowPresenter = object : ListRowPresenter(FocusHighlight.ZOOM_FACTOR_MEDIUM) { override fun isUsingDefaultListSelectEffect(): Boolean { return false } }.apply { shadowEnabled = false } private var rootAdapter: ArrayObjectAdapter = ArrayObjectAdapter(listRowPresenter) override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) adapter = rootAdapter onItemViewSelectedListener = ItemViewSelectedListener() onItemViewClickedListener = ItemViewClickListener() } fun bindData(dataList: DataModel) { dataList.result.forEachIndexed { index, result -> val arrayObjectAdapter = ArrayObjectAdapter(ItemPresentor()) result.details.forEach { arrayObjectAdapter.add(it) } val headerItem = HeaderItem(result.title) val listRow = ListRow(headerItem, arrayObjectAdapter) rootAdapter.add(listRow) } } fun bindCastData(list: List<CastResponse.Cast>) { val arrayObjectAdapter = ArrayObjectAdapter(CastItemPresenter()) list.forEach { content -> arrayObjectAdapter.add(content) } val headerItem = HeaderItem("Cast & Crew") val listRow = ListRow(headerItem, arrayObjectAdapter) rootAdapter.add(listRow)}}
调用ListFragment的DetailActivity(继承自FragmentActivity)
class DetailActivity : FragmentActivity() { private lateinit var binding: ActivityDetailBinding lateinit var viewmodel: DetailViewmodel val castFragment = ListFragment() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding = DataBindingUtil.setContentView(this, R.layout.activity_detail) addFragment(castFragment) val movieId = intent.getIntExtra("id", 0) val repository = (application as MyApplication).tmdbRepo viewmodel = ViewModelProvider( owner = this, factory = DetailViewmodelFactory(repository, movieId) )[DetailViewmodel::class.java] viewmodel.movieDetails.observe(this) { when (it) { is Response.Loading -> { } is Response.Success -> { setData(it.data) } is Response.Error -> { } else -> {} } } viewmodel.castDetails.observe(this) { when (it) { is Response.Loading -> { } is Response.Success -> { if (!it.data?.cast.isNullOrEmpty()) { castFragment.bindCastData(it.data?.cast!!) } } is Response.Error -> { } else -> {} } } binding.addToMylist.setOnKeyListener { view, keyCode, keyEvent -> when (keyCode) { KeyEvent.KEYCODE_DPAD_DOWN -> { if (keyEvent.action == KeyEvent.ACTION_DOWN) { castFragment.requestFocus() } } } false } binding.play.setOnClickListener { val intent = Intent(this@DetailActivity, PlaybackActivity::class.java) startActivity(intent) } }
调用ListFragment的HomeFragment(继承自Fragment)
class HomeFragment : Fragment() { private lateinit var binding: FragmentHomeBinding val listFragment = ListFragment() override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View { binding = FragmentHomeBinding.inflate(inflater, container, false) return binding.root } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) val transaction = requireActivity().supportFragmentManager.beginTransaction() transaction.add(binding.listFragments.id, listFragment) transaction.commit() val gson = Gson() val i: InputStream = requireContext().assets.open("movies.json") val br = BufferedReader(InputStreamReader(i)) val dataList: DataModel = gson.fromJson(br, DataModel::class.java) listFragment.bindData(dataList) listFragment.setOnContentSelectedListener { updateBanner(it) } listFragment.setOnItemClickListener { val intent = Intent(requireActivity(), DetailActivity::class.java) intent.putExtra("id", it.id) startActivity(intent) requireActivity().finish() } }
内容的提问来源于stack exchange,提问作者LastMomentCoder
相关产品推荐
相关产品推荐

