调用setSupportActionBar程序崩溃

本文介绍了一种在自定义AppCompatActivity中使用setSupportActionBar导致程序崩溃的问题,并提供了解决方案:在清单文件中为该Activity设置特定主题。

1. 问题描述:

在继承自AppCompatActivity的自定义Activity中,
调用setSupportActionBar后,程序直接崩溃,单步调试,崩溃时,跑到ActivityThread中了。


2. 解决办法:
在清单文件中,这个activity声明时,需要加上android:theme="@style/AppTheme.NoActionBar"。

package com.tplink.mercusys.component.quicksetup.view.wisp.fragment import android.content.Context import android.os.Bundle import android.view.LayoutInflater import android.view.MenuItem import android.view.View import android.view.ViewGroup import androidx.activity.addCallback import androidx.appcompat.app.AppCompatActivity import androidx.navigation.NavOptions import androidx.navigation.fragment.findNavController import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.tplink.apps.architecture.BaseMvvmFragment import com.tplink.design.util.accessibility.initAccessDelegate import com.tplink.mercusys.R import com.tplink.mercusys.base.extensions.activityMercusysViewModels import com.tplink.mercusys.component.account.feedback.view.FeedBackWebActivity import com.tplink.mercusys.component.onboarding.view.flow.OnboardingStep import com.tplink.mercusys.component.onboarding.view.portable.fragment.PortableQuickSetupInitFailFragment import com.tplink.mercusys.component.onboarding.view.portable.fragment.PortableQuickSetupInitFailFragment.Companion.DETECTED_FAILED import com.tplink.mercusys.component.onboarding.view.router.RouterPagerContainerActivityInterface import com.tplink.mercusys.component.onboarding.viewmodel.portablerouter.PortableRouterOnboardingViewModel import com.tplink.mercusys.component.quicksetup.repository.bo.EnumScanType import com.tplink.mercusys.component.quicksetup.viewmodel.wisp.WISPQuickSetUpViewModel import com.tplink.mercusys.databinding.FragmentReDeviceOperateCommonBinding import io.reactivex.Observable import io.reactivex.android.schedulers.AndroidSchedulers import io.reactivex.disposables.Disposable import java.util.concurrent.TimeUnit class WISPScanWiFiFragment : BaseMvvmFragment<FragmentReDeviceOperateCommonBinding>() { companion object { const val INIT_PERIOD = 500L const val NEW_PERIOD = 100L const val TOTAL_PROGRESS = 100L const val IS_PORTABLE_DEVICE = "IS_PORTABLE_DEVICE" fun newInstance(isPortableDevice: Boolean = false): WISPScanWiFiFragment { val bundle = Bundle() bundle.putBoolean(IS_PORTABLE_DEVICE, isPortableDevice) val fragment = WISPScanWiFiFragment() fragment.arguments = bundle return fragment } } private var mDisposable: Disposable? = null private var mProgress: Long = 0L private var totalProgress: Long = TOTAL_PROGRESS private var isScanSucceed: Boolean = false private var scanType: EnumScanType = EnumScanType.BAND2_4 private var isPortableDevice: Boolean = false private val mWISPViewModel: WISPQuickSetUpViewModel by activityMercusysViewModels() private val mPortableViewModel: PortableRouterOnboardingViewModel by activityMercusysViewModels() private var mCallback: RouterPagerContainerActivityInterface? = null override fun bindView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?, ): FragmentReDeviceOperateCommonBinding? { return FragmentReDeviceOperateCommonBinding.inflate(inflater, container, false) } override fun subscribeViewModel(savedInstanceState: Bundle?) { initToolbar() initView() setHasOptionsMenu(true) startScanWifi() mWISPViewModel.getQuickSetupData(wanEnable = true, wirelessEnable = true) if (isPortableDevice) { // Portable Router需要处理获取数据成功/失败的场景 mWISPViewModel.mQuickSetupGetResult.observe(viewLifecycleOwner) { if (it.value == true) { updateActivityViewModelData() } else if (it.value == false) { switchToPortableFailPage() } } } } override fun onAttach(context: Context) { super.onAttach(context) if (context is RouterPagerContainerActivityInterface) { mCallback = context } } private fun initToolbar() { (activity as? AppCompatActivity)?.setSupportActionBar(viewBinding.toolbar.toolbar) viewBinding.toolbar.toolbar.setNavigationIcon(R.drawable.mp_svg_nav_arrow_start_surface) viewBinding.toolbar.toolbar.visibility = if (mWISPViewModel.isEnterByMainNetwork || mWISPViewModel.isEnterByQuickSetup()) View.VISIBLE else View.GONE } private fun startAnimation() { viewBinding.qsMobileRippleBg.startRippleAnimation() } fun initView() { viewBinding.ivReQs.setImageResource(mWISPViewModel.getDeviceNormalIconRes()) viewBinding.tvTips.text = if (mPortableViewModel.portableNetworkModeType != null){ getString(R.string.onboarding_portable_scan_wireless) } else { getString(R.string.wisp_quick_setup_scan_wifi) } startAnimation() // 处理onBackPressed requireActivity().onBackPressedDispatcher.addCallback(this) { isEnabled = true onBackPressed() } viewBinding.tvTips.initAccessDelegate().setHeading() viewBinding.tvTips.contentDescription = viewBinding.tvTips.text.toString().replace("...", "") if (arguments != null) { requireArguments().getBoolean(IS_PORTABLE_DEVICE).let { isPortableDevice = it mWISPViewModel.isPortableDevice = it } if (mWISPViewModel.isPortableDevice || mPortableViewModel.isPortableReselect) { mWISPViewModel.portableModeType = mPortableViewModel.portableNetworkModeType } } } override fun onOptionsItemSelected(item: MenuItem): Boolean { onBackPressed() return true } override fun onBackPressed(): Boolean { if ((mWISPViewModel.isEnterByMainNetwork || mWISPViewModel.isEnterByQuickSetup()) && !isPortableDevice) { if (!findNavController().navigateUp()) { MaterialAlertDialogBuilder(requireContext()) .setCancelable(false) .setTitle(R.string.onboarding_quit_setup) .setMessage(R.string.onboarding_quit_setup_notice) .setPositiveButton(R.string.common_quit) { _, _ -> activity?.finish() } .setNegativeButton(R.string.common_cancel) { dialog, _ -> dialog.dismiss() } .setNeutralButton(R.string.feed_back_title) { dialog, _ -> gotoActivity(FeedBackWebActivity::class.java) dialog.dismiss() } .show() } } else if (isPortableDevice) { mCallback?.onExitSetup() } return super.onBackPressed() } private fun updateProgress(progress: Long) { mProgress = progress viewBinding.tvProgress.text = getString(R.string.common_percent_format, mProgress) if (progress % 5 == 0L) { viewBinding.tvProgress.announceForAccessibility(getString(R.string.common_percent_format, mProgress)) } } private fun startScanWifi() { scanType = if (mPortableViewModel.isPortableReselect) { mPortableViewModel.currentBand } else { if (mWISPViewModel.isSingleBandDevice()) { EnumScanType.BAND2_4 } else { EnumScanType.ALL } } mWISPViewModel.getCurrentNetworkInfo() mWISPViewModel.requestHostNetworkList({ scanSucceed() }, scanType) startProgress(0L, INIT_PERIOD) } private fun startProgress(startProgress: Long, period: Long) { mDisposable = Observable.intervalRange(startProgress, totalProgress, 0, period, TimeUnit.MILLISECONDS, AndroidSchedulers.mainThread()) .doOnNext { updateProgress(it) } .doOnSubscribe { viewBinding.qsMobileRippleBg.startRippleAnimation() } .doOnComplete { if (isScanSucceed) { scanSucceed() } } .subscribe() } /** * 扫描成功后,更新百分比进度到100%,跳转到下一页面 */ private fun scanSucceed() { clearDisposed() isScanSucceed = true if (TOTAL_PROGRESS > mProgress + 1) { totalProgress -= mProgress startProgress(mProgress, NEW_PERIOD) } else { updateProgress(NEW_PERIOD) if (isPortableDevice) { mCallback?.activityViewModel?.onboardingContext?.nextOnboardingStep = OnboardingStep.PORTABLE_RE_SELECTED mCallback?.onNextPager(null) } else { findNavController().navigate( R.id.action_wispScanNetworkFragment_to_wispSelectHostFragment, null, NavOptions.Builder() .setPopUpTo(R.id.quickSetUpWispScanNetworkFragment, true) .build() ) } } } private fun clearDisposed() { if (mDisposable?.isDisposed == false) { mDisposable!!.dispose() } } override fun onDestroyView() { super.onDestroyView() clearDisposed() } private fun switchToPortableFailPage() { val fragment = PortableQuickSetupInitFailFragment.newInstance(pageType = DETECTED_FAILED) parentFragmentManager.beginTransaction() .setCustomAnimations( R.anim.translate_between_interface_right_in, R.anim.translate_between_interface_left_out ) .replace( R.id.container, fragment, fragment.javaClass.simpleName ) .commitAllowingStateLoss() } private fun updateActivityViewModelData() { mCallback?.activityViewModel?.initRepository() mCallback?.activityViewModel?.negotiationInfo = mWISPViewModel.mNegotiationInfo mCallback?.activityViewModel?.wirelessInfo = mWISPViewModel.mWirelessInfo mCallback?.activityViewModel?.wanInfo = mWISPViewModel.mWanInfo mCallback?.activityViewModel?.qsWanInfo = mWISPViewModel.mQsWanInfo mCallback?.activityViewModel?.qsWirelessInfoBean = mWISPViewModel.mQsWirelessInfoBean mPortableViewModel.negotiationInfo = mWISPViewModel.mNegotiationInfo } } 如果getCurrentNetworkInfo失败且不是 portable 会怎么样
最新发布
12-17
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

liranke

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值