1

Ich habe eine Klasse, die eine Fragensequenz behandelt. Es verlängert die Aktivität nicht. In der Klasse gibt es die Methode:onActivityResult wird nicht von finish() aufgerufen, wenn die übergeordnete Aktivität als Parameter an eine Absicht in einer Nicht-Aktivitätsklasse übergeben wird

public class QuizMaster { 
    public void startQuiz(Activity activity, Model model) { 
     //switch - case statement using model 

     Intent intent = new Intent(activity, QuestionTextActivity.class) 
     activity.startActivityForResult(intent, requestCode); 

     //other case statements with other intents 
    } 
} 

Wenn ich diese Methode von einer Arbeitstätigkeit rufen mit

mQuizMaster.startQuiz(this, mModel); 

Und ich beende(), um das Kind Aktivität:

Intent returnIntent = new Intent(); 
returnIntent.putExtra(ARG_SELECTED_CHECKBOX, checkedBox); 
setResult(RESULT_CODE, returnIntent); 
finish(); 

es doesn Die

@Override 
protected void onActivityResult(final int requestCode, final int resultCode, final Intent data) { 
    Log.d(LOG_TAG, "OnActivityResult called in SignDetailsActivity. Resultcode is: "); 
} 

des Benutzers nicht ausführen

Aber wenn ich die

Intent intent = new Intent(activity, QuestionTextActivity.class) 
activity.startActivityForResult(intent, requestCode); 

in der eigentlichen Mutteraktivitätsdatei ausführen, tut es die onActivityResult Methode ausführen.

Warum führt die untergeordnete Aktivität das onActivityResult in der übergeordneten Aktivität nicht aus, wenn es mit einer nicht aktiven Klasse gesendet wird? Wie behebe ich das?

Ich habe niemanden mit dem gleichen Problem mit der Ausführung neuer Intent() in einer Nicht-Aktivität-Klasse wie folgt gefunden. Wenn es jemanden gibt, habe ich nicht die richtigen Suchbegriffe verwendet und einige andere geben das gleiche ein wie ich und komme auf dieser Seite.

+1

Das neue Intent nicht die Aktivität startet, muss es so etwas wie „startActivity“ oder „startActivityForResult“ im Code sein .. könnten Sie bitte Ihr Codebeispiel aktualisieren ? – Bmuig

+0

Entschuldigung, ich habe vergessen, diese Codezeile zu der Frage hinzuzufügen. – Janneman96

+0

Es ist ein Schalter mit 7 Fällen, die alle eine andere Kindklasse in die Absicht setzen. Nachdem eine ausgewählt wurde, werden immer 4 inent.putExtra und activity.startActivityForResult (intent, requestCode) ausgeführt. – Janneman96

Antwort

2

Sie müssen anrufen setResult (int) vor dem Anruf finish(). Dies ist von Aktivität documentation:

Wenn eine Aktivität beendet wird, kann es setResult (int) aufrufen, um Daten zurückzukehren an ihre Mutter. Es muss immer einen Ergebniscode liefern, der die Standardresultate RESULT_CANCELED, RESULT_OK oder alle benutzerdefinierten Werte beginnend bei RESULT_FIRST_USER sein kann. Darüber hinaus kann optional eine Absicht zurückgeben, die zusätzliche Daten enthält. Alle diese Informationen erscheinen wieder in der Activity.onActivityResult(), des Elternteils zusammen mit der ursprünglichen Integer-Kennung.

Hier ist meine Implementierung, die gearbeitet:

MainActivity.java (Mutter Aktivität)

public class MainActivity extends AppCompatActivity { 

    private Sample sample; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     Button btn = (Button) findViewById(R.id.button); 
     btn.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       sample = new Sample(); 
       sample.startActivity(MainActivity.this); 
      } 
     }); 
    } 

    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     super.onActivityResult(requestCode, resultCode, data); 
     Log.d("TEST", "DONE"); 
    } 
} 

LaunchActivity.java (Kinder Aktivität)

public class LaunchActivity extends AppCompatActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_launch); 

     Button btn = (Button) findViewById(R.id.button2); 
     btn.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       setIntent(new Intent()); 
       finish(); 
      } 
     }); 
    } 
} 

Sample.java (Klasse Start-Aktivität)

public class Sample { 

    public Sample() {} 

    public void startActivity (Activity a) { 
     Intent it = new Intent(a, LaunchActivity.class); 
     a.startActivityForResult(it, 0); 
    } 

} 
+0

Entschuldigung, ich habe diesen Code nicht hinzugefügt. Ich habe setResult aufgerufen und ich werde es jetzt zur Frage hinzufügen. – Janneman96

+0

Wenn ich die untergeordnete Aktivität nicht ändere, sondern sie von der tatsächlichen übergeordneten Aktivität statt von der nicht-aktiven Klasse, die ich von der übergeordneten Aktivität mit .startQuiz (this, mModel) aufgerufen habe, aufruft, ruft sie das onActivityResult auf, wenn dies der Fall ist finish() – Janneman96

+0

Das ist interessant ... Könnten Sie Ihren onActivityResult-Code hinzufügen? Weil es nach [dieser] funktionieren sollte (http://stackoverflow.com/questions/2848775/use-startactivityforresult-from-non-activity). – solosodium