将数据发送回Android中的主要活动

时间:2009-05-28 11:06:11

标签: android android-intent

我有两项活动:主要活动和儿童活动 当我按下主活动中的按钮时,将启动子活动。

现在我想将一些数据发送回主屏幕。我使用了Bundle类,但它不起作用。它抛出一些运行时异常。

这有什么解决方案吗?

13 个答案:

答案 0 :(得分:429)

根据具体情况,有两种方法可以实现您的目标。

最常见的情况(您的听起来是这样)是使用子Activity来获取用户输入 - 例如从列表中选择联系人或在对话框中输入数据。在这种情况下,您应该使用startActivityForResult启动您的子活动。

这提供了一个管道,用于使用setResult将数据发送回主Activity。 setResult方法接受一个int结果值和一个传递回调用Activity的Intent。

Intent resultIntent = new Intent();
// TODO Add extras or a data URI to this intent as appropriate.
resultIntent.putExtra("some_key", "String data"); 
setResult(Activity.RESULT_OK, resultIntent);
finish();

要在调用Activity覆盖onActivityResult中访问返回的数据。 requestCode对应于startActivityForResult调用中传入的整数,而resultCode和数据Intent则从子Activity返回。

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
  super.onActivityResult(requestCode, resultCode, data);
  switch(requestCode) {
    case (MY_CHILD_ACTIVITY) : {
      if (resultCode == Activity.RESULT_OK) {
        // TODO Extract the data returned from the child Activity.
        String returnValue = data.getStringExtra("some_key");
      }
      break;
    } 
  }
}

答案 1 :(得分:170)

活动1使用startActivityForResult

startActivityForResult(ActivityTwo, ActivityTwoRequestCode);

启动活动2,您可以执行操作,关闭活动执行此操作:

Intent output = new Intent();
output.putExtra(ActivityOne.Number1Code, num1);
output.putExtra(ActivityOne.Number2Code, num2);
setResult(RESULT_OK, output);
finish();

活动1 - 从上一个活动返回将调用onActivityResult

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == ActivityTwoRequestCode && resultCode == RESULT_OK && data != null) {
        num1 = data.getIntExtra(Number1Code);
        num2 = data.getIntExtra(Number2Code);
    }
}

更新: 回答Seenu69的评论,在活动二中,

int result = Integer.parse(EditText1.getText().toString()) 
           + Integer.parse(EditText2.getText().toString());
output.putExtra(ActivityOne.KEY_RESULT, result);

然后在活动一中,

int result = data.getExtra(KEY_RESULT);

答案 2 :(得分:59)

发回数据

它帮助我在上下文中看到事物。这是一个完整的简单项目,用于发回数据。不是提供xml布局文件,而是图像。

enter image description here

主要活动

  • 使用startActivityForResult启动第二个活动,为其提供任意结果代码。
  • 覆盖onActivityResult。当第二个活动完成时调用此方法。您可以通过检查请求代码来确保它实际上是第二个活动。 (当您从同一主要活动开始多个不同的活动时,这非常有用。)
  • 从返回Intent中提取您获得的数据。使用键值对提取数据。

MainActivity.java

public class MainActivity extends AppCompatActivity {

    private static final int SECOND_ACTIVITY_REQUEST_CODE = 0;

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

    // "Go to Second Activity" button click
    public void onButtonClick(View view) {

        // Start the SecondActivity
        Intent intent = new Intent(this, SecondActivity.class);
        startActivityForResult(intent, SECOND_ACTIVITY_REQUEST_CODE);
    }

    // This method is called when the second activity finishes
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        // Check that it is the SecondActivity with an OK result
        if (requestCode == SECOND_ACTIVITY_REQUEST_CODE) {
            if (resultCode == RESULT_OK) {

                // Get String data from Intent
                String returnString = data.getStringExtra("keyName");

                // Set text view with string
                TextView textView = (TextView) findViewById(R.id.textView);
                textView.setText(returnString);
            }
        }
    }
}

第二项活动

  • 将要发送回上一个活动的数据放入Intent。数据使用键值对存储在Intent中。
  • 将结果设置为RESULT_OK并添加保存数据的意图。
  • 致电finish()以关闭第二项活动。

SecondActivity.java

public class SecondActivity extends AppCompatActivity {

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

    // "Send text back" button click
    public void onButtonClick(View view) {

        // Get the text from the EditText
        EditText editText = (EditText) findViewById(R.id.editText);
        String stringToPassBack = editText.getText().toString();

        // Put the String to pass back into an Intent and close this activity
        Intent intent = new Intent();
        intent.putExtra("keyName", stringToPassBack);
        setResult(RESULT_OK, intent);
        finish();
    }
}

