【问题标题】:resultCode 0 and data zero in onActivityResultonActivityResult 中的 resultCode 0 和数据 0
【发布时间】:2018-04-08 20:37:49
【问题描述】:

我有一个片段的活动,然后那个片段调用一些活动,该活动将为第一个活动提供一些价值。我使用 onActivityResult 但我不知道为什么 resultCode 总是 0 而 data 总是 0,。

关于我的活动一

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    Log.d(TAG, "onActivityResult: "+ requestCode +" "+resultCode+" "+data);

}

活动一有一些fragmentX调用活动二

private final int REQUEST_CODE = 10;
private void start (){
    Intent intent = new Intent(getContext(),Main2Activity.class);
        intent.putExtra("xxx","test1");
        getActivity().startActivityForResult(intent,REQUEST_CODE);
}

然后在活动二中,当我触摸 onBackpress 时,将传递一些值。

public class Main2Activity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);
    }

    @Override
    public void onBackPressed() {
        super.onBackPressed();
        Intent intent = getIntent().putExtra("yyy","test2");
        setResult(RESULT_OK,intent);
    }
}

但是,我不知道为什么,onActivityResult 我无法获取数据。 我的最终目的是,我想将该数据设置为 fragmentX。

【问题讨论】:

  • 你必须将结果从活动传递到片段
  • 对不起,我还不清楚。
  • 先删除 super.onBackPressed();来自onbackpressed的行,然后检查
  • 如果我删除 super.onBackPressed UI 将不会更改为第一个 Activity。

标签: android null onactivityresult


【解决方案1】:

如果你想在 onActivityResult 中发送返回数据,那么你应该在 setResult() 方法中设置数据之后使用 super.onBackPressed()

示例:

@Override
public void onBackPressed() {
    val intent = Intent()
    intent.putExtra("IsReturnData", true)
    setResult(RESULT_OK,intent);
    super.onBackPressed();  //write this line at the end of method
}

【讨论】:

    【解决方案2】:

    开始新活动

    private final int REQUEST_CODE = 10;
    private void start (){
        Intent intent = new Intent(getContext(),Main2Activity.class);
            intent.putExtra("xxx","test1");
            getActivity().startActivityForResult(intent,REQUEST_CODE);
    }
    

    来自第二个活动

    public class Main2Activity extends AppCompatActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main2);
        }
    
        @Override
        public void onBackPressed() {
            super.onBackPressed();
            Intent intent = getIntent().putExtra("yyy","test2");
            setResult(10,intent);
        }
    }
    

    您必须设置用于开始第二个活动的整数代码。您已经使用代码“10”开始了第二个活动。所以在 setResult(10,intent) 时使用相同的值;

    onActivityResult 你需要检查请求代码

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if(requestCode==10){
            if(data!=null)
            {
           //you have to manage your own list of fragments for activity because getSupportFragmentManager().getFragments() is deprecated now.
    
        //Send data to fragments
        if (arrayFragments != null) {
            for (Fragment fragment : arrayFragments) {
                fragment.onActivityResult(requestCode, resultCode, data);
            }
        }
     }
       }
    
    }
    

    请记住,您必须使用 ArrayList 或 HashMap 管理自己的片段列表。 希望这会对您有所帮助,如果您需要任何其他帮助,请通知我。

    【讨论】:

      【解决方案3】:

      在第一个活动中编写以下代码:

      第一种方法:

      @Override
      protected void onActivityResult(int requestCode, int resultCode, Intent data) {
          super.onActivityResult(requestCode, resultCode, data);
          for (Fragment fragment : getSupportFragmentManager().getFragments()) {
              fragment.onActivityResult(requestCode, resultCode, data);
          }
      }
      

      在片段中

      @Override
      protected void onActivityResult(int requestCode, int resultCode, Intent data) {
          // In fragment write your logic here
      }
      

      第二种方法:(我没有尝试,但根据文档,这可能是尝试一次的原因之一)如果它不起作用,请使用第一种方法,其 100% 解决方案

      当您使用 getContext() 调用第二个活动时

      getContext() - 仅返回当前正在运行的活动的上下文视图。

      getActivity()- 返回此片段当前关联的 Activity。

      当你调用下一个活动的意图时,尝试使用 getActivity() 而不是 getContext()

      例如:

      private final int REQUEST_CODE = 10;
      Intent intent = new Intent(getActivity(),Main2Activity.class);
      intent.putExtra("xxx","test1");
      getActivity().startActivityForResult(intent,REQUEST_CODE);
      

      【讨论】:

        【解决方案4】:

        1.可以在片段中调用onActivityResult

        @Override
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
            super.onActivityResult(requestCode, resultCode, data);
            Log.d(TAG, "onActivityResult: "+ requestCode +" "+resultCode+" "+data);
        
        }
        

        2.在你的方法中在setResult之后使用super.onBackPressed();

        @Override
        public void onBackPressed() {
        
            Intent intent = getIntent().putExtra("yyy","test2");
            setResult(RESULT_OK,intent);
            super.onBackPressed();
        }
        

        【讨论】:

        • 使用 super.onBackPressed();在你的方法中设置结果之后,这是主要的事情
        猜你喜欢
        • 2018-04-08
        • 1970-01-01
        • 2019-05-02
        • 2019-10-14
        • 1970-01-01
        • 2015-07-10
        • 1970-01-01
        • 2016-01-27
        • 1970-01-01
        相关资源
        最近更新 更多