как отправить значение через 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);
        }
    }
}

надеюсь, это поможет вы.