2011-02-04 11 views
13

To jest mój problem, mam główny widok, który pokazuje tylko jeden przycisk, naciśnięcie tego przycisku wyświetla inny widok. Ten widok ma tylko inny przycisk, gdy ten przycisk jest wciśnięty, ten bieżący widok kończy się, a kontrolka wraca do poprzedniego widoku.Android pobiera RESULT_CANCELED, gdy specjalnie dodaję RESULT_OK

Aby wyświetlić drugi widok, używam funkcji startActivityForResult, umieszczam tutaj kod.

private void startNewview() {  
    Intent it = new Intent(getApplicationContext(), newView.class); 
    startActivityForResult(it,VIEW_ID); 

} 

Widok wywołana tylko ma zdarzenie przycisk, Oto kod

Button b = (Button) findViewById(R.id.close); 
    b.setOnClickListener(new View.OnClickListener() { 

     public void onClick(View v) { 
      setResult(RESULT_OK);    
      finish(); 

     } 
    }); 

I wreszcie, onActivityResult metoda w widoku głównym, Oto kod

protected void onActivityResult(int requestCode, int resultCode, Intent data) { 

    super.onActivityResult(requestCode, resultCode, data); 
    if(requestCode == VIEW_ID && resultCode == RESULT_OK) { 
     tv = (TextView) findViewById(R.id.tv); 
     tv.setText("The result ok is here :)"); 
    } 

} 

problem jest resultCode zawsze jest 0 = RESULT_CANCELED i nie wiem jak go rozwiązać, czy ktoś może mi pomóc?

Dziękuję bardzo!

+0

Duplikat http://stackoverflow.com/questions/2679250/setresult-does-not-work-when-back-button-pressed – pjv

Odpowiedz

5

nie mogę wyjaśnić, co dzieje się w kodzie, ale mam próbkę projektu to zrobić ..

a FooActivity za pomocą przycisku btnFoo:

@Override 
protected void onStart() { 
    super.onStart(); 

    btnFoo.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      startActivityForResult(new Intent("xper.activity.ACTIVITY_BAR_INTENT"),1); 
     } 
    }); 
} 

i BarActivity dodany w AndroidManifest.xml tak:

<activity 
    android:name = "BarActivity"> 
    <intent-filter> 
     <action 
      android:name = "xper.activity.ACTIVITY_BAR_INTENT"/> 
     <category 
      android:name = "android.intent.category.DEFAULT"/> 
    </intent-filter> 
</activity> 

odpowiedni kod, aby pobrać intencję wewnątrz bar jest w onClicEvent z btnBar (przycisk):

@Override 
protected void onStart() { 
    super.onStart(); 

    btnBar.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      Intent intent = new Intent("xper.activity.ACTIVITY_BAR_RESULT_INTENT"); 
      intent.putExtra("codBar", "bar"); 
      setResult(Activity.RESULT_OK, intent); 
      finish(); 

     } 
    }); 
} 

Teraz, jeśli nie radzisz sobie dobrze z zdarzeniem onActivityResult(), po naciśnięciu przycisku "WSTECZ" w systemie Android możesz uzyskać błędy.

Jeśli intencją (intencją) w działaniu B jest przekazanie pewnych informacji do działania A, to po naciśnięciu przycisku nie wiem, czy aktywność B będzie w stosie, ale intencja nie jest nie gotowe. Więc zrobiłem następujące:

@Override 
public void onBackPressed() { 
    // TODO Auto-generated method stub 
    super.onBackPressed(); 

    //Intent intent = new Intent("xper.activity.ACTIVITY_BAR_RESULT_INTENT"); 
    //intent.putExtra("codBar", "bar"); 
    //setResult(Activity.RESULT_CANCELED, intent); 
    setResult(Activity.RESULT_CANCELED); 
    finish(); 
} 

Obchodzenie się z informacjami zrobiłem następujące w przypadku onActivityResult(), aby zobaczyć pobrane informacje w działalności bar:

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 
    if(data != null) { 
     Toast.makeText(this, "BAR\trequestCode == " + requestCode + "\tresultCode == " + resultCode + "\tdata == " + data, 10000).show(); 
     btnFoo.setText("BAR\trequestCode == " + requestCode + "\tresultCode == " + resultCode + "\tdata == " + data /*+ "extras == " + data.getExtras().getString("codBar")*/); 
    } else { 
     Toast.makeText(this, "BAR\trequestCode == " + requestCode + "\tresultCode == " + resultCode, 10000).show(); 
     btnFoo.setText("BAR\trequestCode == " + requestCode + "\tresultCode == " + resultCode); 
    } 

} 

jeśli masz więcej działań, aby powrócić Informacje na temat aktywności rodzica są dobre: ​​

//put private static final int globals atributes with the respective name of the 
//activity to represent the requestCode for each activity you have like: 
private static final int ACTIVITY1 = 117; 
private static final int ACTIVITY2 = 118; 
... 
private static final int ACTIVITYN = 215; 

//In the event onActivityResult() is better use the switch statement to handle each 
//specific activity to catch information 
@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 

    if(resultCode == Activity.RESULT_CANCELED) return; // breaks 
    //if you decide to handle some information of Activity.RESULT_CANCELED 
    //ignore the above condition that returns and handle it inside the switch statement 

    switch(requestCode) { 
    case ACTIVITY1: 
    { 
     //Dosomething 
    } break; 
    case ACTIVITY2: 
    { 
     //Dosomething 
    } break; 
    ... 
    case ACTIVITYN: 
    { 
     //Dosomething 
    } break; 
    } 
} 

Jeśli nie możesz wykonać tego przykładowego kodu .. proszę dać mi swój e-mail do mnie wysłać projekt FooBarActivity

+0

w rzeczywistości twoja funkcja "onBackPressed()" nie działała tutaj, chyba że usunę (niepotrzebne) super.OnBackPressed(). – chksr

+0

'' 'new Intent (" xper.activity.ACTIVITY_BAR_INTENT "), 1)' '' nie pasuje do żadnego konstruktora –

-1

Użyj tego

Intent returnIntent = new Intent(); 
    setResult(RESULT_OK,returnIntent); 

zamiast

setResult(RESULT_OK); 

tylko

+0

Próbowałem tego rozwiązania, ale nie działa, otrzymuję to samo: S –

+0

Czy używasz metody finish() po setResult –

6

tutaj,

@Override 
public void onBackPressed() { 
    setResult(Activity.RESULT_OK); 
    finish(); 
} 

działa do zwrotu (RESULT_OK), naciskając przycisk Wstecz. NIE WOLNO wywoływać

super.onBackPressed().

+0

To jest właściwie poprawna odpowiedź. –

Powiązane problemy