无法从 BottomSheetDialog 启动Activity

Posted

技术标签:

【中文标题】无法从 BottomSheetDialog 启动Activity【英文标题】:Unable to startActivity from BottomSheetDialog 【发布时间】:2019-03-08 15:48:49 【问题描述】:

在此上下文 ctw = ContextThemeWrapper(cont, R.style.AppTheme) 下一切正常,但是当我想启动任何活动时,我的应用程序崩溃了。 实际上,此 ctw 在此方法中与 Toast 可以正常工作,但是当我将此 ctw 传递给 Intent 以启动活动时,会出现错误。我也尝试直接使用 cont 变量 getApplicationContext 但仍然有同样的错误。代码在 kotlin 中,你也可以在 java 中帮助我。 :)

这是完整的代码

fun showBottomSheetDialog(url: String, cont: Context) 

    ctw = ContextThemeWrapper(cont, R.style.AppTheme)


    val lin_play: LinearLayout
    val lin_cancel: LinearLayout

    dialog = BottomSheetDialog(ctw!!)
    dialog.setContentView(R.layout.dialog_bottom_dailymotion)
    dialog.getWindow()!!.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT))
    dialog.getWindow()!!.setBackgroundDrawableResource(R.color.Transparent)

    lin_play = dialog.findViewById(R.id.lin_play_d)!!
    lin_cancel = dialog.findViewById(R.id.lin_cancel_d)!!


    lin_play.setOnClickListener 
        if (TextUtils.isEmpty(url)) 
            Toast.makeText(ctw, "Invalid/Empty URL", Toast.LENGTH_SHORT).show()
         else 
            if (!url!!.isEmpty()) 


                    startActivity(Intent(ctw, MainActivity::class.java).putExtra("url", url))

                dialog.dismiss()
            
        
    

    lin_cancel.setOnClickListener 
        dialog.dismiss()

    
              try 
              dialog.show()
              catch (e:Exception)
              e.printStackTrace()
             
        

这是我的错误

E/androidRuntime: FATAL EXCEPTION: main
              Process: com.browserforvideodownload, PID: 29839
              java.lang.NullPointerException: Attempt to invoke virtual method 'android.app.ActivityThread$ApplicationThread android.app.ActivityThread.getApplicationThread()' on a null object reference
                  at android.app.Activity.startActivityForResult(Activity.java:4367)
                  at android.support.v4.app.BaseFragmentActivityApi16.startActivityForResult(BaseFragmentActivityApi16.java:54)
                  at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:68)
                  at android.app.Activity.startActivityForResult(Activity.java:4312)
                  at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:751)
                  at android.app.Activity.startActivity(Activity.java:4716)
                  at android.app.Activity.startActivity(Activity.java:4631)
                  at com.browserforvideodownload.browserlighting.browser.activity.BrowserActivity$showBottomSheetDialogDailymotion$1.onClick(BrowserActivity.kt:3970)
                  at android.view.View.performClick(View.java:5740)
                  at android.view.View$PerformClick.run(View.java:22947)
                  at android.os.Handler.handleCallback(Handler.java:836)
                  at android.os.Handler.dispatchMessage(Handler.java:103)
                  at android.os.Looper.loop(Looper.java:232)
                  at android.app.ActivityThread.main(ActivityThread.java:6661)
                  at java.lang.reflect.Method.invoke(Native Method)
                  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1106)
                  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:967)

编辑:

经过长期的奋斗,我找到了自己的错误。

只是替换

 startActivity(Intent(ctw, MainActivity::class.java).putExtra("url", url))

进入

try
ctw!!.startActivity(Intent(getActivity(ctw), 
MainActivity::class.java).putExtra("url", url))
   catch (e:Exception)
     e.printStackTrace()
   

【问题讨论】:

是的,亲爱的 您可以将此作为答案发布 【参考方案1】:

java.lang.NullPointerException: 尝试调用虚方法

您应该使用 Context 对象。一个Context 作为它的第一个参数(这是因为Activity 类是Context 的子类)。

lin_play.setOnClickListener 
    
        if (TextUtils.isEmpty(url)) 
            Toast.makeText(cont, "Invalid/Empty URL", Toast.LENGTH_SHORT).show()
         else 
            if (!url!!.isEmpty()) 
                startActivity(Intent(cont, MainActivity::class.java).putExtra("url", url))
                dialog.dismiss()
            
        

注意

    对于活动-->你可以设置你的上下文是--> this@Activity 姓名 对于片段 --> 使用getActivity()

示例

startActivity(Intent(getActivity(), MainActivity::class.java).putExtra("url", url))

【讨论】:

【参考方案2】:

在启动 Activity 时只需使用您的 Activity 上下文

startActivity(Intent(this@CurrentClassName, MainActivity::class.java).putExtra("url", url))

注意:在开始新的 Activity 之前关闭对话框是个好习惯

【讨论】:

【参考方案3】:

您使用了错误的上下文,在 Intent 中传递活动实例。

if (activity != null) 
    startActivity(Intent(activity, MainActivity::class.java).putExtra("url", url))

检查父活动是否为 null 以获得最佳实践。

【讨论】:

活动不为空。 应该对最佳实践进行空检查,代码中的问题是您使用了错误的上下文。

以上是关于无法从 BottomSheetDialog 启动Activity的主要内容,如果未能解决你的问题,请参考以下文章

如何在 BottomSheetDialog 中获取 ViewModel

Android MVVM框架搭建高德地图定位天气查询BottomSheetDialog

Android BottomSheetDialog设置背景透明无效?(解决)

Android BottomSheetDialog设置背景透明无效?(解决)

BottomSheetDialog和BottomSheetDialogFragment固定高度

BottomSheetDialog 内 VideoView 的 MediaController 隐藏在 BottomSheetDialog 后面