Android基础查漏补缺之Fragment(2)

上一篇讲了Fragment的一些基本用法和生命周期,这一篇简单过一下Fragment的通信,包括Activity向Fragment传参,Fragment和Activity之间相互通信,以及Fragment之间的相互通信。

用这么一个示例来展示全部五部分的内容。App启动后先是只有左边三分之一的布局(这是直接定义在Activity的布局文件中的),点击“加在Fragment并向其传参”按钮,会把中间和右边剩下三分之二的布局(位于两个Fragment中)加载上来,加载的同时传递左边布局文本框中填写的字符串。点击左边布局中的“获取Fragment1中填写的值”按钮可以拿到中间布局文本框的值,类似的点击中间布局中的“获取Activity中填写的值”按钮可以拿到左边布局文本框中的值。最后点击中间或右边布局中的“获取FragmentX中填写的值”,会分别用两种方法去取得右边或中间布局文本框中的值。

一、向Fragment时传参

注意到Fragment类中的setArguments()和getArguments()方法了吗?将要传递的参数放进Bundle中,即可实现启动Fragment时传参,就像这样。

Bundle bundle = new Bundle();
bundle.putString("param", editText.getText().toString());
fragment1.setArguments(bundle);
getArguments().getString("param");
第一段代码是传递参数,第二段代码是取出参数,当然并不一定要在Fragment被创建后立即取出参数——直到销毁前,任何地方都是可以的,不过传递参数就有要求了,一般放在Fragment构造之后。

二、Activity获取Fragment中的值

要拿到Fragment中某个EditText中填写的内容,自然要先拿到Fragment本身,然后拿到Fragment绑定的View,接着才能像以前那样,用findViewById找到其中的EditText并进行进一步操作。要拿到Fragment绑定的View,观察发现Fragment类中有一个getView()方法返回的就是这个Fragment的根布局(其实就是onCreateView()方法返回的那个咯)。而要拿到Fragment本身,回想之前我们在动态更改Fragment时用过一个叫做FragmentManager的东西,所有与当前Activity关联的Fragment都归它管理,自然就可以从它这拿到已经添加的Fragment,方法又有两种,一是findFragmentById()方法,二是findFragmentByTag()方法,两者的区别就在于一个是通过android:id去寻找,另一个则是通过在添加Fragment时设置的TAG去查找。这里以通过TAG查找为例。

View view = getFragmentManager().findFragmentByTag("fragment1").getView();
EditText editText = (EditText) view.findViewById(R.id.editText);
editText.getText().toString().trim();
三、Fragment获取Activity中的值

同样是在前一篇中用过Fragment的一个方法——getActivity(),当时是用在一个需要传入Context的地方,因为Activity本身就继承自Context。现在,类比刚刚Activity获取Fragment中的值时需要先拿到Fragment,反过来Fragment获取Activity中的值自然就要先获取到Activity,然后又是findViewById……

EditText editText = (EditText) getActivity().findViewById(R.id.editText);
editText.getText().toString();
四、Fragment间相互通信

前三节阐述的都是Activity和Fragment之间的通信,这一节则是关于Fragment间的通信。方法有两种,第一种和前面的很相似,就是想办法拿到要通信的另一个Fragment,然后不就和Activity获取Fragment中的值一样了吗?不要想说因为Fragment是归Activity用FragmentManager管理的,其实在Fragment中同样有getFragmentManager()方法(观察的更仔细的话会发现,其实这里返回的FragmentManager和与它关联的Activity返回的是同一个),我们就可以用这样的办法拿到另一个Fragment,代码实现和第二节几乎是一模一样的。

不过,Google在其教程中推荐另一种方法——回调接口,具体的做法和一般Java开发时定义回调是一样的,但这里的例子和官方教程略有不同。

定义接口(Fragment1类中)

public void setCallback(Callback callback) {
    EditText editText = (EditText) getView().findViewById(R.id.editText);
    callback.getValue(editText.getText().toString());
}

public interface Callback {
    public void getValue(String value);
}
实现接口(Fragment2类中)

fragment1.setCallback(new Fragment1.Callback() {
    @Override
    public void getValue(String value) {
        TextView textView1 = (TextView) view.findViewById(R.id.textView1);
        textView1.append(value);
    }
});

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
图像识别技术在病虫害检测中的应用是一个快速发展的领域,它结合了计算机视觉和机器学习算法来自动识别和分类植物上的病虫害。以下是这一技术的一些关键步骤和组成部分: 1. **数据收集**:首先需要收集大量的植物图像数据,这些数据包括健康植物的图像以及受不同病虫害影响的植物图像。 2. **图像预处理**:对收集到的图像进行处理,以提高后续分析的准确性。这可能包括调整亮度、对比度、去噪、裁剪、缩放等。 3. **特征提取**:从图像中提取有助于识别病虫害的特征。这些特征可能包括颜色、纹理、形状、边缘等。 4. **模型训练**:使用机器学习算法(如支持向量机、随机森林、卷积神经网络等)来训练模型。训练过程中,算法会学习如何根据提取的特征来识别不同的病虫害。 5. **模型验证和测试**:在独立的测试集上验证模型的性能,以确保其准确性和泛化能力。 6. **部署和应用**:将训练好的模型部署到实际的病虫害检测系统中,可以是移动应用、网页服务或集成到智能农业设备中。 7. **实时监测**:在实际应用中,系统可以实时接收植物图像,并快速给出病虫害的检测结果。 8. **持续学习**:随着时间的推移,系统可以不断学习新的病虫害样本,以提高其识别能力。 9. **用户界面**:为了方便用户使用,通常会有一个用户友好的界面,显示检测结果,并提供进一步的指导或建议。 这项技术的优势在于它可以快速、准确地识别出病虫害,甚至在早期阶段就能发现问题,从而及时采取措施。此外,它还可以减少对化学农药的依赖,支持可持续农业发展。随着技术的不断进步,图像识别在病虫害检测中的应用将越来越广泛。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值