Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从片段创建用于setResult的通用方法_Java_Android_Android Fragments - Fatal编程技术网

Java 从片段创建用于setResult的通用方法

Java 从片段创建用于setResult的通用方法,java,android,android-fragments,Java,Android,Android Fragments,我有两项活动。活动1启动活动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.putEx

我有两项活动。活动1启动活动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);
}
这意味着我必须在活动1课上做类似的事情:

// Activity1.java
UUID id = FragmentClass.getValueId(data);
但这导致活动1与FragmentClass耦合。有更好的解决办法吗?因为活动1已经知道活动2,所以我尝试将
setResult
调用移动到活动2。但是我不知道如何获得
putExtra
的正确重写实现。i、 e.我尝试了以下方法:

// 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中实现接口

 Fragment                             Activity 1
(call result(yourValue))           implement interface : result(int result)           
      |                                    |
      |----> Interface ------------------->|
             (method result(int result)
创建新的接口通信器:

public interface Communicator {
   void result(Object result);
}
在你的片段中:

Communicator comm;
...
comm = (Communicator) getActivity();
...
comm.result(yourValue);
在您的活动1中:

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

因此,如果我使用这个方法,我需要在接口中为片段可以作为结果设置的每种类型的值声明一个新方法?不,更简单,只需将参数声明为对象,然后在Activity1中检索该对象的类型。我编辑了我的回答,我会检查一下,然后告诉你。谢谢。所以上面的解决方案提供了一种更简洁的方法来设置片段的结果。然而,这仍然无助于在原始活动中获取结果,这需要一个密钥(提供给putExtra),而我更愿意将其保留为片段的私有成员。此外,每次需要设置一个新类型作为结果时,实现result方法的活动都需要一个新的
if
子句来处理该新类型。我不能以某种方式摆脱类型检查if子句吗?首先,我不明白您需要什么键,以及“获取结果”是什么意思。。在Activity1中,“对象结果”是从片段传递的结果。关于对象的类型,这取决于您需要对其执行什么操作。例如,若您只想生成一个结果字符串,那个么就不需要If循环。但是如果您想根据结果的类型做不同的事情,那么您将需要一个if语句。