其他说明

  • 如果你在片段中,它将无法知道RESULT_OK的含义。只需使用全名:Activity.RESULT_OK

另见

答案 3 :(得分:23)

FirstActivity使用startActivityForResult:

<?php
    ini_set('display_errors',1);
error_reporting(E_ALL);

if(mysqli_connect_errno())
{
	echo mysqli_connect_error();
}

$namenamec = $_POST['namec'];    
$company_name = $_POST['company_name'];
$description = $_POST['description'];
$welcome_text = $_POST['welcome_text'];
$thanks_message = $_POST['thanks_message'];
$image = addslashes (file_get_contents($_FILES['image']['tmp_name']));
$logo = getimagesize($_FILES['image']['tmp_name']);
$image_type = $logo['mime'];
    

$q = "UPDATE project SET project_name='$company_name', description='$description', image='$image', image_type='$image_type', welcome_text='$welcome_text', thanks_message='$thanks_message' WHERE project_name='$namenamec' ";

$r = mysqli_query($mysqli,$q);
    
if($r)
{
	echo "<br>Information stored successfully";
	
}
?>

在SecondActivity上调用setResult()onClick事件或onBackPressed()

Intent intent = new Intent(MainActivity.this,SecondActivity.class);
startActivityForResult(intent, int resultCode); // suppose resultCode == 2

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == 2)
    {
        String message=data.getStringExtra("MESSAGE");
    }
}

答案 4 :(得分:15)

使用startActivityForResult()方法调用

调用子活动Intent

这里有一个例子: http://developer.android.com/training/notepad/notepad-ex2.html

并在“从屏幕返回结果”中: http://developer.android.com/guide/faq/commontasks.html#opennewscreen

答案 5 :(得分:8)

我已经创建了简单的演示类,以便您更好地参考。

  

FirstActivity.java

 public class FirstActivity extends AppCompatActivity {

    private static final String TAG = FirstActivity.class.getSimpleName();
    private static final int REQUEST_CODE = 101;
    private Button btnMoveToNextScreen;

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

        btnMoveToNextScreen = (Button) findViewById(R.id.btnMoveToNext);
        btnMoveToNextScreen.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent mIntent = new Intent(FirstActivity.this, SecondActivity.class);
                startActivityForResult(mIntent, REQUEST_CODE);
            }
        });
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        if(resultCode == RESULT_OK){
            if(requestCode == REQUEST_CODE && data !=null) {
                String strMessage = data.getStringExtra("keyName");
                Log.i(TAG, "onActivityResult: message >>" + strMessage);
            }
        }

    }
}
  

这是SecondActivity.java

public class SecondActivity extends AppCompatActivity {

    private static final String TAG = SecondActivity.class.getSimpleName();
    private Button btnMoveToPrevious;
    private EditText editText;

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

        editText = (EditText) findViewById(R.id.editText);

        btnMoveToPrevious = (Button) findViewById(R.id.btnMoveToPrevious);
        btnMoveToPrevious.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                String message = editText.getEditableText().toString();

                Intent mIntent = new Intent();
                mIntent.putExtra("keyName", message);
                setResult(RESULT_OK, mIntent);
                finish();

            }
        });

    }
}

答案 6 :(得分:5)

In first activity u can send intent using startActivityForResult() and then get result from second activity after it finished using setResult.

MainActivity.class

public class MainActivity extends AppCompatActivity {

    private static final int SECOND_ACTIVITY_RESULT_CODE = 0;

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

    // "Go to Second Activity" button click
    public void onButtonClick(View view) {

        // Start the SecondActivity
        Intent intent = new Intent(this, SecondActivity.class);
        // send intent for result 
        startActivityForResult(intent, SECOND_ACTIVITY_RESULT_CODE);
    }

    // This method is called when the second activity finishes
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        // check that it is the SecondActivity with an OK result
        if (requestCode == SECOND_ACTIVITY_RESULT_CODE) {
            if (resultCode == RESULT_OK) {

                // get String data from Intent
                String returnString = data.getStringExtra("keyName");

                // set text view with string
                TextView textView = (TextView) findViewById(R.id.textView);
                textView.setText(returnString);
            }
        }
    }
}

SecondActivity.class

public class SecondActivity extends AppCompatActivity {

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

