如何将数据从 Main activity 传递到另一个 activity
How to pass data from Main activity to another activity
我想将用户输入的姓名和号码传递到我的 android 应用程序中的 FakeRinger
class。我在 fab.setOnClickListener
的意图上使用了 putExtra()
方法。这是我在 MainActivity
中使用的代码
public class MainActivity extends AppCompatActivity {
public static final String LOG_TAG = "MainActivity";
ImageView imageView;
EditText number, name;
Button setTimeButton;
FloatingActionButton fab;
Calendar calendar;
long selectedTimeInMillis;
TimePickerDialog timePicker;
String enteredName, enteredNumber;
Intent intent;
private static final int SELECT_IMAGE = 100;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
PreferenceManager.setDefaultValues(this, R.xml.settings, false);
imageView = findViewById(R.id.image_view);
setTimeButton = findViewById(R.id.set_time);
fab = findViewById(R.id.floatingActionButton);
number = findViewById(R.id.number);
name = findViewById(R.id.name);
enteredName = name.getText().toString().trim();
enteredNumber = number.getText().toString().trim();
imageView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent galleryIntent = new Intent(Intent.ACTION_PICK);
galleryIntent.setType("image/*");
startActivityForResult(galleryIntent, SELECT_IMAGE);
}
});
setTimeButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
calendar = Calendar.getInstance();
int hour = calendar.get(Calendar.HOUR_OF_DAY);
int minute = calendar.get(Calendar.MINUTE);
timePicker = new TimePickerDialog(MainActivity.this, new TimePickerDialog.OnTimeSetListener() {
@Override
public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
calendar.set(Calendar.HOUR_OF_DAY, hourOfDay);
calendar.set(Calendar.MINUTE, minute);
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MILLISECOND, 0);
selectedTimeInMillis = calendar.getTimeInMillis();
if (hourOfDay > 12) {
hourOfDay = hourOfDay - 12;
}
if (minute < 10) {
String minuteStr = "0" + String.valueOf(minute);
minute = Integer.parseInt(minuteStr);
Log.v(LOG_TAG, "minute is :" + minute);
}
Toast.makeText(MainActivity.this, hourOfDay + ":" + minute, Toast.LENGTH_SHORT).show();
Log.v(LOG_TAG, "Selected time in millis:" + selectedTimeInMillis);
}
}, hour, minute, false);
timePicker.show();
}
});
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
intent = new Intent(MainActivity.this, AlarmReciever.class);
intent.putExtra("FAKE_NAME", enteredName);
intent.putExtra("FAKE_NUMBER", enteredNumber);
PendingIntent pi = PendingIntent.getBroadcast(getApplicationContext(), 0, intent, 0);
AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
if (alarmManager != null) {
alarmManager.set(AlarmManager.RTC_WAKEUP, selectedTimeInMillis, pi);
Toast.makeText(MainActivity.this, "Your call has been placed", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(MainActivity.this, "Error: something wrong", Toast.LENGTH_SHORT).show();
}
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.settings:
Intent intent = new Intent(MainActivity.this, SettingsActivity.class);
startActivity(intent);
return true;
case R.id.quick_call:
return true;
default:
return super.onOptionsItemSelected(item);
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_OK) {
try {
Uri imageUri = data.getData();
InputStream imageStream = null;
if (imageUri != null) {
imageStream = getContentResolver().openInputStream(imageUri);
}
Bitmap selectedImage = BitmapFactory.decodeStream(imageStream);
imageView.setImageBitmap(selectedImage);
} catch (FileNotFoundException e) {
e.printStackTrace();
Toast.makeText(this, "Something went wrong", Toast.LENGTH_SHORT).show();
}
} else {
Toast.makeText(this, "You haven't picked Image", Toast.LENGTH_SHORT).show();
}
}
}
这是我的BroadcastReceiver
class
public class AlarmReciever extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String getFakeName = intent.getStringExtra("FAKE_NAME");
String getFakeNumber = intent.getStringExtra("FAKE_NUMBER");
Intent fakeRinger = new Intent();
fakeRinger.setClassName("com.example.mani.fakecall", "com.example.mani.fakecall.FakeRinger");
fakeRinger.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
fakeRinger.putExtra("USER_FAKE_NAME", getFakeName);
fakeRinger.putExtra("USER_FAKE_NUMBER", getFakeNumber);
context.startActivity(fakeRinger);
Log.v("Yes, we are in", "Alarm reciever");
Log.v("fake name is: ", getFakeName);
Log.v("fake number is: ", getFakeNumber);
}
}
这是我的 FakeRinger
Activity
public class FakeRinger extends AppCompatActivity {
TextView displayName;
TextView displayNumber;
Button alarmOffButton;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_fake_ringer);
displayName = findViewById(R.id.display_name);
displayNumber = findViewById(R.id.display_number);
String callName = getFakeName();
String callNumber = getFakeNumber();
displayName.setText(callName);
displayNumber.setText(callNumber);
alarmOffButton = findViewById(R.id.alarm_off);
alarmOffButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
}
});
}
private String getFakeName(){
String contactName = null;
Intent i = getIntent();
Bundle bundle = i.getExtras();
if (bundle != null) {
contactName = bundle.getString("USER_FAKE_NAME");
}
return contactName;
}
private String getFakeNumber(){
String contactNumber = null;
Intent i = getIntent();
Bundle bundle = i.getExtras();
if (bundle != null) {
contactNumber = bundle.getString("USER_FAKE_NUMBER");
}
return contactNumber;
}
}
我仍然无法显示用户在 FakeRinger
activity 中输入的姓名和号码。谁能告诉我哪里做错了?
您需要将这两行移动到 FAB 点击监听器中
enteredName = name.getText().toString().trim();
enteredNumber = number.getText().toString().trim();
在您当前拥有它们的地方,布局是空的,并且您永远不会将这些字符串分配给其他任何内容。
如果您没有看到来自 AlarmReciever 的日志,那么无论如何都不会将任何内容传递给下一个 activity
我想将用户输入的姓名和号码传递到我的 android 应用程序中的 FakeRinger
class。我在 fab.setOnClickListener
的意图上使用了 putExtra()
方法。这是我在 MainActivity
public class MainActivity extends AppCompatActivity {
public static final String LOG_TAG = "MainActivity";
ImageView imageView;
EditText number, name;
Button setTimeButton;
FloatingActionButton fab;
Calendar calendar;
long selectedTimeInMillis;
TimePickerDialog timePicker;
String enteredName, enteredNumber;
Intent intent;
private static final int SELECT_IMAGE = 100;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
PreferenceManager.setDefaultValues(this, R.xml.settings, false);
imageView = findViewById(R.id.image_view);
setTimeButton = findViewById(R.id.set_time);
fab = findViewById(R.id.floatingActionButton);
number = findViewById(R.id.number);
name = findViewById(R.id.name);
enteredName = name.getText().toString().trim();
enteredNumber = number.getText().toString().trim();
imageView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent galleryIntent = new Intent(Intent.ACTION_PICK);
galleryIntent.setType("image/*");
startActivityForResult(galleryIntent, SELECT_IMAGE);
}
});
setTimeButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
calendar = Calendar.getInstance();
int hour = calendar.get(Calendar.HOUR_OF_DAY);
int minute = calendar.get(Calendar.MINUTE);
timePicker = new TimePickerDialog(MainActivity.this, new TimePickerDialog.OnTimeSetListener() {
@Override
public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
calendar.set(Calendar.HOUR_OF_DAY, hourOfDay);
calendar.set(Calendar.MINUTE, minute);
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MILLISECOND, 0);
selectedTimeInMillis = calendar.getTimeInMillis();
if (hourOfDay > 12) {
hourOfDay = hourOfDay - 12;
}
if (minute < 10) {
String minuteStr = "0" + String.valueOf(minute);
minute = Integer.parseInt(minuteStr);
Log.v(LOG_TAG, "minute is :" + minute);
}
Toast.makeText(MainActivity.this, hourOfDay + ":" + minute, Toast.LENGTH_SHORT).show();
Log.v(LOG_TAG, "Selected time in millis:" + selectedTimeInMillis);
}
}, hour, minute, false);
timePicker.show();
}
});
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
intent = new Intent(MainActivity.this, AlarmReciever.class);
intent.putExtra("FAKE_NAME", enteredName);
intent.putExtra("FAKE_NUMBER", enteredNumber);
PendingIntent pi = PendingIntent.getBroadcast(getApplicationContext(), 0, intent, 0);
AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
if (alarmManager != null) {
alarmManager.set(AlarmManager.RTC_WAKEUP, selectedTimeInMillis, pi);
Toast.makeText(MainActivity.this, "Your call has been placed", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(MainActivity.this, "Error: something wrong", Toast.LENGTH_SHORT).show();
}
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.settings:
Intent intent = new Intent(MainActivity.this, SettingsActivity.class);
startActivity(intent);
return true;
case R.id.quick_call:
return true;
default:
return super.onOptionsItemSelected(item);
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_OK) {
try {
Uri imageUri = data.getData();
InputStream imageStream = null;
if (imageUri != null) {
imageStream = getContentResolver().openInputStream(imageUri);
}
Bitmap selectedImage = BitmapFactory.decodeStream(imageStream);
imageView.setImageBitmap(selectedImage);
} catch (FileNotFoundException e) {
e.printStackTrace();
Toast.makeText(this, "Something went wrong", Toast.LENGTH_SHORT).show();
}
} else {
Toast.makeText(this, "You haven't picked Image", Toast.LENGTH_SHORT).show();
}
}
}
这是我的BroadcastReceiver
class
public class AlarmReciever extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String getFakeName = intent.getStringExtra("FAKE_NAME");
String getFakeNumber = intent.getStringExtra("FAKE_NUMBER");
Intent fakeRinger = new Intent();
fakeRinger.setClassName("com.example.mani.fakecall", "com.example.mani.fakecall.FakeRinger");
fakeRinger.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
fakeRinger.putExtra("USER_FAKE_NAME", getFakeName);
fakeRinger.putExtra("USER_FAKE_NUMBER", getFakeNumber);
context.startActivity(fakeRinger);
Log.v("Yes, we are in", "Alarm reciever");
Log.v("fake name is: ", getFakeName);
Log.v("fake number is: ", getFakeNumber);
}
}
这是我的 FakeRinger
Activity
public class FakeRinger extends AppCompatActivity {
TextView displayName;
TextView displayNumber;
Button alarmOffButton;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_fake_ringer);
displayName = findViewById(R.id.display_name);
displayNumber = findViewById(R.id.display_number);
String callName = getFakeName();
String callNumber = getFakeNumber();
displayName.setText(callName);
displayNumber.setText(callNumber);
alarmOffButton = findViewById(R.id.alarm_off);
alarmOffButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
}
});
}
private String getFakeName(){
String contactName = null;
Intent i = getIntent();
Bundle bundle = i.getExtras();
if (bundle != null) {
contactName = bundle.getString("USER_FAKE_NAME");
}
return contactName;
}
private String getFakeNumber(){
String contactNumber = null;
Intent i = getIntent();
Bundle bundle = i.getExtras();
if (bundle != null) {
contactNumber = bundle.getString("USER_FAKE_NUMBER");
}
return contactNumber;
}
}
我仍然无法显示用户在 FakeRinger
activity 中输入的姓名和号码。谁能告诉我哪里做错了?
您需要将这两行移动到 FAB 点击监听器中
enteredName = name.getText().toString().trim();
enteredNumber = number.getText().toString().trim();
在您当前拥有它们的地方,布局是空的,并且您永远不会将这些字符串分配给其他任何内容。
如果您没有看到来自 AlarmReciever 的日志,那么无论如何都不会将任何内容传递给下一个 activity