【问题标题】:getStringExtra() function returns Intent { (has extras) }getStringExtra() 函数返回 Intent { (has extras) }
【发布时间】:2021-02-24 12:20:45
【问题描述】:

我将一个字符串从活动 A 传递到活动 B,并在活动 B 中使用传递的字符串。 将数据从 A 传递到 B 的代码(data 是一个字符串。但为了消除任何疑问,我也在使用 toString()):

   Intent intent = new Intent(this,Class.forName("com.example.mylibrary.BActivity"));
   intent.putExtra("user",data.toString());
   startActivityForResult(intent,1);

在活动B中获取传递数据的代码:

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_b);

        String text = getIntent().getStringExtra("user");
        System.out.println(text);
        TextView textView = (TextView)findViewById(R.id.textView4);
        textView.setText(text);
        Intent intent = new Intent();
        setResult(RESULT_OK, intent);
    }

错误: 但是字符串text 的值是Intent { (has extras) }。这是在控制台和应用程序屏幕上为活动 B 打印的内容,因为 text 被放入 textView4text 的预期值应该是用户在上次活动中输入的字符串。谁能告诉我为什么getIntent().getStringExtra("user"); 不返回传递的实际字符串而是Intent { (has extras) }?App screen

System.out.println(text) 的控制台输出

V/FA: onActivityCreated
I/System.out: Intent { (has extras) }
V/FA: Activity resumed, time: 7152294
D/EGL_emulation: eglMakeCurrent: 0xef57f8e0: ver 2 0 (tinfo 0xe43eef50)

【问题讨论】:

  • 传递硬编码值,如 Intent intent = new Intent(this, BActivity.class); intent.putExtra("用户", "用户价值");开始活动(意图);
  • 并注释这 2 行 Intent intent = new Intent(); setResult(RESULT_OK, 意图);
  • intent.putExtra("user",data.toString());数据是什么类型?我认为它是 Intent 类型的?
  • 输入硬编码值让我意识到它实际上工作正常。我有两个“数据”变量,我假设另一个是这个“数据”。感谢@Pavya 的建议,很抱歉这个愚蠢的问题。
  • @Shrikant 是的,我使用的 data 变量属于 Intent 类型。我正在用完全不同的功能编写代码。

标签: android android-intent android-activity


【解决方案1】:

我已经复制了提到的活动类和布局 XML 中提到的相同场景:

activity_a.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".AActivity" >

    <Button
        android:id="@+id/button_navigate"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/navigate"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintBottom_toBottomOf="parent"/>

</androidx.constraintlayout.widget.ConstraintLayout>

AActivity.java

public class AActivity extends AppCompatActivity {

    private View.OnClickListener navigateClickListener = view ->
        navigateToSecondActivity();

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

    private void initializeViews() {      
        findViewById(R.id.button_navigate)
            .setOnClickListener(navigateClickListener);
    }

    private void navigateToSecondActivity() {
        String data = "Some Data"; // Here I'm setting a String as the data to be sent.
        Intent intent = new Intent(AActivity.this, BActivity.class);
        intent.putExtra("user", data.toString());
        startActivityForResult(intent, 1);
    }

}

activity_b.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".BActivity" >

    <TextView
        android:id="@+id/textView4"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintBottom_toBottomOf="parent"/>

</androidx.constraintlayout.widget.ConstraintLayout>

BActivity.java

public class BActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_b);
        String text = getIntent().getStringExtra("user");
        System.out.println(text);
        TextView textView = (TextView)findViewById(R.id.textView4);
        textView.setText(text);
        Intent intent = new Intent();
        setResult(RESULT_OK, intent);
    }

}

当我构建 APK,在模拟器上部署 APK 时,代码运行良好。

我怀疑您代码上的data 可能已设置为如下值:

data = someIntent.toString();

我怀疑你的价值是Intent { (has extras) }

因此,我建议通过在每次更改时打印值来检查 data 是如何更改的。

另外,在调用AActivity 上的方法startActivityForResult() 之前打印data 的值,以确保它是您要发送到BActivity 的值。

一些注意事项:

  • AActivity.java中,使用data.toString()是没有用的,因为data本身就是一个String,调用data.toString()返回相同的值,这使得调用它变得多余。

  • 要在控制台/Logcat 中打印任何值,请使用 android.util.Log 而不是 System.out.println()Here's why!

  • 使用Class.forName("com.example.mylibrary.BActivity")BActivity.class相同,后者更方便。

【讨论】:

    猜你喜欢
    • 2023-01-30
    • 2014-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-05
    • 2022-11-04
    • 2014-08-26
    • 1970-01-01
    相关资源
    最近更新 更多