как отправить значение через intent после завершения действия
У меня есть действие, которое показывает gridview элементов. когда я нажимаю на любой из них, я перехожу к другому действию, показывающему информацию об элементе. У меня также есть возможность вернуться (действие gridview) или удалить его.
Если я удалю его, мне нужно обновить gridview, поэтому мне нужно отправить переменную "eey, я удалил элемент. вам нужно освежиться".
Я думаю, мне нужно открыть второе действие с помощью startActivityForResult, но я не знаю, как я должен задать значение.
Вариант 1 (стрелка назад): завершает действие. никакого результата. вариант 2 (удалить элемент): завершает действие и возвращает результат.
спасибо заранее!
8 ответов
вы можете установить индивидуальный результат. Как DELETE_ITEM
.
на вашей кнопке удаления сделайте что-то вроде этого :
public static int DELETE_ITEM = 1234;
Intent intent = new Intent();
intent.putExtra("ITEM_ID", YOUR ITEM ID);
setResult(DELETE_ITEM , intent);
Теперь на результат вашей деятельности сделайте что-то вроде этого :
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
if (resultCode == DELETE_ITEM) {
// CODE TO DELETE ITEM
super.onActivityResult(requestCode, resultCode, intent);
}
}
надеюсь, что это помогает
первый класс
Intent i = new Intent(this, Second.class);
startActivityForResult(i, 1);
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == 1) {
if (resultCode == RESULT_OK) {
String result = data.getStringExtra("result");
//your code
}
if (resultCode == RESULT_CANCELED) {
// Write your code if there's no result
}
}
}
второй класс
Intent returnIntent = new Intent();
returnIntent.putExtra("result", "your message");
setResult(RESULT_OK, returnIntent);
finish();
Да, вы должны использовать startActivityForResult
. Перед вызовом finish на действие, которое показывает информацию элемента, вы должны позвонить
setResult(resultCode, data);
finish();
в деятельности GridView будет вызываться
protected void onActivityResult(int arg0, int resultCode, Intent data)
мы можем начать новую деятельность.Отправьте значение через intent, используя это..
Intent main= новое намерение (MainActivity.это, во-вторых.класс); главный.putExtra ("JobId", jobid); startActivityForResult(аудио, requestCode);
получить значение в SecondActivity, как это..
int jobid = getIntent ().getExtras().getInt ("jobId");
скажем, я хочу перейти от действия A к действию B, передать значение B и, наконец, закончить A.
выполните это:
где-то в A:
Intent goToActivityBIntent = new Intent(A.this, B.class);
goToActivityBIntent.putExtra("com.example.myapp.data", data);
startActivity(goToActivityBIntent);
finish(); // close A
получить данные в B:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_b);
// receive the data
Bundle extras = getIntent().getExtras();
if (extras != null) {
data = extras.getString("com.example.myapp.data");
}
// Some stuff
}
нет необходимости заканчивать работу
//reload the adapter and use grid.invalidateViews(); Method
adapter = new AppAdapter(MyApp.this, MyApp.this, data, show_collection );
grid.invalidateViews();
grid.setAdapter(adapter);
GridView имеет метод invalidateViews ().
при вызове этого метода :" все представления, которые необходимо перестроить и перерисовать."
вам просто нужно после удаления изображения вызова setResult с соответствующим кодом результата и, возможно, данных.
Я думаю, что наиболее правильный способ достичь этого-вернуться из вашего пользовательского результата просмотра изображений. Это может быть достигнуто, если вы напишете что-то подобное в своей активности просмотра изображений.
public static final int RESULT_IMAGE_DELETED = RESULT_FIRST_USER;
public static final int RESULT_EXTRA_IMAGE_ID = "extra.imageid";
void onImageDeleted(int imageId) {
Bundle resultData = new Bundle();
resultData.putInt(RESULT_EXTRA_IMAGE_ID, imageId);
setResult(RESULT_IMAGE_DELETED);
finish();
}
вам может потребоваться установить результат по умолчанию в методе onCreate
@Override
public void onCreate(Bundle savedInstanceState) {
// init stuff
setResult(RESULT_OK);
}
на вашей деятельности сетки вы должны проверить код результата вашего активность просмотра изображений, и если это не нормально - проверьте свою сетку, чтобы она изменила данные.
public static final int REQUEST_VIEW_IMAGE = 1;
void startImageViewing(int imageId) {
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.putExtra(ImageViewActivity.EXTRA_IMAGE_ID);
startActivityForResult(intent, REQUEST_VIEW_IMAGE);
}
@Override
public void onActivityResult(int requestCode, int resultCode, Bundle data) {
if (requestCode == REQUEST_VIEW_IMAGE) {
if (resultCode != RESULT_OK) {
updateImageGridView();
}
}
}
Ну, я сделал так:
старт ActivityB С AcivityA by startActivityForResult:
Intent intent = new Intent(AcivityA.this, ActivityB.class);
startActivityForResult(intent, 19);
на ActivityB использовать setResult
для отправки данных AcivityA:
@Override
public void finish() {
Intent intent = new Intent();
intent.putExtra("flag",true);
setResult(RESULT_OK, intent);
super.finish();
}
на ActivityA получать данные, которые были отправлены ActivityB as onActivityResult:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == 19) {
if(resultCode == RESULT_OK) {
boolean flagResult = data.getBooleanExtra("flag");
Log.i("Result", ""+flagResult);
}
}
}
надеюсь, это поможет вы.