【问题标题】:How to send string from one activity to another?如何将字符串从一项活动发送到另一项活动?
【发布时间】:2013-08-11 09:08:59
【问题描述】:

我在activity2中有一个字符串

String message = String.format(
"Current Location \n Longitude: %1$s \n Latitude: %2$s", lat, lng); 

我想将此字符串插入到 activity1 的文本字段中。我该怎么做?

【问题讨论】:

  • 你可以使用意图或共享首选项
  • 你是如何开始activity2的?您可能可以使用意图将字符串传回。
  • 您不应使用共享首选项在活动之间发送数据。当然它可以工作,但首选项更适合持久存储需要在整个应用程序中访问的数据 - 例如用于登录的用户信息,因此不必每次都输入。如果要传输不会持久存储的数据,则应使用意图。否则它只是糟糕的形式。
  • stackoverflow.com/questions/6707900/… 的重复项。使用intent传递不要使用共享偏好,不建议使用共享偏好在两个activity之间传递数据。

标签: android android-activity


【解决方案1】:

您可以使用意图,即在活动之间发送的消息。在一个意图中,您可以放置​​所有类型的数据、字符串、整数等。

在您的情况下,在activity2 中,在转到activity1 之前,您将以这种方式存储字符串消息:

Intent intent = new Intent(activity2.this, activity1.class);
intent.putExtra("message", message);
startActivity(intent);

activity1中,在onCreate()中,你可以通过检索Bundle(包含调用活动发送的所有消息)来获取String消息并在其上调用getString()

Bundle bundle = getIntent().getExtras();
String message = bundle.getString("message");

然后可以在TextView中设置文字:

TextView txtView = (TextView) findViewById(R.id.your_resource_textview);    
txtView.setText(message);

希望这会有所帮助!

【讨论】:

  • 谢谢。我必须创建private TextView editText1 对吗?
  • 对于新手来说,答案有点混乱。解释清楚,便于辨认。
  • 是的(尽管您不应将 editText 称为 TextView 变量)。然后别忘了,在setText之前,做editText1 = (TextView) findViewById(R.id.resource_of_your_textview);
  • 你是对的@Rahul Patil,我编辑了我的答案,希望它更好!谢谢!
  • 需要澄清的两件事 (1) Intent 不会“存储字符串”,它将该字符串(或您传递给它的任何数据)传递给下一个活动 (2) 您不需要获取整个 Bundle 以获取通过意图传递的值。您可以直接访问它们。
【解决方案2】:

您可以使用Intent 将数据从一个活动发送到另一个活动

Intent sendStuff = new Intent(this, TargetActivity.class);
sendStuff.putExtra(key, stringvalue);
startActivity(sendStuff);

然后,您可以在第二个活动中通过获取意图并提取额外的字符串来检索此信息。在您的 onCreate() 方法中执行此操作。

Intent startingIntent = getIntent();
String whatYouSent = startingIntent.getStringExtra(key, value);

然后您所要做的就是在您的TextView 上调用 setText 并使用该字符串。

