如何将控制权从Fragment交还给Activity?

时间:2019-03-20 18:07:10

标签: android android-fragments android-activity kotlin

我有一个简单的EditorBloc,其中包含连续显示的片段:

  1. _loadBooks
  2. CalculatorActivity

为简单起见,假设我要计算两个数字的和。 我启动InputFragment //requests two input values for calclation,它立即通过以下方式加载ResultFragment // show the result of the calculation

CalculatorActivity

InputFragment是容器在其中插入片段的资源ID。 fun replaceFragment(resId : Int, newFragment : Fragment){ this.supportFragmentManager?.beginTransaction()?.replace(resId, newFragment)?.addToBackStack(null)?.commit() } 是要膨胀的新片段。在第一步中,我在这里调用resId的{​​{1}}:

newFragment

很好,效果很好。

但是,当我在CalculatorActivity中输入所需的数字时,如何将值从onCreate()转发回调用方replaceFragment(R.id.container, InputFragment.getInstance()),以便它可以继续并将ResultFragment膨胀到相同的容器来显示计算结果?

3 个答案:

答案 0 :(得分:0)

您始终可以从任何片段中获取封闭活动(通过使用getActivity),然后将其强制转换为正确的类型,并在其上使用您自己的setValues方法。看看这个:https://developer.android.com/training/basics/fragments/communicating

答案 1 :(得分:0)

您可以在活动中将值作为变量,并从片段中获取

from PyQt5 import QtCore, QtGui, QtWidgets

class Ui_MainWindow(object):

    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(277, 244)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 22))
        self.menubar.setObjectName("menubar")
        self.menuFile = QtWidgets.QMenu(self.menubar)
        self.menuFile.setObjectName("menuFile")
        MainWindow.setMenuBar(self.menubar)
        self.actionQuit = QtWidgets.QAction(MainWindow)
        self.actionQuit.setObjectName("actionQuit")
        self.actionQuit.setShortcut("Ctrl+Q")
        self.actionQuit.setStatusTip("Quit the application")
        self.menuFile.addAction(self.actionQuit)
        self.menubar.addAction(self.menuFile.menuAction())
        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.menuFile.setTitle(_translate("MainWindow", "File"))
        self.actionQuit.setText(_translate("MainWindow", "Quit"))

class MyWindow(QtWidgets.QMainWindow, Ui_MainWindow):
    def __init__(self, parent=None):
        super(MyWindow, self).__init__(parent)
        self.setupUi(self)
        self.actionQuit.triggered.connect(self.close)

    def closeEvent(self, event):
        print(event)
        result = QtWidgets.QMessageBox.question(self,
                      "Confirm Exit...",
                      "Are you sure you want to exit ?",
                      QtWidgets.QMessageBox.Yes| QtWidgets.QMessageBox.No)
        event.ignore()
        print(result)
        if result == QtWidgets.QMessageBox.Yes:
            event.accept()

if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    w = MyWindow()
    w.show()
    sys.exit(app.exec_())

答案 2 :(得分:0)

如果您正在学习并且这只是出于娱乐目的,那么可以随意将其直接投射到活动并访问其公共方法。但是,我永远不会在现实世界中这样做。

最佳做法是在父活动上使用接口实现。

示例: 接口类

interface IBaseActivityCallback {
    fun onInputValuesReady(myObjectOfValues: MyObject)
}

活动分类

class CalculatorActivity : AppCompatActivity(), IBaseActivityCallback {
     override fun onInputValuesReady(myObjectOfValues: MyObject){
          //handle inflate or usage of values
     }
}

片段类

lateinit var baseActivityCallback: IBaseActivityCallback

override fun onAttach(context: Context) {
     super.onAttach(context)
     //NOTE* wrap in try/catch if context can be something else
     baseActivityCallback = context as IBaseActivityCallback
}

fun someButtonClicked(){
    baseActivityCallback.onInputValuesReady(myObjectToPass)
}

我认为我不需要解释创建一个对象来保存单击的变量或按钮等。因此,我只为您保留了该部分的通用性。