问题描述
我正在创建一个启动器应用程序,我希望当用户启动该应用程序时,加载他先前添加的小部件。问题是,当我尝试在onCreate函数中加载Widget时,它崩溃,提示它找不到我的视图。
这是我的mainActivity.kt:
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
AppDatabase.init(this,AppDatabase::class.java,DATABASE_NAME) // Just DB stuff using room
widgetSelector = WidgetSelector(this)
// Fragment initialisation
homeScreen = HomeFragment()
appListScreen = AppListFragment(this,widgetSelector)
fragmentMgr = supportFragmentManager
pagerAdapter =
HomeAdapter(fragmentMgr)
pagerAdapter.addFragments(homeScreen)
pagerAdapter.addFragments(appListScreen)
homeViewPager.adapter = pagerAdapter
// End of fragment initialisation
widgetSelector.loadWidget() // /!\ This is the problematic line
}
这是loadWidget函数。每个小部件都已经存储在数据库中,我只是获取它们并尝试显示它们:
fun createWidget(id: Int) {
val appWidgetInfo: AppWidgetProviderInfo = appWidgetManager.getAppWidgetInfo(id)
val hostView: AppWidgetHostView =
appWidgetHost.createView(mainActivity,id,appWidgetInfo)
hostView.setAppWidget(id,appWidgetInfo)
mainActivity.findViewById<LinearLayout>(R.id.list_widget).addView(hostView) // /!\ This line is the problem again
}
fun loadWidget() {
AppDatabase.INSTANCE?.itemDAO()?.getAll()?.forEach {
createWidget(it.appWidgetId)
}
}
这是我尝试添加视图的基本片段
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/list_widget"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:background="@color/colorLMTBlueBlack">
</LinearLayout>
启动我的应用程序时出现此错误:
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.letmethink.lmtapp,PID: 28499
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.letmethink.lmtapp/com.letmethink.lmtapp.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.LinearLayout.addView(android.view.View)' on a null object reference
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3114)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3257)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1948)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:214)
at android.app.ActivityThread.main(ActivityThread.java:7050)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:494)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:965)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.LinearLayout.addView(android.view.View)' on a null object reference
at com.letmethink.lmtapp.widget.WidgetSelector.createWidget(WidgetSelector.kt:59)
at com.letmethink.lmtapp.widget.WidgetSelector.loadWidget(WidgetSelector.kt:71)
at com.letmethink.lmtapp.MainActivity.onCreate(MainActivity.kt:49)
at android.app.Activity.performCreate(Activity.java:7327)
at android.app.Activity.performCreate(Activity.java:7318)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1271)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3094)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3257)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
我已经尝试了许多操作,例如将addView移至mainActivity或尝试执行loadWidget函数onPostCreated()。我非常确定问题出在我正在使用片段的事实上,这就是为什么我尝试在片段的onCreateView中调用该函数,但是它没有用。我稍后会在代码中调用此函数(例如onResult),它可以正常工作。
override fun onActivityResult(
requestCode: Int,resultCode: Int,data: Intent?
) {
super.onActivityResult(requestCode,resultCode,data)
widgetSelector.reloadWidget()
val widgetSelector = WidgetSelector(this)
if (resultCode == Activity.RESULT_OK) {
val id = data!!.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID,-1)
if (requestCode == REQUEST_PICK_APPWIDGET) {
widgetSelector.configureWidget(id)
} else if (requestCode == REQUEST_CREATE_APPWIDGET) {
widgetSelector.createWidget(id)
}
AppDatabase.INSTANCE?.itemDAO()?.insert(Widget(id))
widgetSelector.reloadWidget()
} else if (resultCode == Activity.RESULT_CANCELED && data != null) {
val appWidgetId = data.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID,-1)
if (appWidgetId != -1) {
widgetSelector.appWidgetHost.deleteAppWidgetId(appWidgetId)
}
}
}
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)