2013-07-11 12 views
7

Mam aktywność, która pokazuje widok siatki elementów. kiedy kliknę którąkolwiek z nich, przechodzę do innej czynności pokazującej informacje o przedmiocie. Mam także opcję powrotu (gridview activity) lub usunięcia go.Jak przesłać wartość przez zamiar po zakończeniu działania

Jeśli go usunę, muszę odświeżyć widok siatki, więc muszę wysłać zmienną mówiąc "eey, usunąłem element." Musisz odświeżyć ".

Domyślam się, że muszę otworzyć drugą aktywność za pomocą funkcji startActivityForResult, ale nie wiem, w jaki sposób ustawić wartość.

opcja 1 (strzałka wsteczna): kończy działanie. brak wyniku. opcja 2 (usuń pozycję): kończy działanie i ustawia wynik z powrotem.

Z góry dziękuję!

+0

użyj 'startActivityForResult (intent, requestCode)'; –

+0

sprawdź to http://stackoverflow.com/a/10407371/1911784 – OMAK

Odpowiedz

13

Możesz ustawić swój wynik niestandardowy. Podobnie jak DELETE_ITEM.

Na przycisk Usuń zrobić coś takiego:

public static int DELETE_ITEM = 1234; 

Intent intent = new Intent(); 
intent.putExtra("ITEM_ID", YOUR ITEM ID); 
setResult(DELETE_ITEM , intent); 

Teraz na skutek działalności zrobić coś takiego:

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent intent) { 
    if (resultCode == DELETE_ITEM) { 
    // CODE TO DELETE ITEM 
    super.onActivityResult(requestCode, resultCode, intent); 
    } 
} 
4

Tak, musisz użyć startActivityForResult. Przed skontaktowaniem wykończenie z działalności, który pokazuje informacje o pozycji, trzeba zadzwonić

setResult(resultCode, data); 
finish(); 

aktywności GridView zostanie wywołany

protected void onActivityResult(int arg0, int resultCode, Intent data) 
8

Nadzieja to pomaga

Pierwsza klasa

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 
     } 
    } 
} 

Druga klasa

Intent returnIntent = new Intent(); 
returnIntent.putExtra("result", "your message"); 
setResult(RESULT_OK, returnIntent); 
finish(); 
0

Po prostu trzeba usunąć zestaw wywołania obrazu setResult z odpowiednim kodem wyników i być może danymi.

Uważam, że najlepszym sposobem na osiągnięcie tego celu jest powrót z niestandardowego wyniku użytkownika do przeglądania obrazu. Można to osiągnąć, pisząc coś takiego w swojej przeglądarce obrazów.

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(); 
} 

Możecie być trzeba ustawić domyślny wynik w swojej onCreate metody

@Override 
public void onCreate(Bundle savedInstanceState) { 
    // init stuff 
    setResult(RESULT_OK); 
} 

Na swojej działalności siatki Musisz sprawdzić kod wyniku swojej działalności przeglądarkę zdjęć, a jeśli to nie jest w porządku - make sprawdź sieć, aby zmienić dane.

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(); 
     } 
    } 
} 
0

można rozpocząć nową wartość activity.Send przez zamiarem pomocą tego ..

intent główne = nowy intent (MainActivity.this, SecondActivity.class); main.putExtra ("JobId", jobid); startActivityForResult (audio, requestCode);

otrzymania wartości w SecondActivity tak ..

Int jobid = getIntent() getExtras() getInt ("jobid")..;

0

powiedzieć, że chcesz iść z działalności A do działalności B i przekazać wartość do B, a na koniec zakończyć A.

Postępuj zgodnie z:

gdzieś w:

Intent goToActivityBIntent = new Intent(A.this, B.class); 
goToActivityBIntent.putExtra("com.example.myapp.data", data); 
      startActivity(goToActivityBIntent); 
      finish(); // close A 

odbierać dane w 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 

    } 
0

Nie ma potrzeby, aby zakończyć działanie

//reload the adapter and use grid.invalidateViews(); Method 
adapter = new AppAdapter(MyApp.this, MyApp.this, data, show_collection); 
grid.invalidateViews(); 
grid.setAdapter(adapter); 

GridView ma metodę invalidateViews() .

po wywołaniu tej metody: "wszystkie widoki do ponownego przebudowania i przerysowania."

0

Cóż, mam zrobić w ten sposób:

start ActivityB z AcivityA przez startActivityForResult:

Intent intent = new Intent(AcivityA.this, ActivityB.class); 
startActivityForResult(intent, 19); 

W ActivityB użycie setResult do wysyłania danych do AcivityA:

@Override 
public void finish() { 
    Intent intent = new Intent(); 
    intent.putExtra("flag",true); 
    setResult(RESULT_OK, intent); 
    super.finish(); 
} 

W ActivityAotrzymać dane, które zostały wysłane przez ActivityB jak 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); 
     } 
    } 
} 

Nadzieja to pomoże.

Powiązane problemy