【问题标题】:How to pass data from 2nd activity to 1st activity when pressed back? - android按下后如何将数据从第二个活动传递到第一个活动? - 安卓
【发布时间】:2012-12-26 21:00:38
【问题描述】:

我有 2 个活动,Activity1Activity2

Activity1 中,我有一个ButtonTextView。 单击按钮时,Activity2 会启动。

Activity2 我有一个EditText

我想在 Activity1TextView 中显示从 Activity2 中的 EditText 检索到的数据,当返回时从 Activity2 按下。

有人可以帮我编写代码来完成这项工作吗?

【问题讨论】:

标签: android android-activity parent-child pass-data


【解决方案1】:

我有一个问题,我想在我制作的软按钮和每个 Android 设备中的默认软键中发送数据类型,所以我已经做到了,首先我做了我的“A”中的Intent Activity

            Intent intent = new Intent();
            intent.setClass(context, _AddNewEmployee.class);
            intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
            startActivityForResult(intent, 6969);
            setResult(60);

然后在我的第二个活动中,我在“B”Activity 中声明了一个字段:

private static int resultCode = 40;

然后在我成功提出请求后或每当我想告诉“A”活动此工作已成功完成时,将 resultCode 的值更改为我在“A”Activity 中所说的相同,在我的大小写为“60”,然后:

private void backToSearchActivityAndRequest() {
    Intent data = new Intent();
    data.putExtra("PhoneNumber", employeePhoneNumber);
    setResult(resultCode, data);
    finish();
}

@Override
public void onBackPressed() {
    backToSearchActivityAndRequest();
}

PS:如果您希望它正常工作,请记住从 onBackPressed 方法中删除 Super

那么我也应该在我的“A”活动中调用onActivityResult 方法:

   @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == 6969 && resultCode == 60) {
            if (data != null) {
                    user_mobile = data.getStringExtra("PhoneNumber");
                    numberTextField.setText(user_mobile);
                    getEmployeeByNumber();
            }
        }
    }

就是这样,希望对你有所帮助。 #快乐编码;

