在 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");
我认为您面临两个问题:
- 应用程序会崩溃
resultName
的值为空
关于1)和2),根本原因是你想用一个bundle
来携带数据,但是你没有把bundle
放到Intent
.而在 MainActivity2
中您想使用 bundle
直接获取数据。
http://prntscr.com/1sdwb9a
此外,正如其他人所说,intent
可以携带多种类型的值(也包含bundle
),因此您的情况不需要使用bundle
。
在这个您可以复制并粘贴到 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");
我认为您面临两个问题:
- 应用程序会崩溃
resultName
的值为空
关于1)和2),根本原因是你想用一个bundle
来携带数据,但是你没有把bundle
放到Intent
.而在 MainActivity2
中您想使用 bundle
直接获取数据。
http://prntscr.com/1sdwb9a
此外,正如其他人所说,intent
可以携带多种类型的值(也包含bundle
),因此您的情况不需要使用bundle
。