|
A Crowd-sourced Cookbook on Writing Great Android® Apps |
|
|
|||||||
|
||||||||||
|
Contributed by
Ulysses Levy 2010-11-15 11:26:41 (updated 2011-09-24 04:21:13)
In Published Edition?
Yes
|
0
Votes |
Your main activity needs to retrieve data from a sub activity.
Use startActivityForResult(), and onActivityResult() in the main activity, and setResult() in the sub-activity.
In this example we return a string from a Sub-Activity (MySubActivity) back to the Main Activity (MyMainActivity).
The first step is to "push" data from MyMainActivity via the Intent mechanism.
public class MyMainActivity extends Activity { //..for logging.. private static final String TAG = "MainActivity"; //..The request code is supposed to be unique?.. public static final int MY_REQUEST_CODE = 123; @Override public void onCreate( Bundle savedInstanceState ) { ... } private void pushFxn() { Intent intent = new Intent( this, MySubActivity.class ); startActivityForResult( intent, MY_REQUEST_CODE ); } protected void onActivityResult( int requestCode, int resultCode, Intent pData) { if ( requestCode == MY_REQUEST_CODE ) { if (resultCode == Activity.RESULT_OK ) { final String zData = pData.getExtras().getString( MySubActivity.EXTRA_STRING_NAME ); //..do something with our retrieved value.. Log.v( TAG, "Retrieved Value zData is "+zData ); //..logcats "Retrieved Value zData is returnValueAsString" } } } }
Notes:
The second major step is to "pull" data back from MySubActivity to MyMainActivity.
public class MySubActivity extends Activity { public static final String EXTRA_STRING_NAME = "extraStringName"; @Override public void onCreate( Bundle savedInstanceState ) { ... } private void pullFxn() { Intent iData = new Intent(); iData.putExtra( EXTRA_STRING_NAME, "returnValueAsString" ); setResult( android.app.Activity.RESULT_OK, iData ); //..returns us to the parent "MyMainActivity".. finish(); } }
Code Notes:
In my app, I have a ListActivity with a ContextMenu (user long presses a selection to do something), and I wanted to let the Main-Activity know which row the user had selected for the ContextMenu action ( atm, my app only has one action ). I ended up using intent extras to pass the selected row's index as a string back to the parent activity; From there I could just convert the index back to an int and use it to identify the user row selection via ArrayList.get( index ). This worked for me, however I am sure there is another/better way.
Also see How to push string-values using Intent.putExtra()
startActivityForResultExample (under "Returning a Result from a Screen")
|