在 Android 上,变量未通过 Intent 从一个 class 传递到另一个 class

On Android, the variable is not being passed from one class to another class via Intent

在这个您可以复制并粘贴到 Android Studio 中进行测试的简单代码中,有两个 class。在名为 MainActivity 的第一个 class 中,有一个字段供用户键入名称。 在名为 MainActivity2 的第二个 class 中,还有另一个字段显示用户在名为 MainActivity1 的第一个 class 中键入的内容。 但是,此代码显示错误,它无法识别 MainActivity2 中的变量“名称”,在此代码段中:String receivedName = receiverBundle.getString("name");

谁能知道如何解决这个小错误?

拜托,您可以复制并粘贴这些简单代码并在您的 Android Studio 中进行测试:

/*This code is the first Java class that there is a field where the user can write own name:*/
import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;

MainActivity1:

``` public class MainActivity extends AppCompatActivity {
    EditText name;
    Button button;

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

      name  = findViewById(R.id.name);
      button = findViewById(R.id.button);

        String nameInString = name.getText().toString();

        button.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View view) {
                Intent senderIntent = new Intent(getApplicationContext(), MainActivity2.class);
                Bundle senderBundle = new Bundle();
                senderBundle .putString("name", nameInString);
                startActivity(senderIntent);
            }
        });

    }
} 
/* This class there is the field that must appear the name that the user wrote on the first class */
```
MainActivity2:
``` 
import android.content.Intent;
import android.os.Bundle;
import android.widget.TextView;

import androidx.appcompat.app.AppCompatActivity;

public class MainActivity2 extends AppCompatActivity {

    TextView resultName;

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

        resultName = findViewById(R.id.nameReceived);

        Intent receiverIntent = getIntent();
        Bundle receiverBundle = receiverIntent.getExtras();
        String receivedName = receiverBundle.getString
                ("name");

        resultName.setText(receivedName);

    }
}
/* Front-end code of MainActivity1*/
``` 
activity_main.xml
``` 
    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Send"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.498"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0.645" />

    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Complete Name:"
        android:textSize="20dp"
        android:textStyle="bold"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.372"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0.169" />

    <EditText
        android:id="@+id/name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:ems="10"
        android:hint="Type your name"
        android:inputType="textPersonName"
        app:layout_constraintBottom_toTopOf="@+id/button"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.497"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0.501" />

</androidx.constraintlayout.widget.ConstraintLayout>

/* MainActivity2的前端代码*/ Activity_main2.xml

    <TextView
        android:id="@+id/nameReceived"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Received name:"
        android:textSize="25dp"
        android:textStyle="bold"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.476"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0.307" />

</androidx.constraintlayout.widget.ConstraintLayout>``` 

尝试删除捆绑包,然后得到如下内容:

Intent intent = getIntent();
String username= intent.getStringExtra("name");

使用这个将名称放入意图中:

senderIntent.putExtra("name",nameInString);

nameInString 的单位应该在 button.setOnClickListener!

    button.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View view) {
            String nameInString = name.getText().toString();
            Intent senderIntent = new Intent(getApplicationContext(), MainActivity2.class);
            Bundle senderBundle = new Bundle();
            senderIntent.putExtra("name",nameInString);
            startActivity(senderIntent);
        }
    });

MainActivity2.class

        Intent intent = getIntent();
        String username= intent.getStringExtra("name");

要在 Activity 1 中获取 EditText 的当前文本,请在 setOnClickListener 范围内获取 editText 的文本并将其设置为 nameInString :

    button.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View view) {
            String nameInString = name.getText().toString();
            Intent senderIntent = new Intent(getApplicationContext(), MainActivity2.class);
            Bundle senderBundle = new Bundle();
            senderIntent.putExtra("name",nameInString);
            startActivity(senderIntent);
        }
    });

在活动 2 中:

Intent intent = getIntent();
String username= intent.getStringExtra("name");

我认为您面临两个问题:

  1. 应用程序会崩溃
  2. resultName的值为空

关于1)和2),根本原因是你想用一个bundle来携带数据,但是你没有把bundle放到Intent.而在 MainActivity2 中您想使用 bundle 直接获取数据。 http://prntscr.com/1sdwb9a

此外,正如其他人所说,intent可以携带多种类型的值(也包含bundle),因此您的情况不需要使用bundle

http://prntscr.com/1sdxv30