【讨论】:

    【解决方案2】:

    Activity1 应该以startActivityForResult() 开头Activity2

    Activity2 应使用setResult() 将数据发送回Activity1

    Activity2中,

    @Override
    public void onBackPressed() {
        String data = mEditText.getText();
        Intent intent = new Intent();
        intent.putExtra("MyData", data);
        setResult(resultcode, intent);
    }
    

    Activity1中,

    onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == 1) {
            if(resultCode == RESULT_OK) {
                String myStr=data.getStringExtra("MyData");
                mTextView.setText(myStr);
            }
        }
    }
    

    【讨论】:

    • @Swayam 我猜是因为您没有提到 activity1 应该使用 startactivityforresult 启动 activity2。
    • @LutfiTekin:很可能就是这样!感谢您指出!编辑了我的答案。 :)
    【解决方案3】:

    使用 startActivityForResult() 方法从您的 FirstActivity 调用 SecondActivity。

    例如:

    Intent i = new Intent(this, SecondActivity.class);
    startActivityForResult(i, 1);
    

    在您的 SecondActivity 中设置您想要返回给 FirstActivity 的数据。如果不想返回,就不要设置。

    例如:在secondActivity中如果要发回数据:

    Intent returnIntent = new Intent();
    returnIntent.putExtra("result",result);
    setResult(Activity.RESULT_OK,returnIntent);
    finish();
    

    如果不想返回数据:

    Intent returnIntent = new Intent();
    setResult(Activity.RESULT_CANCELED, returnIntent);
    finish();
    

    现在在您的 FirstActivity 类中为 onActivityResult() 方法编写以下代码。

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == 1) {
            if(resultCode == Activity.RESULT_OK){
                String result=data.getStringExtra("result");
            }
            if (resultCode == Activity.RESULT_CANCELED) {
                //Write your code if there's no result
            }
        }
    }
    

    【讨论】:

      【解决方案4】:

      使用startActivityForResult 启动Activity2 并使用setResult 方法将数据从Activity2 发送回Activity1。在 Activity1 中,您需要覆盖 onActivityResult 以使用来自 Activity2 的 EditText 数据更新 TextView

      例如:

      Activity1中,启动Activity2为:

      Intent i = new Intent(this, Activity2.class);
      startActivityForResult(i, 1);
      

      Activity2中,使用setResult发回数据:

      Intent intent = new Intent();
      intent.putExtra("editTextValue", "value_here")
      setResult(RESULT_OK, intent);        
      finish();
      

      Activity1中,用onActivityResult接收数据:

      public void onActivityResult(int requestCode, int resultCode, Intent data) {
          super.onActivityResult(requestCode, resultCode, data);
          if (requestCode == 1) {
               if(resultCode == RESULT_OK) {
                   String strEditText = data.getStringExtra("editTextValue");
               }     
          }
      } 
      

      如果可以,也可以使用SharedPreferences 在活动之间共享数据。

      【讨论】:

      • 谢谢你,如果可以的话,你能帮我用 SharedPreferences 的类似编码部分来做同样的事情:)
      • @kumareloaded :最欢迎的朋友。如果您想使用SharedPreferences 做同样的事情,请参阅this 示例
      • @kumareloaded : 如果你给我两个类的代码链接以及你使用pastebin.com 尝试过的内容,那么我将编辑你的代码
      • @kumareloaded : 现在使用this 代码,这样就可以了
      • @ρяσѕρєяK:您能否在回答中使用 SharedPref 分享上述场景的代码。 Pastebin 并未在许多国家/地区开放。在这里分享会很有帮助,谢谢。
      【解决方案5】:

      当我将setResult 放入onBackPressed 时,其他答案不起作用。注释调用 super onBackPressed 并手动调用 finish 即可解决问题:

      @Override
      public void onBackPressed() {
          //super.onBackPressed();
          Intent i = new Intent();
          i.putExtra(EXTRA_NON_DOWNLOADED_PAGES, notDownloaded);
          setResult(RESULT_OK, i);
          finish();
      }
      

      在第一个活动中:

      @Override
      protected void onActivityResult(int requestCode, int resultCode, Intent data) {
          super.onActivityResult(requestCode, resultCode, data);
          if (requestCode == QUEUE_MSG) {
              if (resultCode == RESULT_OK) {
                  Serializable tmp = data.getSerializableExtra(MainActivity.EXTRA_NON_DOWNLOADED_PAGES);
                  if (tmp != null)
                      serializable = tmp;
              }
          }
      }
      

      【讨论】:

      • 好点。 onBackPressed() 方法被覆盖,所以 back 函数不起作用。您必须手动调用finish()
      【解决方案6】:

      阅读这些:

      1. Return result to onActivityResult()
      2. Fetching Result from a called activity - Android Tutorial for Beginners

      这些文章将帮助您了解如何在 Android 中的两个 Activity 之间传递数据。

      【讨论】:

        【解决方案7】:

        将此作为 startActivityforResult 的替代方法。但请记住,对于这种情况,这种方法在性能方面可能会很昂贵,但在某些情况下您可能需要使用。

        在Activity2中,

        @Override
        public void onBackPressed() {
        String data = mEditText.getText();
        SharedPreferences sp = getSharedPreferences("LoginInfos", 0);
        Editor editor = sp.edit();
        editor.putString("email",data);
        editor.commit();
        }
        

        在 Activity1 中,

         @Override
        public void onResume() {
        SharedPreferences sp = getSharedPreferences("LoginInfos", 0);
        String  dataFromOtherAct= sp.getString("email", "no email");
        } 
        

        【讨论】:

        • 这不能用于对象(仅限字符串、布尔值等)
        • 在我的例子中,我从 MainActivity 中的列表项启动了一个活动,并希望将用户创建的数据返回到该列表项。在我使用 mContext.startActivity() 的情况下,我无法使用 startActivityForResult()。 @katmanco 示例在这里是一个有用的解决方法。
        • 对我来说这是一次糟糕的选举。存在 actionForResult
        【解决方案8】:

        这是你的第一个 Activity1。

        public class Activity1 extends Activity{
        private int mRequestCode = 100;
        
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
        
            Intent intent = new Intent(this, Activity2.class);
            startActivityForResult(intent, mRequestCode);
        }
        
        @Override
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
            super.onActivityResult(requestCode, resultCode, data);
            if(requestCode == mRequestCode && resultCode == RESULT_OK){
                String editTextString = data.getStringExtra("editText");
            }
        }
        }
        

        从这里开始,您使用 startActivityForResult(mRequestCode, Activity2.class);

        启动 Activity2.class

        现在这是你的第二个 Activity,名称是 Activity2

        public class Activity2 extends Activity {
        private EditText mEditText;
        
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
        
            //mEditText = (EditText)findViewById(R.id.edit_text);
        
            Intent intent = new Intent();
            intent.putExtra("editText", mEditText.getText().toString());
            setResult(RESULT_OK, intent);
        }
        
        }
        

        现在,当您完成第二个 Activity 后,您可以从 onBackPress() 或任何按钮单击调用 setResult() 方法,当您的 Activity2 将销毁时,您的 Activity1 的回调方法 onActivityResult() 将从那里调用您可以从意图中获取数据..

        希望对你有所帮助...:)

        【讨论】:

          【解决方案9】:

          TL;DR 使用Activity.startActivityForResult

          长答案:

          您应该首先阅读 Android 开发者文档。具体而言,Activity 文档的Starting Activities and Getting Results 部分涵盖了您的问题主题。

          对于示例代码,Android SDK 提供了很好的示例。此外,此处的其他答案为您提供了简短的示例代码供您使用。

          但是,如果您正在寻找替代方案,请阅读this SO question。这是一个很好的讨论,关于如何将startActivityForResults 与片段一起使用,以及在活动之间传递数据的其他几种方法。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2020-01-13
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-12-20
            相关资源
            最近更新 更多