Android onActivityResult никогда не вызывал
мой метод onActivityResult никогда не вызывается. я использую android 2.2
Я использую Tabhost, где TabHosts содержат TabGroups, которые содержат отдельные действия.
Один из моих индивидуальных действий выполняет следующее намерение
Intent intent = new Intent();
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(Intent.createChooser(intent,
"Select Picture"), 0);
это загружает мои приложения для галереи, я использую галерею по умолчанию для Android, чтобы выбрать одно изображение, и когда я возвращаю свой onActivityResult, я не называю свою активность.
Похоже на это - и я поставил точку останова в if(resultCode == 0)
, поэтому прямо сейчас логика моего onActivityResult не должна иметь значения
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode == 0) {
if (requestCode == 0) {
Uri selectedImageUri = data.getData();
//OI FILE Manager
filemanagerstring = selectedImageUri.getPath();
//MEDIA GALLERY
selectedImagePath = getPath(selectedImageUri);
//DEBUG PURPOSE - you can delete this if you want
if(selectedImagePath!=null)
System.out.println(selectedImagePath);
else System.out.println("selectedImagePath is null");
if(filemanagerstring!=null)
System.out.println(filemanagerstring);
else System.out.println("filemanagerstring is null");
//NOW WE HAVE OUR WANTED STRING
if(selectedImagePath!=null)
System.out.println("selectedImagePath is the right one for you!");
else
System.out.println("filemanagerstring is the right one for you!");
}
}
}
Функции Lifecycle часто выходят из строя и с перерывами для операций в tabhost/tabgroup, поэтому я проверил, чтобы увидеть, какие функции жизненного цикла ARE вызываются после закрытия галереи (это происходит, как только я выбираю изображение из галереи Android )
Единственный, который вызывается, - это onResume()
в моей активности TabHost. Поэтому я попытался применить тот же метод onActivityResult()
в моем классе TabHost AS WELL AS класс TabActivity. С точкой останова в том же месте в начале метода.
Ни один из этих классов не называется.
Теперь я рисую пустоту, как получить результат из приложения галереи в моем приложении, если ни один из встроенных методов приема не ответит на него.
Так как я знаю, что моя основная TabHost получает вызываемый onResume()
, я попытался добавить Intent graphics = getIntent();
, чтобы узнать, будет ли он получать данные из выбора галереи, это не так, поэтому я не вижу, как я могу сделать логики в методе onResume().
Решения приветствуются!:)
Ответы
Ответ 1
Решение состоит в том, чтобы вызвать прозрачную активность поверх основной активности. Эта прозрачная активность находится перед tabhost и будет иметь нормальные функции жизненного цикла.
Эта прозрачная активность вызывает намерение галереи onCreate(), она возвращает все, как обычно, в onActivityResult, и вы сможете передать информацию, возвращенную обратно в остальную часть приложения, как обычно. finish() находится внутри метода onActivityResult, поэтому пользователь даже не замечает, что была вызвана прозрачная активность.
Обновление скопировано из комментариев:
Действие A вызывает активность B посредством обычного намерения. Активность B не имеет xml и работает onCreate как это
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
и когда действие C завершено, он вызывает onActivityResult Activity B
Ответ 2
Попробуйте вызвать startActivityForResult, используя контекст активности табуляции, содержащий вашу текущую активность, а затем прослушивание в активности табуляции.
Используйте это, чтобы получить tabGroupActivity:
TabGroupActivity parentActivity = (TabGroupActivity)getParent();
И затем вызовите startActivityForResult из него:
parentActivity.startActivityForResult(...);
Наконец, добавьте прослушиватель onActivityResult в tabGroupActivity:
protected void onActivityResult(int requestCode, int resultCode,Intent intent) {
super.onActivityResult(requestCode, resultCode, intent);
}
Ответ 3
Судя по многим таким вопросам, существует много причин, по которым вызываемая активность не может инициировать метод вызывающего onActivityResult()
.
Одна из причин, по которой я нашел, была, когда я назвал startActivityForResult(intent, requestCode)
, с значением requestCode
меньше 0. Мое приложение не нуждалось в requestCode
и в документации по Android, 0 не отправит a requestCode
.
Но в документах Android не упоминалось о последствиях requestCode
< 0. Следствием этого является то, что он предотвращает вызов вызывающего метода onActivityResult()
! Ой!
Поэтому, даже если вашему приложению не нужен requestCode
, вы все еще хотите использовать его со значением >= 0.
То, что я узнал сегодня: -)
Ответ 4
Вам просто нужно удалить android:noHistory="true"
эту форму в файл манифеста.
Ответ 5
Используйте константные значения для кодов результатов:
Activity.RESULT_OK и
Activity.RESULT_CANCELED
Вы увидите, что значение отменено на самом деле 0. Таким образом, в вашем коде вы проверяете, была ли эта активность отменена.
измените свой код на
if (resultCode == Activity.RESULT_OK) {
...
}
Кроме того, измените действие своего намерения следующим образом:
intent.setAction(Intent.ACTION_PICK);
Если вы сделаете это, вы можете просто позвонить
Intent intent = new Intent(Intent.ACTION_PICK);
intent.setType("image/*");
startActivityForResult(intent, 0);
вместо создания выбора. Он автоматически выберет действия, связанные с этим намерением и миметиком, и покажет их вам.
Ответ 6
Вызывается способ onActivityResult, зависит от запуска режима вашей активности (в манифесте). Я не уверен, что это может быть проблемой.
Ответ 7
У вас есть @Override над вашим onActivityRestult?
(глядя на старый код, который делает это так не уверен, зачем он нужен) вызовите super.onactivityresult(код запроса, результат, данные) в качестве первого вызова метода
также мои намерения не имели этого другого материала в них
startActivityForResult (Intent.createChooser(намерение, "Выбрать изображение" ), 0);
я думаю, должно быть просто
startActivityForResult (source.class, destination.class);
конечно, источником и местом назначения должно быть имя классов
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);
}
}