Android onActivityResult НИКОГДА не вызывается - PullRequest
2 голосов
/ 18 октября 2011

мой метод 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!");
        }
    }
}

Функции жизненного цикла часто вызываются не по порядку и с перерывами для действий внутри группы вкладок / вкладок, поэтому я проверил, какие функции жизненного цикла вызываются после закрытия галереи (это происходит, как только я выбираю изображение из галереи Android )

Единственный вызываемый - это onResume() в моей активности TabHost. Поэтому я попытался поместить точно такой же метод onActivityResult() в мой класс TabHost, КАК ХОРОШО, КАК класс TabActivity. С точкой останова в том же месте в начале метода.

Ни один из этих классов не называется.

Сейчас я рисую пробел, как я могу получить результат из приложения галереи в моем приложении, если ни один из встроенных методов получения не ответит на него.

Поскольку я знаю, что мой основной TabHost получает вызываемый onResume(), я попытался добавить Intent graphics = getIntent();, чтобы посмотреть, получит ли он данные из выбора галереи, но не получит, поэтому я не вижу, как я могу это сделать. логика в методе onResume () либо.

Решения приветствуются! :)

Ответы [ 7 ]

18 голосов
/ 09 февраля 2012

Попробуйте вызвать 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);
    }
16 голосов
/ 11 ноября 2011

Судя по множеству подобных вопросов, существует много причин, по которым вызываемая активность может не вызывать метод onActivityResult() вызывающего абонента.

Одна причина, которую я обнаружил, была, когда я позвонил startActivityForResult(intent, requestCode) со значением requestCode меньше 0. Моему приложению не требовался requestCode, а в документации Android, где указано <0, не будет отправлено <code>requestCode.

Но в документации по Android не упоминалось о последствиях requestCode <0. Следствием этого является то, что он предотвращает вызов метода <code>onActivityResult() вызывающей стороны! Ой!

Следовательно, даже если вашему приложению не нужен requestCode, многие из вас все равно захотят использовать его со значением> = 0.

Вот что я узнал сегодня: -)

4 голосов
/ 19 октября 2011

Решение состоит в том, чтобы назвать прозрачную деятельность поверх основной деятельности.Это прозрачное действие находится перед 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 действия B

2 голосов
/ 30 января 2017

Вы просто должны удалить android:noHistory="true" эту форму вашего файла манифеста.

1 голос
/ 18 октября 2011

Используйте постоянные значения для кодов результата:

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

вместо создания селектора.Он автоматически выберет действия, связанные с этим намерением и mimetype, и отобразит их вам

0 голосов
/ 15 февраля 2012

Способ вызова onActivityResult зависит от launchMode вашей активности (в манифесте). Я не уверен, может ли это быть проблемой здесь.

0 голосов
/ 18 октября 2011

у вас @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);
    }

}
...