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

ant*_*ony 6 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;
}
Run Code Online (Sandbox Code Playgroud)

谢谢你们 !

use*_*686 5

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

例如,如果您想在要使用的单例类的 Android 组件之间进行通信,则该场景是有意义的。

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

public interface Action {
    void run(List<String> args, Context context);
}
Run Code Online (Sandbox Code Playgroud)

应该在 Fragment 中执行特定任务,并且您希望使用不同的操作集初始化 Fragments。然后你的 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);
}
Run Code Online (Sandbox Code Playgroud)

定义了一些类后MyActionA implements ActionMyActionB implements Action您将通过以下方式使用这些操作创建 Fragment:

Fragment myFragment = MyFragment.newInstance("some parameter", MyActionA.class, MyActionB.class)
Run Code Online (Sandbox Code Playgroud)

Fragment 本身可以使用一系列动作 ( List<Action> action) 作为从 Bundle 初始化的成员变量onCreate()

@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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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


F43*_*d1r 0

不可能将任何对象放入捆绑包中。您只能将两种类型的类放入一个包中:那些实现Serializable或 的类Parcelable

  • 谢谢你们的快速回答。我通过使用类名称而不是类型找到了解决方法。然后我可以从特定的类名创建一个新实例。 (2认同)