我创建了一个待办事项列表应用程序。我添加了一个选项菜单来在白天和夜间模式之间切换,但有两个问题:
- 单击夜间模式只会更改应用程序的操作栏和周围环境,但不会更改应用程序本身
- 单击白天模式会关闭应用程序。我怎样才能让它工作?
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.todolistappd">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.AppCompat.DayNight.DarkActionBar">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
main_menu.xml
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/night_mode"
android:title="@string/night_mode"/>
</menu>
主题.xml
<resources xmlns:tools="http://schemas.android.com/tools">
<!-- Base application theme. -->
<style name="Theme.TodoListAppD" parent="Theme.AppCompat.DayNight.DarkActionBar">
<!-- Primary brand color. -->
<item name="colorPrimary">@color/purple_500</item>
<item name="colorPrimaryVariant">@color/purple_700</item>
<item name="colorOnPrimary">@color/white</item>
<!-- Secondary brand color. -->
<item name="colorSecondary">@color/teal_200</item>
<item name="colorSecondaryVariant">@color/teal_700</item>
<item name="colorOnSecondary">@color/black</item>
<!-- Status bar color. -->
<item name="android:statusBarColor" tools:targetApi="l">?attr/colorPrimaryVariant</item>
<!-- Customize your theme here. -->
</style>
</resources>
MainActivity.kt
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.view.Menu
import android.view.MenuItem
import android.view.View
import android.widget.EditText
import android.widget.ListView
import android.widget.Toast
import androidx.appcompat.app.AlertDialog
import androidx.appcompat.app.AppCompatDelegate
import com.google.android.material.floatingactionbutton.FloatingActionButton
import com.google.firebase.database.*
class MainActivity : AppCompatActivity() ,UpdateAndDelete {
lateinit var database:DatabaseReference
var toDoList: MutableList<ToDoModel>? = null
private lateinit var adapter: ToDoAdapter
private var listViewItem :ListView?=null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val fab=findViewById<View>(R.id.fab) as FloatingActionButton
listViewItem = findViewById(R.id.item_listView)
database = FirebaseDatabase.getInstance().reference
fab.setOnClickListener {
val alertDialog = AlertDialog.Builder(this)
val textEditText = EditText(this)
alertDialog.setMessage("Add TODO item")
alertDialog.setTitle("Enter To Do item")
alertDialog.setView(textEditText)
alertDialog.setPositiveButton("Add") { dialog, _ ->
val todoItemData = ToDoModel.createList()
todoItemData.itemDataText = textEditText.text.toString()
todoItemData.done = false
val newItemData= database.child("todo").push()
todoItemData.UID = newItemData.key
newItemData.setValue(todoItemData)
dialog.dismiss()
Toast.makeText(this, "item saved",Toast.LENGTH_LONG).show()
}
alertDialog.show()
}
toDoList= mutableListOf()
adapter= ToDoAdapter(this, toDoList!!)
listViewItem!!.adapter=adapter
database.addValueEventListener(object : ValueEventListener {
override fun onDataChange(snapshot: DataSnapshot) {
toDoList!!.clear()
addItemToList(snapshot)
}
override fun onCancelled(error: DatabaseError) {
Toast.makeText(applicationContext,"No item Added",Toast.LENGTH_LONG).show()
}
})
}
override fun onCreateOptionsMenu(menu: Menu?): Boolean {
menuInflater.inflate(R.menu.main_menu, menu)
val nightMode = AppCompatDelegate.getDefaultNightMode()
if (nightMode == AppCompatDelegate.MODE_NIGHT_YES){
menu?.findItem(R.id.night_mode)?.setTitle(R.string.day_mode)
} else{
menu?.findItem(R.id.night_mode)?.setTitle(R.string.night_mode)
}
return true
}
override fun onOptionsItemSelected(item: MenuItem): Boolean {
if(item.itemId ==R.id.night_mode){
val nightMode = AppCompatDelegate.getDefaultNightMode()
if (nightMode == AppCompatDelegate.MODE_NIGHT_YES) {
AppCompatDelegate.setDefaultNightMode(
AppCompatDelegate.MODE_NIGHT_NO)
} else {
AppCompatDelegate.setDefaultNightMode(
AppCompatDelegate.MODE_NIGHT_YES)
}
}
recreate()
return true
}
private fun addItemToList(snapshot: DataSnapshot) {
val items = snapshot.children.iterator()
if (items.hasNext()) {
val toDoIndexedValue = items.next()
val itemsIterator = toDoIndexedValue.children.iterator()
while (itemsIterator.hasNext()) {
val currentItem = itemsIterator.next()
val toDoItemData= ToDoModel.createList()
val map =currentItem.value as HashMap<*, *>
toDoItemData.UID = currentItem.key
toDoItemData.done= map["done"] as Boolean?
toDoItemData.itemDataText= map["itemDataText"] as String?
toDoList!!.add(toDoItemData)
}
}
adapter.notifyDataSetChanged()
}
override fun modifyItem(itemUID: String, isDone: Boolean) {
val itemReference =database.child("todo").child(itemUID)
itemReference.child("done").setValue(isDone)
}
override fun onItemDelete(itemUID: String) {
val itemReference =database.child("todo").child(itemUID)
itemReference.removeValue()
adapter.notifyDataSetChanged()
}
}
我认为整个白色部分也会变成夜间模式。我怎么做?以及如何在不关闭应用程序的情况下让应用程序切换回白天模式?