我有一个简单的EditorBloc
,其中包含连续显示的片段:
_loadBooks
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膨胀到相同的容器来显示计算结果?
答案 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)
}
我认为我不需要解释创建一个对象来保存单击的变量或按钮等。因此,我只为您保留了该部分的通用性。