是否可以将 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 Action
和 MyActionB 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/