Android:如何将 Class 类型放入 Bundle 中?

标签 android bundle

是否可以将 Class 类型放入 Bundle 中?

public static <T> Intent newInstance(Class<T> EventClass) {
    Bundle args = new Bundle();
    args.putXXXX(EventClass);
    Intent intent = new Intent(MyApplication.getInstance(), MyActivity.class);
    intent.putExtras(args);
    return intent;
}

谢谢大家!

最佳答案

您可以简单地使用 Class<T>.getCanonicalName()然后在从 Bundle 读取类时使用该名称实例化该类。

例如,如果您想在 Android 组件之间通信使用哪些单例类,则该场景很有意义。

例如,您可以有一个操作界面

public interface Action {
    void run(List<String> args, Context context);
}

应该在 Fragment 中执行特定任务,并且您想使用不同的操作集初始化 Fragment。然后你的 fragment 的实例化方法可以简单地采用 Action类作为参数:

public static void newInstance(String someParameter, Class<? extends Action>... actions) {
    Bundle arguments = new Bundle();
    String[] actionNames = new String[actions.length];
    for (int i = 0; i < actionNames.length; i++) {
        actionNames[i] = actions[i].getCanonicalName();
    }
    arguments.putStringArray(ARG_ACTIONS, actionNames);
}

定义了一些类MyActionA implements ActionMyActionB implements Action您将通过以下方式创建包含这些操作的 fragment :

Fragment myFragment = MyFragment.newInstance("some parameter", MyActionA.class, MyActionB.class)

Fragment 本身可以使用一个 Action 列表(List<Action> action)作为成员变量,它从onCreate() 中的Bundle 初始化。 :

@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    for (String actionName : getArguments().getStringArray(ARG_ACTIONS)) {
        try {
            Class<? extends Action> actionClass = (Class<? extends Action>) Class.forName(actionName);
            Action action = actionClass.newInstance();
            actions.put(action.getName(), action);
        } catch (java.lang.InstantiationException e) {
            throw new RuntimeException(e);
        } catch (IllegalAccessException e) {
            throw new RuntimeException(e);
        } catch (ClassNotFoundException e) {
            throw new RuntimeException(e);
        }
    }
}

顺便说一下,当尝试将匿名类实例化为 getCanonicalName() 时,这会失败。返回 null对于匿名类。所以这个方法不能用来传递匿名类,我怀疑这是不可能的。

关于Android:如何将 Class 类型放入 Bundle 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32313882/

相关文章:

android - 在 DialogFragment 中更改窗口标题的背景颜色

android - 如何将 Canvas 置于其他 View 之上

java - 如何在 fragment 上显示操作栏图标?

java - Java ResourceBundle.getBundle 如何加载属性文件?

ios - 尽管文件位于 Documents 目录中,但资源路径返回 nil 文件路径

Android:检测用户不活动/检测(软键盘)键盘输入

java - OSGi 包和普通 .JAR 文件用法之间的区别

iPhone 引用不同目录中的资源

javascript - 版本控制包文件