我有两项活动。活动1启动活动2,活动2有一个片段,需要调用setResult
才能将值传递回活动1。
目前我在片段代码中执行此操作:
// FragmentClass.java
private final String EXTRA_VALUE_1_ID = "value_1";
private void setResult() {
Intent data = new Intent();
// value.getId() is of type UUID
data.putExtra(EXTRA_VALUE_1_ID, value.getId());
getActivity().setResult(Activity.RESULT_OK, data);
}
但是,现在要检索活动1中的值,我必须公开上面定义的额外键或者向片段添加另一个静态方法,如下所示:
// FragmentClass.java
public static UUID getValueId(Intent data) {
return (UUID) data.getSerializableExtra(EXTRA_VALUE_1_ID);
}
这意味着我必须在Activity 1类中执行类似的操作:
// Activity1.java
UUID id = FragmentClass.getValueId(data);
但这会导致Activity 1与FragmentClass结合使用。有更好的解决方案吗?由于活动1已经知道活动2,因此我尝试将setResult
调用移动到活动2.但我无法弄清楚如何获得putExtra
的正确覆盖实现。即我尝试了类似的事情:
// Activity2.java
public void setResult(ExtraKeys extraKey, Object value) {
Intent data = new Intent();
// Cannot resolve mothod 'putExtra(String, Object)'
data.putExtra(extraKey.toString(), value);
setResult(Activity.RESULT_OK, data);
}
有没有办法传递值的类型,然后相应地投射它?我是Java的新手,并且不太了解泛型来解决这个问题。
答案 0 :(得分:2)
我认为您应该使用interface
。您可以在片段中调用方法,将值传递给该方法,然后在Activity 1中实现该接口。
Fragment Activity 1
(call result(yourValue)) implement interface : result(int result)
| |
|----> Interface ------------------->|
(method result(int result)
创建新界面Communicator:
public interface Communicator {
void result(Object result);
}
在你的片段中:
Communicator comm;
...
comm = (Communicator) getActivity();
...
comm.result(yourValue);
在你的Activity1中:
//make you class extend the interface (Communicator)
public class Activity1 extends AppCompatActivity implements Communicator
...
//Override the method
@Override
public void result(Object result) {
//result is you value, now you can do whatever you want with it
result.getClass(); // this will return the type of object
if(result.getClass().equals(Integer.class)){
// do something
}else if(...){
...
}
}