my onActivityResult method is never called. am using android 2.2
I am using a Tabhost, where TabHosts contain TabGroups which contain individual Activities.
Judging from the many questions like this one, there are many reasons why a called activity may not trigger the caller's onActivityResult()
method.
One reason I found, was when I called startActivityForResult(intent, requestCode)
, with a requestCode
value of less than 0. My application did not need a requestCode
and the Android documentation said using < 0 would not send a requestCode
.
But the Android docs did not mention the consequence of a requestCode
< 0. The consequence is that it prevents the caller's onActivityResult()
method from ever being invoked! Ouch!
Therefore, even if your app does not need a requestCode
, you many still want to use one with a value >= 0.
That's what I learned today:-)
Try to call the startActivityForResult using the context of the tabgroup activity containing your current activity and then listen in the tabgroup activity.
Use this to get the tabGroupActivity:
TabGroupActivity parentActivity = (TabGroupActivity)getParent();
And then call startActivityForResult from it:
parentActivity.startActivityForResult(...);
Finally , put an onActivityResult listener in the tabGroupActivity:
protected void onActivityResult(int requestCode, int resultCode,Intent intent) {
super.onActivityResult(requestCode, resultCode, intent);
}
do you have @Override above your onActivityRestult?
(looking at old code that does this so not sure why its needed) call super.onactivityresult(requestcode, resultscode, data) as the first call in the method
also my intents didnt have that other stuff in them startActivityForResult(Intent.createChooser(intent, "Select Picture"), 0); i think should just be startActivityForResult(source.class, destination.class); of course source and destination should be the name of the classes
public class ImageSwitcherView extends Activity {
int pics[] = { R.drawable.image000, R.drawable.image001,
R.drawable.image002};
private int currentIndex = 0;
SharedPreferences preferences;
Gallery gallery;
ImageView fullPicView;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.galleryview);
Bundle extras = getIntent().getExtras();
currentIndex = extras.getInt("bookmark");
gallery = (Gallery) findViewById(R.id.Gallery01);
gallery.setAdapter(new ImageAdapter(this));
gallery.setSelection(currentIndex);
gallery.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView parent, View v, int position,
long id) {
currentIndex = position;
// ---display the images selected---
fullPicView = (ImageView) findViewById(R.id.imageView1);
fullPicView.setImageResource(pics[currentIndex]);
fullPicView.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Intent myIntent = new Intent(ImageSwitcherView.this,
imageView.class);
int resID = pics[currentIndex];
myIntent.putExtra("resID", resID);
myIntent.putExtra("index", currentIndex);
startActivityForResult(myIntent, 1);
}
});
}
});
}
public class ImageAdapter extends BaseAdapter {
private Context context;
private int itemBackground;
public ImageAdapter(Context c) {
context = c;
// ---setting the style---
TypedArray a = obtainStyledAttributes(R.styleable.Gallery1);
itemBackground = a.getResourceId(
R.styleable.Gallery1_android_galleryItemBackground, 0);
a.recycle();
}
// ---returns the number of images---
public int getCount() {
return pics.length;
}
// ---returns the ID of an item---
public Object getItem(int position) {
return position;
}
public long getItemId(int position) {
return position;
}
// ---returns an ImageView view---
public View getView(int position, View convertView, ViewGroup parent) {
ImageView imageView = new ImageView(context);
imageView.setImageResource(pics[position]);
imageView.setScaleType(ImageView.ScaleType.FIT_XY);
imageView.setLayoutParams(new Gallery.LayoutParams(150, 120));
imageView.setBackgroundResource(itemBackground);
return imageView;
}
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
currentIndex = data.getIntExtra("bookmark", 0);
gallery.setSelection(currentIndex);
fullPicView.setImageResource(pics[currentIndex]);
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK
|| keyCode == KeyEvent.KEYCODE_HOME) {
preferences = PreferenceManager.getDefaultSharedPreferences(this);
SharedPreferences.Editor editor = preferences.edit();
editor.putInt("bookmark", gallery.getSelectedItemPosition());
editor.commit();
finish();
}
return super.onKeyDown(keyCode, event);
}
}
The solution is to call a transparent activity over top of the main activity. This transparent activity is in front of the tabhost and will have normal lifecycle functions.
This transparent activity calls the gallery intent onCreate(), it gets everything returned like normal in its onActivityResult and you will be able to pass the information returned back to the rest of the app like normal. finish() is inside of the onActivityResult method, so the user never even notices that a transparent activity was called.
Update copied from from comments:
Activity A calls Activity B via normal intent. Activity B has no xml and runs onCreate like this
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//setContentView(R.layout.dialogpopper);
Intent intent = new Intent(Intent.ACTION_PICK);
intent.setType("image/*"); startActivityForResult(intent, 0);
}//end onCreate
and when Activity C is finished it calls the onActivityResult of Activity B
Use the constant values for the Result codes:
Activity.RESULT_OK and Activity.RESULT_CANCELED
You'll see that the value for cancelled is actually 0. So in your code you are checking to see if the activity was cancelled.
change your code to
if (resultCode == Activity.RESULT_OK) {
...
}
Additionally change your Intent action to be:
intent.setAction(Intent.ACTION_PICK);
If you do this, you can just call
Intent intent = new Intent(Intent.ACTION_PICK);
intent.setType("image/*");
startActivityForResult(intent, 0);
instead of creating the chooser. It will automatically pick the activities associated with that intent and mimetype and display them to you
The way onActivityResult is called depends on the launchMode of your Activity (in the manifest). I'm not sure if that can be an issue here.