我正在创建一个食品订购应用程序。当我切换到深色模式时,应用程序崩溃了
I am creating a food orderin app. When I switch to dark mode, the app is crashing
我已经在 MainFragment.kt.Please 中发布了完整的代码,请查看。
lateinit var recl_view:RecyclerView
lateinit var progress_bar:RelativeLayout
var list =ArrayList<DataList>()
lateinit var no_net:ImageView
lateinit var refresh:SwipeRefreshLayout
lateinit var search_bar:EditText
lateinit var appbar:AppBarLayout
lateinit var nav_view:NavigationView
var asc = true
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
val view = inflater.inflate(R.layout.fragment_main, container, false)
setHasOptionsMenu(true)
search_bar = view.findViewById(R.id.main_search_bar)
refresh = view.findViewById(R.id.main_frg_swipe_refresh)
search_bar.setHint("Search Restaurants")
no_net = view.findViewById(R.id.main_frg_no_net)
appbar = view.findViewById(R.id.main_frg_appbar)
progress_bar = view.findViewById(R.id.frg_main_prgs)
nav_view = requireActivity().findViewById(R.id.main_navigation_view) as NavigationView
nav_view.setCheckedItem(R.id.home_select)
if(Connection().checkConnectivity(activity as Context)) {
no_net.visibility = View.GONE
appbar.visibility = View.VISIBLE
val q = Volley.newRequestQueue(activity as Context)
val url = "http://13.235.250.119/v2/restaurants/fetch_result/"
try{
progress_bar.visibility = View.VISIBLE
val jsonreq = object : JsonObjectRequest(
Request.Method.GET,url,null,
Response.Listener {
if(it.getJSONObject("data").getBoolean("success")){
list = arrayListOf<DataList>()
val data = it.getJSONObject("data").getJSONArray("data")
for(i in 0 until data.length()){
list.add(
DataList(
data.getJSONObject(i).getString("id"),
data.getJSONObject(i).getString("name"),
data.getJSONObject(i).getString("rating"),
data.getJSONObject(i).getString("cost_for_one"),
data.getJSONObject(i).getString("image_url")
)
)
}
recl_view = view.findViewById(R.id.frg_main_rec_view)
recl_view.layoutManager = LinearLayoutManager(activity)
recl_view.adapter = MainAdapter(activity as Context,list)
progress_bar.visibility = View.GONE
}
},
Response.ErrorListener {
appbar.visibility = View.GONE
progress_bar.visibility = View.GONE
Toast.makeText(activity as Context,"Please Try Again Later.", Toast.LENGTH_SHORT).show()
}){
override fun getHeaders(): MutableMap<String, String> {
val headers = HashMap<String, String>()
headers["Content-type"] = "application/json"
headers["token"] = "c3acf1e14c21f9"
return headers
}
}
q.add(jsonreq)
}catch (e: Exception){
appbar.visibility = View.GONE
progress_bar.visibility = View.GONE
Toast.makeText(activity as Context,"Please Try Again Later.", Toast.LENGTH_SHORT).show()
}
}
else{
appbar.visibility = View.GONE
Toast.makeText(activity as Context,"Please Check your Internet Connection", Toast.LENGTH_SHORT).show()
no_net.visibility = View.VISIBLE
}
search_bar.addTextChangedListener(object :TextWatcher{
override fun afterTextChanged(p0: Editable?) {
}
override fun beforeTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {
}
override fun onTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {
val listData = arrayListOf<DataList>()
for (i in 0 until list.size) {
if (list[i].name.toLowerCase()
.contains(search_bar.text.toString().toLowerCase()) ||
list[i].cost_for_one.contains(search_bar.text.toString()) ||
list[i].rating.contains(search_bar.text.toString())
) {
listData.add(list[i])
}
}
recl_view.adapter = MainAdapter(activity as Context, listData)
(recl_view.adapter as MainAdapter).notifyDataSetChanged()
}
}
)
refresh.setOnRefreshListener {
getFragmentManager()?.beginTransaction()?.detach(this)?.attach(this)?.commit()
}
return view
}
override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
if(Connection().checkConnectivity(activity as Context)) {
MenuInflater(activity as Context).inflate(R.menu.app_bar_menu, menu)
return super.onCreateOptionsMenu(menu, inflater)
}
此处显示错误
Process: com.example.foodly, PID: 9860
kotlin.UninitializedPropertyAccessException: lateinit property recl_view has not been initialized
at com.example.foodly.fragments.MainFragment.getRecl_view(MainFragment.kt:32)
at com.example.foodly.fragments.MainFragment$onCreateView.onTextChanged(MainFragment.kt:126)
at android.widget.TextView.sendOnTextChanged(TextView.java:11785)
at android.widget.TextView.setText(TextView.java:6965)
at android.widget.TextView.setText(TextView.java:6761)
at android.widget.EditText.setText(EditText.java:145)
at android.widget.TextView.setText(TextView.java:6713)
at android.widget.TextView.onRestoreInstanceState(TextView.java:6580)
at android.view.View.dispatchRestoreInstanceState(View.java:22288)
at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:4805)
at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:4805)
at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:4805)
at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:4805)
at android.view.View.restoreHierarchyState(View.java:22266)
at androidx.fragment.app.Fragment.restoreViewState(Fragment.java:639)
at androidx.fragment.app.Fragment.restoreViewState(Fragment.java:3010)
at androidx.fragment.app.Fragment.performActivityCreated(Fragment.java:3001)
仅当我们从深色模式切换到浅色模式或从深色模式切换到浅色模式时才会显示此错误。
您需要将 recl_view
变量的赋值移动到网络请求回调之外,并移至 onCreateView
的主体中,例如:
...
nav_view = requireActivity().findViewById(R.id.main_navigation_view) as NavigationView
nav_view.setCheckedItem(R.id.home_select)
recl_view = view.findViewById(R.id.frg_main_rec_view)
if(Connection().checkConnectivity(activity as Context)) {
no_net.visibility = View.GONE
...
这是因为在重新创建视图时(例如,旋转时,或切换 dark/light 模式时)会调用附加到 search_bar
的 TextWatcher
的 onTextChanged
方法此方法访问 recl_view
,但只有在您的网络请求完成后才会初始化。
我已经在 MainFragment.kt.Please 中发布了完整的代码,请查看。
lateinit var recl_view:RecyclerView
lateinit var progress_bar:RelativeLayout
var list =ArrayList<DataList>()
lateinit var no_net:ImageView
lateinit var refresh:SwipeRefreshLayout
lateinit var search_bar:EditText
lateinit var appbar:AppBarLayout
lateinit var nav_view:NavigationView
var asc = true
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
val view = inflater.inflate(R.layout.fragment_main, container, false)
setHasOptionsMenu(true)
search_bar = view.findViewById(R.id.main_search_bar)
refresh = view.findViewById(R.id.main_frg_swipe_refresh)
search_bar.setHint("Search Restaurants")
no_net = view.findViewById(R.id.main_frg_no_net)
appbar = view.findViewById(R.id.main_frg_appbar)
progress_bar = view.findViewById(R.id.frg_main_prgs)
nav_view = requireActivity().findViewById(R.id.main_navigation_view) as NavigationView
nav_view.setCheckedItem(R.id.home_select)
if(Connection().checkConnectivity(activity as Context)) {
no_net.visibility = View.GONE
appbar.visibility = View.VISIBLE
val q = Volley.newRequestQueue(activity as Context)
val url = "http://13.235.250.119/v2/restaurants/fetch_result/"
try{
progress_bar.visibility = View.VISIBLE
val jsonreq = object : JsonObjectRequest(
Request.Method.GET,url,null,
Response.Listener {
if(it.getJSONObject("data").getBoolean("success")){
list = arrayListOf<DataList>()
val data = it.getJSONObject("data").getJSONArray("data")
for(i in 0 until data.length()){
list.add(
DataList(
data.getJSONObject(i).getString("id"),
data.getJSONObject(i).getString("name"),
data.getJSONObject(i).getString("rating"),
data.getJSONObject(i).getString("cost_for_one"),
data.getJSONObject(i).getString("image_url")
)
)
}
recl_view = view.findViewById(R.id.frg_main_rec_view)
recl_view.layoutManager = LinearLayoutManager(activity)
recl_view.adapter = MainAdapter(activity as Context,list)
progress_bar.visibility = View.GONE
}
},
Response.ErrorListener {
appbar.visibility = View.GONE
progress_bar.visibility = View.GONE
Toast.makeText(activity as Context,"Please Try Again Later.", Toast.LENGTH_SHORT).show()
}){
override fun getHeaders(): MutableMap<String, String> {
val headers = HashMap<String, String>()
headers["Content-type"] = "application/json"
headers["token"] = "c3acf1e14c21f9"
return headers
}
}
q.add(jsonreq)
}catch (e: Exception){
appbar.visibility = View.GONE
progress_bar.visibility = View.GONE
Toast.makeText(activity as Context,"Please Try Again Later.", Toast.LENGTH_SHORT).show()
}
}
else{
appbar.visibility = View.GONE
Toast.makeText(activity as Context,"Please Check your Internet Connection", Toast.LENGTH_SHORT).show()
no_net.visibility = View.VISIBLE
}
search_bar.addTextChangedListener(object :TextWatcher{
override fun afterTextChanged(p0: Editable?) {
}
override fun beforeTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {
}
override fun onTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {
val listData = arrayListOf<DataList>()
for (i in 0 until list.size) {
if (list[i].name.toLowerCase()
.contains(search_bar.text.toString().toLowerCase()) ||
list[i].cost_for_one.contains(search_bar.text.toString()) ||
list[i].rating.contains(search_bar.text.toString())
) {
listData.add(list[i])
}
}
recl_view.adapter = MainAdapter(activity as Context, listData)
(recl_view.adapter as MainAdapter).notifyDataSetChanged()
}
}
)
refresh.setOnRefreshListener {
getFragmentManager()?.beginTransaction()?.detach(this)?.attach(this)?.commit()
}
return view
}
override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
if(Connection().checkConnectivity(activity as Context)) {
MenuInflater(activity as Context).inflate(R.menu.app_bar_menu, menu)
return super.onCreateOptionsMenu(menu, inflater)
}
此处显示错误
Process: com.example.foodly, PID: 9860 kotlin.UninitializedPropertyAccessException: lateinit property recl_view has not been initialized at com.example.foodly.fragments.MainFragment.getRecl_view(MainFragment.kt:32) at com.example.foodly.fragments.MainFragment$onCreateView.onTextChanged(MainFragment.kt:126) at android.widget.TextView.sendOnTextChanged(TextView.java:11785) at android.widget.TextView.setText(TextView.java:6965) at android.widget.TextView.setText(TextView.java:6761) at android.widget.EditText.setText(EditText.java:145) at android.widget.TextView.setText(TextView.java:6713) at android.widget.TextView.onRestoreInstanceState(TextView.java:6580) at android.view.View.dispatchRestoreInstanceState(View.java:22288) at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:4805) at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:4805) at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:4805) at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:4805) at android.view.View.restoreHierarchyState(View.java:22266) at androidx.fragment.app.Fragment.restoreViewState(Fragment.java:639) at androidx.fragment.app.Fragment.restoreViewState(Fragment.java:3010) at androidx.fragment.app.Fragment.performActivityCreated(Fragment.java:3001)
仅当我们从深色模式切换到浅色模式或从深色模式切换到浅色模式时才会显示此错误。
您需要将 recl_view
变量的赋值移动到网络请求回调之外,并移至 onCreateView
的主体中,例如:
...
nav_view = requireActivity().findViewById(R.id.main_navigation_view) as NavigationView
nav_view.setCheckedItem(R.id.home_select)
recl_view = view.findViewById(R.id.frg_main_rec_view)
if(Connection().checkConnectivity(activity as Context)) {
no_net.visibility = View.GONE
...
这是因为在重新创建视图时(例如,旋转时,或切换 dark/light 模式时)会调用附加到 search_bar
的 TextWatcher
的 onTextChanged
方法此方法访问 recl_view
,但只有在您的网络请求完成后才会初始化。