Android 碎片学习 之 如何在碎片调用Activity中的方法来进行赋值操作
Overview
Fragment表示FragmentActivity中的行为或界面的一部分。您可以在一个 Activity 中组合多个片段,从而构建多窗格界面,并在多个 Activity 中重复使用某个片段。您可以将片段视为 Activity 的模块化组成部分,它具有自己的生命周期,能接收自己的输入事件,并且您可以在 Activity 运行时添加或移除片段(这有点像可以在不同 Activity 中重复使用的“子 Activity”)。 片段必须始终托管在 Activity 中,其生命周期直接受宿主 Activity 生命周期的影响。例如,当 Activity 暂停时,Activity 的所有片段也会暂停;当 Activity 被销毁时,所有片段也会被销毁。不过,当 Activity 正在运行(处于*已恢复*[生命周期状态](https://developer.android.com/guide/components/activities#Lifecycle))时,您可以独立操纵每个片段,如添加或移除片段。当执行此类片段事务时,您也可将其添加到由 Activity 管理的返回栈 — Activity 中的每个返回栈条目都是一条已发生片段事务的记录。借助返回栈,用户可以通过按*返回*按钮撤消片段事务(后退)。 当您将片段作为 Activity 布局的一部分添加时,其位于 Activity 视图层次结构的某个ViewGroup中,并且片段会定义其自己的视图布局。您可以通过在 Activity 的布局文件中声明片段,将其作为 `` 元素插入您的 Activity 布局,或者通过将其添加到某个现有的 [ViewGroup`](https://developer.android.com/reference/android/view/ViewGroup),利用应用代码将其插入布局。
这个是来自Android 官方的解释。但是在这几天的开发中遇到了一个非常尴尬的的问题。一个关于Fragment 和Activity的通信问题。
是什么问题?
这个就是我开发阶段的问题所在了。
在主界面的底部有一个TextView需要实时的先是当前购物车的数量和总价钱。
但是添加操作在Fragment中进行的。我的添加方法在主界面的活动中,添加需要调用这个方法。但是如果调用在对TextView赋值的时候会出错。
这个就是错误代码。简单来说就是空指针异常。看看我之前的调用是如何实现的:
new PublicActivity().addToShoppingCar(...);
可以看到在这里我就是直接new了个对象,然后直接调用添加方法。这样的操作他的计算是可以实现的,但是一旦你执行赋值等UI操作就会出现空指针错误。
这该如何解决?
你可以去百度一波Android Fragment 和 Activity间通信
随便找一个看看都是说要getActivity。
getActivity是什么?
大概意思为:返回一个和此fragment绑定的FragmentActivity或者其子类的实例。相反,如果此fragment绑定的是一个context的话,可能会返回null。
如何正确的操作Fragment 对Activity的UI操作
那就是需要先获取Activity啦。
看看我们的代码:
PublicActivity publicActivity = (PublicActivity) getActivity();
assert publicActivity != null;
publicActivity.addToShoppingCar(info.getFoodId(), info.getPrice(), info.getFoodName());
这个就是我们的操作代码了。非常的简单,就是先获取我们的被操作的Activity然后通过获取到的Activity去调用我们的操作代码。这样他就可以啦。
源代码贴一下
调用代码
view.findViewById(R.id.img_addToShoppingCar).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
PublicActivity publicActivity = (PublicActivity) getActivity();
assert publicActivity != null;
publicActivity.addToShoppingCar(info.getFoodId(), info.getPrice(), info.getFoodName());
}
});
被调用代码
@Override
public void addToShoppingCar(String FoodId, String Price, String FoodName) {
Session.shoppingCarList.add(new ShoppingCartEntity(FoodId, FoodName, Price));
this.txtShoppingCarNum.setText(new PublicPresenterImpl().getShoppingCarInfo());
}
//------一条华丽的分割线------//
@Override
public String getShoppingCarInfo() {
int totalPrice = 0;
for (ShoppingCartEntity shoppingCartEntity : Session.shoppingCarList) {
totalPrice += Integer.valueOf(shoppingCartEntity.getFoodPrice());
}
return "Total " + Session.shoppingCarList.size() + ",$" + totalPrice;
}
OK 就这样都散了吧