从片段创建setResult的通用方法

时间:2016-04-24 12:53:39

标签: java android android-fragments

我有两项活动。活动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的新手,并且不太了解泛型来解决这个问题。

1 个答案:

答案 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(...){
    ...
  }
}