在Activity中初始化一次类,并在其所有片段和相关弹出窗口中使用

时间:2018-06-12 09:01:39

标签: java android

例如,我有一个名为Abc的类,我在其中定义了所有可能的方法。

我只是在我的一个Activity中初始化类,并将实例传递给它的所有片段(通过bundle),弹出窗口(使用constructure参数)等来调用/使用这些可能的方法。

我很想知道,有没有办法我只在Activity中初始化Abc类,并且能够在不传递参数的情况下访问所有片段和相关弹出窗口中的实例。

更新

让我解释一下这个问题。

我已将所有结算信息写在名为BillingManager的类中。我已经在我的一个MainActivity中初始化了BillingManager,如:

BillingManager billingManager = new BillingManager(context, callback);

此处上下文是当前上下文,回调只是在MainActivity内更新内容时更新BillingManager(例如Billing_Completed,User_Cancelled等)。

直到这里这很好。但是如果我想在MainActivity的相关Adapters,Fragments,Dialogs中使用BillingManager实例,那么我需要将MainActivity中的BillingManager实例传递给相关的Adapters,Fragments和Dialogs等,如:

对于碎片:

Fragment appFrag = AppItemFragment.newInstance(billingManager);

对于对话框和适配器:

ListAdapter adapter = new ListAdapter(Context, billingManager);

MyDialog dialog = MyDialog(Context, billingManager);

然后我只能在其他区域使用BillingManager,并且可以处理MainActivity中的回调。

通过参数将billingmanager实例传递给所有其他区域是非常有问题的。像目前我正在通过如下所示的billingmanager实例:

  

MainActivity - > SomeFragment - > SomeAdapter - > SomeDialog - >   SomeStaticMethod等等

所以我的问题是:是否可以在适配器或对话框中使用BillingManager而不传递实例。

希望现在有点可以理解。

2 个答案:

答案 0 :(得分:1)

这个问题有两种方法。

方法1:

使用界面与您的活动互动并获取所有想要的对象。

public interface InstanceProvider{
    public ABC getABCInstance();
}

在您的Activity中实现此功能,然后在您的片段

中实现
private InstanceProvider instanceProvider;

@Override
public void onAttach(Context context){
    if (context instanceof InstanceProvider){
        instanceProvider = (InstanceProvider) context;
    }
}

并使用它来获取片段

中的实例

方法2:

使用依赖注入。

Google拥有并重新启动了依赖注入库Dagger 2 dependency injection还有其他库可以用于依赖注入。

答案 1 :(得分:0)

是。您可以将getActivity()类型化为您的活动,并访问其所有片段中的实例。 您可以像下面这样访问片段中的方法:

YourActivity containerActivity = (YourActivity)getActivity();
containerActivity.whaterMethod();

如果要访问某个变量,请在YourActivity中为该变量创建getter setter,并以相同的方式使用它。