【讨论】:

    【解决方案3】:

    两种情况

    当我们谈论在活动之间传递数据时,有两种可能的情况。

    假设有两个活动 A 和 B,并且有一个字符串 X。你在活动 A

    现在让我们看看这两种情况

    1. A-------->B
    2. A

    案例 1:
    字符串 X 在 A 中,您想在 Activity B 中获取它。

    这很简单。

    在活动 A 中。

    1) 创建意图
    2) 增加额外价值
    3) 开始活动

    Intent i = new Intent(A.this, B.class);
    i.putExtra("Your_KEY",X);
    startActivity(i)
    

    在活动 B 中

    onCreate() 方法中,使用您在存储 X 时使用的密钥 (Your_KEY) 检索字符串 X。

    Intent i = getIntent();
    String s = i.getStringExtra("Your_KEY");
    

    案例 2:
    如果您是 Android 新手,这个案例有点棘手 开发 因为你在活动 A,所以你移动到活动 B, 收集字符串,返回活动 A 并检索 收集的字符串或数据。让我们看看如何处理这种情况。

    在活动 A 中
    1) 创建意图
    2) 使用请求代码启动活动。

    Intent i = new Intent(A.this, B.class);
    startActivityForResult(i,your_req_code);
    

    在活动 B 中
    1) 将字符串 X 放入意图
    2) 设置结果
    3) 完成活动

    Intent returnIntent = new Intent();
    returnIntent .putString("KEY",X);
    setResult(resCode,returnIntent);   // for the first argument, you could set Activity.RESULT_OK or your custom rescode too
    finish();
    

    再次进入活动 A
    1)重写onActivityResult方法

    onActivityResult(int req_code, int res_code, Intent data)
    {
           if(req_code==your_req_code)
           {
              String X = data.getStringExtra("KEY")
           }
    }
    

    对案例2的进一步理解

    你可能想知道onActivityResult(int reqCode, resCode, Intent data)中的reqCode、resCode是什么

    reqCode 在您必须确定从哪个活动 中获取结果时很有用。

    假设您有两个按钮,一个按钮启动相机(您单击一张照片并在您的 Activity 中获取该图像的位图),另一个按钮启动 GoogleMap(您返回当前位置的坐标作为结果)。因此,要区分这两个活动的结果,您可以使用不同的请求代码启动 CameraActivty 和 MapActivity。

    resCode:当您必须区分如何结果返回到请求活动时很有用。

    例如:您启动相机活动。当相机活动开始时,您可以拍照,也可以直接返回请求活动,而无需按下后退按钮拍照。因此,在这两种情况下,您的相机活动分别使用不同的 resCode ACTIVITY.RESULT_OK 和 ACTIVITY.RESULT_CANCEL 发送结果。

    相关链接

    Read more on Getting result

    【讨论】:

      【解决方案4】:

      假设您的 MainActivity 中有 EditText et1,您想将其传递给 SecondActivity

      String s=et1.getText().toString();
      Bundle basket= new Bundle();
      basket.putString("abc", s);
      Intent a=new Intent(MainActivity.this,SecondActivity.class);
      a.putExtras(basket);
      startActivity(a);
      

      现在在第二个活动中,说你想把从 EditText et1 传递的字符串放到 SecondActivity 的 TextView txt1 中

      Bundle gt=getIntent().getExtras();
      str=gt.getString("abc");
      txt1.setText(str);
      

      【讨论】:

      • 问题是在主活动中我有一个按钮,它指向current location on google maps,然后我向用户显示当前位置,他点击一个按钮send location,然后发送 latLong到文本视图的主要活动。问题是我的应用程序在主要活动上崩溃,我想这是因为我试图获取一个尚不存在的字符串,所以我需要以某种方式检查是否有任何东西。我用 if 做了,但没有用。
      【解决方案5】:
       Intent intent = new Intent(activity1.this, activity2.class);
       intent.putExtra("message", message);
       startActivity(intent);
      

      在activity2中,在onCreate()中,你可以通过获取一个Bundle(包含调用activity发送的所有消息)来获取String消息,然后在上面调用getString():

        Bundle bundle = getIntent().getExtras();
        String message = bundle.getString("message");
      

      【讨论】:

        【解决方案6】:

        Intents are intense.

        Intent 对于在 android 框架中传递数据很有用。您可以与自己的Activities 甚至其他进程进行通信。查看开发人员指南,如果您有具体问题(前面需要消化很多),请回来。

        【讨论】:

          【解决方案7】:

          您可以使用 GNLauncher,它是我编写的实用程序库的一部分,用于需要与 Activity 进行大量交互的情况。使用该库,几乎就像使用所需参数在 Activity 对象上调用函数一样简单。 https://github.com/noxiouswinter/gnlib_android/wiki#gnlauncher

          【讨论】:

            【解决方案8】:

            为了将文本从activity2插入到activity1,你首先需要在activity2中创建一个visit函数em>。

            public void visitactivity1()
            {
                Intent i = new Intent(this, activity1.class);
                i.putExtra("key", message);
                startActivity(i);
            }
            

            创建此函数后,您需要从 activity2onCreate() 函数中调用它:

            visitactivity1();
            

            接下来,转到 activity1 Java 文件。在其onCreate() 函数中,创建一个Bundle 对象,通过该对象的key 获取较早的消息,并将其存储在String 中。

                Bundle b = getIntent().getExtras();
                String message = b.getString("key", ""); // the blank String in the second parameter is the default value of this variable. In case the value from previous activity fails to be obtained, the app won't crash: instead, it'll go with the default value of an empty string
            

            现在使用 setText() 函数将此元素放入 TextView 或 EditText 或您喜欢的任何布局元素中。

            【讨论】:

              【解决方案9】:

              对于那些使用Kotlin 的人,请改为:

              1. 使用包含 String 对象的参数创建一个方法。
              2. 导航到另一个活动

              例如,

              
              // * The Method I Mentioned Above 
              private fun parseTheValue(@NonNull valueYouWantToParse: String)
              {
                   val intent = Intent(this, AnotherActivity::class.java)
                   intent.putExtra("value", valueYouWantToParse)
                   intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
                   startActivity(intent)
                   this.finish()
              }
              
              

              那就拨打 parseTheValue("the String that you want to parse")

              例如,

              val theValue: String
               parseTheValue(theValue)
              

              然后在另一个活动中,

              val value: Bundle = intent.extras!!
              // * enter the `name` from the `@param`
              val str: String = value.getString("value").toString()
              
              // * For testing
              println(str)
              

              希望得到帮助,祝编程愉快!

              ~ John Melody 添加的 Kotlin 代码~

              【讨论】:

                【解决方案10】:

                所以我正在这样做,但我的输出很奇怪, 这是第一个活动

                        up = findViewById(R.id.button);
                        up.setOnClickListener(new View.OnClickListener() {
                            @Override
                            public void onClick(View v) {
                                Intent intent = new Intent(MainActivity.this, updatestudents.class);
                                intent.putExtra("updating",updating);
                                startActivity(intent);
                            }
                        });
                

                这是第二个活动

                        Bundle extras = getIntent().getExtras();
                        if (extras != null) {
                            Current_Value = getIntent().getStringExtra("updating");
                        }
                        u = findViewById(R.id.text);
                        u.setText("updating " + Current_Value);
                

                我在第二个活动中检索字符串

                这是我的输出 enter image description here

                【讨论】:

                  猜你喜欢
                  • 2013-03-24
                  • 2018-09-24
                  • 2016-03-07
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2016-02-03
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多