    // "Send text back" button click
    public void onButtonClick(View view) {

        // get the text from the EditText
        EditText editText = (EditText) findViewById(R.id.editText);
        String stringToPassBack = editText.getText().toString();

        // put the String to pass back into an Intent and close this activity
        Intent intent = new Intent();
        intent.putExtra("keyName", stringToPassBack);
        setResult(RESULT_OK, intent);
        finish();
    }
}

答案 7 :(得分:2)

2021 年 3 月更新

Activity v1.2.0Fragment v1.3.0 一样,引入了新的 Activity Result APIs

<块引用>

活动结果 API 提供了用于注册结果、启动结果以及在系统分派结果后处理结果的组件。

因此无需再使用 startActivityForResultonActivityResult

为了使用新的 API,您需要在源 Activity 中创建一个 ActivityResultLauncher,指定将在目标 Activity 完成并返回所需数据时运行的回调:

private val intentLauncher =
    registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->

        if (result.resultCode == Activity.RESULT_OK) {
            result.data?.getStringExtra("key1")
            result.data?.getStringExtra("key2")
            result.data?.getStringExtra("key3")
        }
    }

然后,随时启动您的意图:

intentLauncher.launch(Intent(this, YourActivity::class.java))

要从目标 Activity 返回数据,您只需添加一个包含返回值的 Intent 到 setResult() 方法:

val data = Intent()
data.putExtra("key1", "value1")
data.putExtra("key2", "value2")
data.putExtra("key3", "value3")

setResult(Activity.RESULT_OK, data)
finish()

有关任何其他信息,请参阅Android Documentation

答案 8 :(得分:0)

有一些方法可以做到这一点。 1.使用startActivityForResult(),这在上面的答案中有很好的解释。

  1. 通过在&#34; Utils&#34;中创建静态变量班级或您自己的任何其他班级。例如,我想将studentId从ActivityB传递给ActivityA.First我的ActivityA正在调用ActivityB。然后在ActivityB里面设置studentId(这是Utils.class中的静态字段)。 像这样的Utils.STUDENT_ID =&#34; 1234&#34 ;;然后在返回ActivityA时使用存储在Utils.STUDENT_ID中的studentId。

  2. 在应用程序类中创建getter和setter方法。

  3. 像这样:

    public class MyApplication extends Application {
    
        private static MyApplication instance = null;
        private String studentId="";
    
        public static MyApplication getInstance() {
            return instance;
        }
    
        @Override
        public void onCreate() {
            super.onCreate();
            instance = this;
        }
    
        public void setStudentId(String studentID){
            this.studentId=studentID;
        }
    
        public String getStudentId(){
            return this.studentId;
        }
    }
    

    所以你完成了。只需在你在ActivityB中时设置数据,然后在返回ActivityA之后,获取数据。

答案 9 :(得分:0)

所有这些答案都说明了发送数据后需要完成第二项活动的情况。

但是,如果您不想完成第二个活动,而是想将数据发送回去,那么您可以使用BroadCastReceiver。

第二次活动-

Intent intent = new Intent("data");
intent.putExtra("some_data", true);
LocalBroadcastManager.getInstance(this).sendBroadcast(intent);

首次活动中

private BroadcastReceiver tempReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        // do some action
    }
};

在onCreate()中注册接收者-

 LocalBroadcastManager.getInstance(this).registerReceiver(tempReceiver,new IntentFilter("data"));

在onDestroy()中取消注册

答案 10 :(得分:0)

另一种获得所需结果的方法可能会更好,具体取决于您的情况,该方法是创建一个侦听器界面。

通过使父活动监听由子活动触发的接口,同时传递所需的数据作为参数,可以创建类似的情况

答案 11 :(得分:-1)

使用 sharedPreferences 并保存您的数据并从应用程序的任何位置访问它

像这样保存日期

SharedPreferences sharedPreferences = getPreferences(MODE_PRIVATE);
    SharedPreferences.Editor editor = sharedPreferences.edit();
    editor.putString(key, value);
    editor.commit();

并收到这样的数据

SharedPreferences sharedPreferences = getPreferences(MODE_PRIVATE);
    String savedPref = sharedPreferences.getString(key, "");
    mOutputView.setText(savedPref);

答案 12 :(得分:-1)

我认为上面的答案中缺少一个小细节。

如果您的子活动可以从多个父活动中打开,那么您可以检查是否需要setResult,具体取决于您的活动是由startActivity还是startActivityForResult打开的。您可以使用getCallingActivity()来实现此目的。更多信息here