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);
    }

}