我正在开发一个应用程序,要求用户输入任务的名称,描述...,但当用户打算离开编辑页面而不保存任务时,我需要弹出一个对话框来确认离开,所以如果他点击放弃更改,他必须返回到应用程序的主页,否则他将停留在同一页面。
我有这个问题,当用户点击放弃更改对话框解散,他停留在编辑页面。
- 主要活动. kt**
package muhabalafandi.example.tasktimer
import android.content.res.Configuration
import android.os.Bundle
import android.util.Log
import android.view.Menu
import android.view.MenuItem
import android.view.View
import androidx.appcompat.app.AppCompatActivity
import androidx.fragment.app.Fragment
import kotlinx.android.synthetic.main.activity_main.*
import kotlinx.android.synthetic.main.content_main.*
private const val TAG = "MainActivity"
private const val DIALOG_ID_CANCEL_EDIT = 1
class MainActivity : AppCompatActivity(), AddEditFragment.OnSaveClicked,
MainActivityFragment.OnTaskEdit,
AppDialog.DialogEvents {
// Whether or the activity is in 2-pane mode
// i.e. running in landscape, or on a tablet.
private var mTwoPane = false
override fun onCreate(savedInstanceState: Bundle?) {
Log.d(TAG, "onCreate: starts")
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
setSupportActionBar(toolbar)
mTwoPane = resources.configuration.orientation == Configuration.ORIENTATION_LANDSCAPE
Log.d(TAG, "onCreate: twoPane is $mTwoPane")
val fragment = findFragmentById(R.id.task_details_container)
if (fragment != null) {
// There was an existing fragment to edit a task, make sure the panes are set correctly
showEditPane()
} else {
task_details_container.visibility = if (mTwoPane) View.INVISIBLE else View.GONE
mainFragment.visibility = View.VISIBLE
}
Log.d(TAG, "onCreate: finished")
}
private fun showEditPane() {
task_details_container.visibility = View.VISIBLE
// hide the left hand pane, if in single pane view
mainFragment.visibility = if (mTwoPane) View.VISIBLE else View.GONE
}
private fun removeEditPane(fragment: Fragment? = null) {
Log.d(TAG, "removeEditPane called")
if (fragment != null) {
// supportFragmentManager.beginTransaction()
// .remove(fragment)
// .commit()
removeFragment(fragment)
}
// Set the visibility of the right hand pane
task_details_container.visibility = if (mTwoPane) View.INVISIBLE else View.GONE
// and show the left hand pane
mainFragment.visibility = View.VISIBLE
supportActionBar?.setDisplayHomeAsUpEnabled(false)
}
override fun onSaveClicked() {
Log.d(TAG, "onSaveClicked: called")
removeEditPane(findFragmentById(R.id.task_details_container))
}
override fun onCreateOptionsMenu(menu: Menu): Boolean {
// Inflate the menu; this adds items to the action bar if it is present.
menuInflater.inflate(R.menu.menu_main, menu)
return true
}
override fun onOptionsItemSelected(item: MenuItem): Boolean {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
when (item.itemId) {
R.id.menuMain_addTask -> taskEditRequest(null)
// R.id.menuMain_settings -> true
android.R.id.home -> {
Log.d(TAG, "onOptionsItemSelected: home button pressed")
val fragment = findFragmentById(R.id.task_details_container)
// removeEditPane(fragment)
if ((fragment is AddEditFragment) && fragment.isDirty()) {
showConfirmationDialog(
DIALOG_ID_CANCEL_EDIT,
getString(R.string.cancelEditDialogMessage),
R.string.cancelEditDialogPositiveCaption,
R.string.cancelEditDialogNegativeCaption
)
Log.d(TAG, "dialogId : $DIALOG_ID_CANCEL_EDIT")
} else {
removeEditPane(fragment)
}
}
}
return super.onOptionsItemSelected(item)
}
override fun onTaskEdit(task: Task) {
taskEditRequest(task)
}
private fun taskEditRequest(task: Task?) {
Log.d(TAG, "taskEditRequest: starts")
// Create a new fragment to edit the task
// val newFragment = AddEditFragment.newInstance(task)
// supportFragmentManager.beginTransaction()
// .replace(R.id.task_details_container, newFragment)
// .commit()
replaceFragment(AddEditFragment.newInstance(task), R.id.task_details_container)
showEditPane()
Log.d(TAG, "Exiting taskEditRequest")
}
override fun onBackPressed() {
val fragment = findFragmentById(R.id.task_details_container)
if (fragment == null || mTwoPane) {
super.onBackPressed()
} else {
// removeEditPane(fragment)
if ((fragment is AddEditFragment) && fragment.isDirty()) {
showConfirmationDialog(
DIALOG_ID_CANCEL_EDIT,
getString(R.string.cancelEditDialogMessage),
R.string.cancelEditDialogPositiveCaption,
R.string.cancelEditDialogNegativeCaption
)
} else {
removeEditPane(fragment)
}
}
}
override fun onPositiveDialogResult(dialogId: Int, args: Bundle) {
Log.d(TAG, "onPositiveDialogResult: called with dialogId $dialogId")
if (dialogId == DIALOG_ID_CANCEL_EDIT) {
val fragment = findFragmentById(R.id.task_details_container)
removeEditPane(fragment)
}
}
override fun onStart() {
Log.d(TAG, "onStart: called")
super.onStart()
}
override fun onRestoreInstanceState(savedInstanceState: Bundle) {
Log.d(TAG, "onRestoreInstanceState: called")
super.onRestoreInstanceState(savedInstanceState)
}
override fun onResume() {
Log.d(TAG, "onResume: called")
super.onResume()
}
override fun onPause() {
Log.d(TAG, "onPause: called")
super.onPause()
}
override fun onSaveInstanceState(outState: Bundle) {
Log.d(TAG, "onSaveInstanceState: called")
super.onSaveInstanceState(outState)
}
override fun onStop() {
Log.d(TAG, "onStop: called")
super.onStop()
}
override fun onDestroy() {
Log.d(TAG, "onDestroy: called")
super.onDestroy()
}
}
- 应用程序对话框. kt**
package muhabalafandi.example.tasktimer
import android.app.AlertDialog
import android.app.Dialog
import android.content.Context
import android.content.DialogInterface
import android.os.Bundle
import android.util.Log
import androidx.fragment.app.DialogFragment
private const val TAG = "AppDialog"
const val DIALOG_ID = "id"
const val DIALOG_MESSAGE = "message"
const val DIALOG_POSITIVE_RID = "positive_rid"
const val DIALOG_NEGATIVE_RID = "negative_rid"
class AppDialog : DialogFragment() {
private var dialogEvents: DialogEvents? = null
internal interface DialogEvents {
fun onPositiveDialogResult(dialogId: Int, args: Bundle)
// fun onNegativeDialogResult(dialogId: Int, args: Bundle)
// fun onDialogCancelled(dialogId: Int)
}
override fun onAttach(context: Context) {
Log.d(TAG, "onAttach called: context is $context")
super.onAttach(context)
// Activities/Fragments containing this fragment must implement its callbacks.
dialogEvents = try {
// Is there a parent fragment? If so, that will be what we call back
parentFragment as? DialogEvents
} catch (e: TypeCastException) {
try {
// No parent fragment, so call back the Activity instead
context as DialogEvents
} catch (e: ClassCastException) {
// Activity doesn't implement the interface
throw ClassCastException("Activity $context must implement AppDialog.DialogEvents interface")
}
} catch (e: ClassCastException) {
// Parent fragment doesn't implement the interface
throw ClassCastException("Fragment $parentFragment must implement AppDialog.DialogEvents interface")
}
}
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
Log.d(TAG, "onCreateDialog called")
val builder = AlertDialog.Builder(requireContext())
// fix "smart cast to Bundle is impossible, because 'arguments' is a mutable property that could have been changed by this time"
val arguments = arguments
val dialogId: Int
val messageString: String?
var positiveStringId: Int
var negativeStringId: Int
if (arguments != null) {
dialogId = arguments.getInt(DIALOG_ID)
messageString = arguments.getString(DIALOG_MESSAGE)
if (dialogId == 0 || messageString == null) {
throw IllegalArgumentException("DIALOG_ID and/or DIALOG_MESSAGE not present in the bundle")
}
positiveStringId = arguments.getInt(DIALOG_POSITIVE_RID)
if (positiveStringId == 0) {
positiveStringId = R.string.ok
}
negativeStringId = arguments.getInt(DIALOG_NEGATIVE_RID)
if (negativeStringId == 0) {
negativeStringId = R.string.cancel
}
} else {
throw IllegalArgumentException("Must pass DIALOG_ID and DIALOG_MESSAGE in the bundle")
}
return builder.setMessage(messageString).setPositiveButton(positiveStringId) { _, _ ->
// callback positive result function
dialogEvents?.onPositiveDialogResult(dialogId, arguments)
}.setNegativeButton(negativeStringId) { _, _ ->
// callback negative result function, if you want to implement it.
// dialogEvents?.onNegativeDialogResult(dialogId, arguments)
}.create()
}
override fun onDetach() {
Log.d(TAG, "onDetach called")
super.onDetach()
// Reset the active callbacks interface, because we're no longer attached.
dialogEvents = null
}
override fun onCancel(dialog: DialogInterface) {
Log.d(TAG, "onCancel called")
val dialogId = requireArguments().getInt(DIALOG_ID)
// dialogEvents?.onDialogCancelled(dialogId)
}
}
1条答案
按热度按时间vdgimpew1#