如何在Android中将变量从片段传输到活动?

关于Android中如何将信息从片段(Fragment)传输到活动(Activity)的故事。 该信息对于初学者(初级),精通Android编程将非常有用,而对于中老年人来说则不太可能会有用。

启动IDE(集成开发环境) Android Studio 。 创建一个新项目:File-> New-> New Project。 选择“清空活动”,然后单击“下一步”。



填写“名称”,“包裹名称”,“保存位置”字段。



IDE将自动创建两个文件:“ java / [程序包名称]”目录中的“ MainActivity.java”和“ res / layout”目录中的“ activity_main.xml”。





Java文件确定应用程序的工作方式 ,即xml-它的外观 。 到目前为止,它仅执行“ setContentView(R.layout.activity_main);”操作,非常少。 此行告诉应用程序在启动时使用activity_main.xml布局。 并且,由于布局仅包含一个带有文本“ Hello World!”的“ TextView”类型的小部件,因此我们的应用程序看起来也非常适中。



在项目文件夹中,创建一个名称为“ Fragment1”的片段。





IDE将创建两个文件:“ Fragment1”和“ fragment_fragment1.xml”。





打开片段布局文件,并在欢迎行中删除我们不需要的“ TextView”小部件。



切换到设计模式,然后将(按钮)按钮拖到布局上。



IDE将创建一个标识符为“ button1”的按钮。



现在,编辑主要活动的布局,即 文件“ activity_main.xml”



将文本小部件移到更高位置,然后将我们创建的片段添加到布局中(为此,将“ <>”元素拖动到布局上,选择“ Fragment1”,然后单击“确定”)。



在片段设置的活动布局中,设置layout_height =“ wrap_content”,然后根据自己的喜好编辑其位置。 我们还将文本字段的标识符更改为“ textReport”,并将片段更改为“ fragmentWithButton”。



运行模拟器(Shift + F10),然后查看发生了什么。



该应用程序显示题词“ Hello World!”。 和按钮。 铭文来自活动 ,按钮属于一个片段 。 按下了按钮,但到目前为止没有任何作用。 让我们尝试对题词进行编程,以显示按钮按下的次数。 为此,我们需要发送一条有关片段到活动的按钮单击的消息

首先,我们将讲解片段以计算按钮单击的次数。 打开文件“ Fragment1.java”。



添加变量“ counter”。 在创建片段后立即调用的“ onCreateView”方法中,创建“侦听器”按钮。 IDE将要求实现View.OnClickListener-同意(Alt + Enter)。 让我们创建(定义)onClick方法,该方法每次单击按钮都会增加“ counter”变量的值,并显示一条弹出消息。



让我们检查一下模拟器(再次按Shift + F10)。 按下按钮将在应用程序屏幕的底部显示弹出消息“按钮的单击数:...”。



太好了,继续前进。 我们的主要目标是将信息(在这种情况下为单击按钮的次数)从片段实例传输到活动实例。 activities活动片段的生命周期有组织的,因此Android(几乎)不允许活动和片段直接进行通信,因此我们需要一个中介接口。 我们称他为“邮递员”(postman)。 该接口既可以在单独的文件中创建,也可以在带有片段代码的文件中创建; 我们将选择第一个选项。 我们的Postman界面将包含“ fragmentMail”的单个抽象方法(无“ body”)。



我们将使用变量“ numberOfClicks”作为“信封”将消息从片段传输到活动。

使用活动代码“ MainActivity.java”打开文件。 我们记得,它看起来像这样:



我们实现了Postman接口,并向该活动添加fragmentMail接口方法,并对其进行了重新定义( Override )。



现在,只要活动在变量“ numberOfClicks”中“看到”新值,它将在textReport文本字段中显示更新的消息。

但是我们仍然需要“把信放进信封”,即 将按钮的点击次数传递给变量。 我们在片段代码中执行此操作。 打开文件“ Fragment1.java”。

D̶o̶b̶a̶v̶l̶ya̶e̶m̶̶v̶̶p̶o̶d̶p̶i̶s̶̶̶k̶l̶a̶s̶s̶a̶̶i̶m̶p̶l̶e̶m̶e̶n̶t̶a̶ts̶i̶yu̶̶i̶n̶t̶e̶r̶f̶e̶y̶s̶a̶̶«邮递员»。IDE̶p̶o̶t̶r̶e̶b̶u̶e̶t̶̶p̶e̶r̶e̶o̶p̶r̶e̶d̶e̶l̶i̶t̶̶梅托德̶i̶n̶t̶e̶r̶f̶e̶y̶s̶a̶̶«̶f̶r̶a̶g̶m̶e̶n̶t̶M̶a̶i̶l̶»̶,̶没有̶d̶e̶l̶a̶t̶̶̶v̶NOM我NICHEGO NE̶b̶u̶d̶e̶m̶,̶̶p̶o̶e̶t̶o̶m̶u̶̶o̶s̶t̶a̶v̶i̶m̶自我TELO̶p̶u̶s̶t̶y̶m̶。 [已删除,请参阅“ 2019年4月20日的注释1”]

我们将需要一个指向活动实例的链接。 当片段附加到这样的活动时,我们将获得它:


在“ onClick”方法(单击片段的按钮时调用的方法相同)中,我们从活动实例向接口添加调用。



删除(为了简洁)注释后,片段的最终代码如下所示:


现在我们的片段计算按钮单击的次数 ,将其显示在弹出消息中,然后使用Postman界面将计数器变量的值传输到变量numberOfClicks ,该变量充当信封容器,用于从片段发送消息到活动。 收到新消息的活动立即将其显示在其小部件文本字段中,并带有标识符“ textReport”。 目标实现了!


PS:将编程语言从Java更改为Kotlin可以大大减少代码片段:



PPS:在此处下载项目文件: JavaKotlin

从04/20/2019的注释1:


Postman接口的实现已从片段代码中删除。
片段通过已经在其中实现该接口的活动来与该接口一起工作。
感谢mikaakim 发表评论
可以从上面链接的github下载更新的文件。

Source: https://habr.com/ru/post/zh-CN448744/


All Articles