Чтобы получить результат от действия, вы должны использовать startActivityForResult()
и onActivityResult()
API вместо startActivity()
.
Вы можете узнать это из этого простого примера, приведенного tutorialspoint: https://www.tutorialspoint.com/how-to-manage-startactivityforresult-on-android
Но последняя документация для разработчиков Android рекомендует использовать для этого новые API результатов деятельности .
Чтобы узнать, вы можете обратиться к документации Google : https://developer.android.com/training/basics/intents/result
И это пишет Ваджахат Карим: https://wajahatkarim.com/2020/05/activity-results-api-onactivityresult/
Я пытаюсь дать вам ответ, используя это Новый API результатов деятельности.
Сначала необходимо добавить библиотеки AndroidX Activity
и Fragment
в качестве зависимостей.
app / build.gradle
apply plugin: 'com.android.application'
android {
compileSdkVersion 29
buildToolsVersion "29.0.2"
defaultConfig {
applicationId "com.lakindu.birthdayreminder"
minSdkVersion 14
targetSdkVersion 29
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'androidx.appcompat:appcompat:1.1.0'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'androidx.test.ext:junit:1.1.1'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
// Reference 1 : https://developer.android.com/training/basics/intents/result
// Reference 2 : https://wajahatkarim.com/2020/05/activity-results-api-onactivityresult/
implementation 'androidx.activity:activity:1.2.0-alpha04'
implementation 'androidx.fragment:fragment:1.3.0-alpha04'
}
I ' В результате я собираюсь отправить объект Parcelable
из действия addlist в MainActivity.
Это реализация этого класса Parcelable Event
.
Event. java
import android.os.Parcel;
import android.os.Parcelable;
public class Event implements Parcelable {
// Name of the person
private String nameOfPerson;
// Day of month
// byte (8 bit) as the type, because day can only have a value from 1 to 31
private byte day;
// Month of year
// byte (8 bit) as the type, because month can only have a value from 1 to 12
private byte month;
// Year
// Short (16 bit) as the type, because year can only have a realistic A.D. year
private short year;
// Type of event
private String eventType;
// Constructor (auto-generated using Android Studio)
public Event(String nameOfPerson, byte day, byte month, short year, String eventType) {
this.nameOfPerson = nameOfPerson;
this.day = day;
this.month = month;
this.year = year;
this.eventType = eventType;
}
// Getters for each private member field (auto-generated using Android Studio)
public String getNameOfPerson() {
return nameOfPerson;
}
public byte getDay() {
return day;
}
public byte getMonth() {
return month;
}
public short getYear() {
return year;
}
public String getEventType() {
return eventType;
}
// Parcelable implementation (auto-generated using Android Studio)
protected Event(Parcel in) {
nameOfPerson = in.readString();
day = in.readByte();
month = in.readByte();
year = (short) in.readInt();
eventType = in.readString();
}
public static final Creator<Event> CREATOR = new Creator<Event>() {
@Override
public Event createFromParcel(Parcel in) {
return new Event(in);
}
@Override
public Event[] newArray(int size) {
return new Event[size];
}
};
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(nameOfPerson);
dest.writeByte(day);
dest.writeByte(month);
dest.writeInt((int) year);
dest.writeString(eventType);
}
}
Затем мы должны создать класс для инкапсуляции входных данных, заданных для операции добавления в список из MainActivity. (в этом примере его нет), и выходные данные возвращаются из операции добавления списка в MainActivity (объект Parcelable).
Этот класс является ActivityResultContract, который подобен контракту, который мы даем системе Android, чтобы открыть указать c действие и получить для него результат.
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import androidx.activity.result.contract.ActivityResultContract;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
public class GetEvent extends ActivityResultContract<Void, Event> {
@NonNull
@Override
public Intent createIntent(@NonNull Context context, Void input) {
// Create Intent that should be used to start addinglist activity for result
Intent intent = new Intent(context, addinglist.class);
// If you need to send any inputs to addinglist activity,
// you can put them in intent as extras.
// Eg: intent.putExtra("input", input)
// But for now we don't have to send any inputs to addinglist activity.
return intent;
}
@Override
public Event parseResult(int resultCode, @Nullable Intent intent) {
// Action is cancelled? Return null
if(Activity.RESULT_OK != resultCode) return null;
// No intent to get output? Return null
if(null == intent) return null;
// Successfully got result from addinglist activity
return intent.getExtras().getParcelable("output");
}
}
Вот как мы запускаем действие списка добавления из MainActivity и получаем результат.
MainActivity. java
import android.os.Bundle;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import androidx.activity.ComponentActivity;
import androidx.activity.result.ActivityResultCallback;
import androidx.activity.result.ActivityResultLauncher;
import java.util.ArrayList;
import java.util.Calendar;
public class MainActivity extends ComponentActivity {
private static final String TAG = "";
ArrayList<String> listItems = new ArrayList<String>();
ArrayAdapter<String> adapter;
Calendar calendar = Calendar.getInstance();
int thisYear = calendar.get(Calendar.YEAR);
int thisMonth = calendar.get(Calendar.MONTH) + 1;
int thisDay = calendar.get(Calendar.DAY_OF_MONTH);
// Holds the latest event received from addinglist activity
private Event mLatestEvent = null;
// Register a callback to be called on an event received from addinglist activity
private ActivityResultLauncher<Void> mGetEvent = registerForActivityResult(
// Instance that encapsulates input and output when starting addinglist activity for result
new GetEvent(),
// Callback to be called when event is received
new ActivityResultCallback<Event>() {
@Override
public void onActivityResult(Event result) {
// Save as latest event received
mLatestEvent = result;
}
}
);
private static final Void NO_INPUT = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
adapter=new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1,
listItems);
ListView records = (ListView) findViewById(R.id.list);
records.setAdapter(adapter);
}
public void addNewEntry(View v)
{
// Launch addinglist activity to get an event
mGetEvent.launch(NO_INPUT);
}
public void viewRecord(View v)
{
// No latest event? Then nothing to add to list, just return.
if(null == mLatestEvent) return;
// Prepare string that is being added to the list.
// Using a StringBuilder as there are multiple number of immutable strings to be appended.
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append(mLatestEvent.getNameOfPerson())
.append(" has his ")
.append(mLatestEvent.getEventType())
.append(" on ")
.append(mLatestEvent.getDay())
.append("/")
.append(mLatestEvent.getMonth())
.append("/")
.append(mLatestEvent.getYear());
String mss = stringBuilder.toString();
//Toast.makeText(getApplicationContext(),mss,Toast.LENGTH_LONG).show();
int age = thisYear - mLatestEvent.getYear();
calendar.set(thisYear,thisMonth,thisDay);
Calendar calendar1 = Calendar.getInstance();
calendar1.set(thisYear, mLatestEvent.getMonth(), mLatestEvent.getDay());
long milliseconds1 = calendar.getTimeInMillis();
long milliseconds2 = calendar1.getTimeInMillis();
long diff = milliseconds2 - milliseconds1;
int noOfDays = (int) (diff / (24 * 60 * 60 * 1000));
String msg2 = "Turning " + age + " in " + noOfDays + "days!!";
// Toast.makeText(getApplicationContext(),msg2,Toast.LENGTH_LONG).show();
String finalMsg = mss + " " + msg2;
listItems.add(finalMsg);
adapter.notifyDataSetChanged();
}
}
Обратите внимание, что MainActivity теперь ComponentActivity
. Не AppCompatActivity.
Ниже описано, как отправить результат действия добавления в MainActivity.
addlist. java
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.NumberPicker;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import androidx.appcompat.app.AppCompatActivity;
public class addinglist extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_addinglist);
NumberPicker day = (NumberPicker) findViewById(R.id.day);
NumberPicker month = (NumberPicker) findViewById((R.id.month));
NumberPicker year = (NumberPicker) findViewById(R.id.year);
day.setMinValue(1);
day.setMaxValue(31);
month.setMinValue(1);
month.setMaxValue(12);
year.setMinValue(1950);
year.setMaxValue(2020);
}
public void addingEvent(View v)
{
String name;
EditText nameEntered = (EditText) findViewById(R.id.name);
name = nameEntered.getText().toString();
NumberPicker day = (NumberPicker) findViewById(R.id.day);
NumberPicker month = (NumberPicker) findViewById((R.id.month));
NumberPicker year = (NumberPicker) findViewById(R.id.year);
byte day1 = (byte) day.getValue();
byte month1 = (byte) month.getValue();
short year1 = (short) year.getValue();
RadioGroup typer = (RadioGroup) findViewById(R.id.typer);
int selectedId = typer.getCheckedRadioButtonId();
RadioButton checked = (RadioButton) findViewById(selectedId);
String typee = checked.getText().toString();
EditText resultbox = (EditText) findViewById(R.id.resultshower);
String Finalmsg = name + " has his " + typee + " on " + day1 + "/" + month1 + "/" + year1;
resultbox.setText(Finalmsg);
// Prepare the result to output
Intent newintent = new Intent();
newintent.putExtra(
"output",
new Event(name, day1, month1, year1, typee)
);
// Set the result
setResult(Activity.RESULT_OK, newintent);
// Finish the addinglist activity.
// Then result will be sent to the MainActivity.
finish();
}
}
Вот работающее приложение.