【问题标题】:Android onActivityResult NEVER calledAndroid onActivityResult 从未调用
【发布时间】:2011-12-10 08:37:00
【问题描述】:

我的 onActivityResult 方法永远不会被调用。我使用的是安卓 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 图库中选择图像时立即发生) )

唯一被调用的是我的 TabHost 活动中的onResume()。因此,我尝试将完全相同的 onActivityResult() 方法放入我的 TabHost 类以及 TabActivity 类中。在方法开头的同一位置有一个断点。

这些类都没有被调用。

我现在正在画一个空白,如果没有内置的接收方法响应它,我如何从我的应用程序中的图库应用程序中获取结果。

由于我知道我的主 TabHost 调用了 onResume(),我尝试添加 Intent graphics = getIntent(); 以查看它是否会接收来自画廊选择的数据,但它不会,所以我不知道该怎么做onResume() 方法中的逻辑。

欢迎解决! :)

【问题讨论】:

  • 你确定在调用 startActivityForResult(..) 的同一个活动中有 onActivityResult 吗?
  • 是的,我还在 tabgroup 和 tabactivity 页面中添加了断点,以查看是否调用了它们中的任何一个。具有讽刺意味的是,如果调用不正确,它会抛出一个 ActivityNotFoundException ,这也不起作用:(它根本没有被调用
  • 只是为了好玩,您是否尝试过创建一个测试项目并将您的意图与上述代码中的 onActivityResult 一起复制以确保它可以正常工作。如果它不起作用,那么。您的手机/模拟器有些时髦。如果它确实有效,则说明您的代码中忽略了某些内容,或者您​​正在调用的活动没有正确调用 setResult(..)

标签: android android-intent gallery android-tabhost lifecycle


【解决方案1】:

尝试使用包含当前活动的选项卡组活动的上下文调用 startActivityForResult,然后在选项卡组活动中进行侦听。

使用它来获取tabGroupActivity:

TabGroupActivity parentActivity = (TabGroupActivity)getParent();

然后从中调用 startActivityForResult:

parentActivity.startActivityForResult(...);

最后,在 tabGroupActivity 中放一个 onActivityResult 监听器:

protected void onActivityResult(int requestCode, int resultCode,Intent intent) {
        super.onActivityResult(requestCode, resultCode, intent);
    }

【讨论】:

  • +1 我从一个片段调用 startActivityForResult(),所以我必须在它前面加上父 Activity 上下文。
【解决方案2】:

从很多类似的问题来看,一个被调用的activity可能不会触发调用者的onActivityResult()方法的原因有很多。

我发现的一个原因是,当我调用 startActivityForResult(intent, requestCode) 时,requestCode 的值小于 0。我的应用程序不需要 requestCode,Android 文档说使用

但是 Android 文档没有提到 requestCode onActivityResult() 方法被调用!哎哟!

因此,即使您的应用不需要requestCode,您仍然希望使用一个值 >= 0 的应用。

这就是我今天学到的:-)

【讨论】:

  • 是的,我想我看到了一个类似的答案,并最近在不同的应用程序中尝试过
【解决方案3】:

解决方案是在主要活动之上调用一个透明活动。这个透明的activity在tabhost前面,会有正常的生命周期功能。

这个透明的活动调用图库意图 onCreate(),它在 onActivityResult 中正常返回所有内容,您将能够像正常一样将返回的信息传递回应用程序的其余部分。 finish() 位于 onActivityResult 方法中,因此用户甚至不会注意到调用了透明活动。

从 cmets 复制的更新:

Activity A 通过正常 Intent 调用 Activity B。 Activity 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 

当 Activity C 完成时,它会调用 Activity B 的 onActivityResult

【讨论】:

  • 这绝对应该被视为黑客攻击。
  • 同意@Falmarri 认为这很“hacky”。但是,很高兴听到您想出了一种方法来让它发挥作用
  • 这个黑客的代码示例可能吗?真的很想知道这是如何实现的!
  • Activity A 通过正常 Intent 调用 Activity B。 Activity 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 并且当 Activity C 完成时它调用 Activity B 的 onActivityResult
【解决方案4】:

您只需从清单文件中删除android:noHistory="true"

【讨论】:

    【解决方案5】:

    使用结果代码的常量值:

    Activity.RESULT_OK 和 Activity.RESULT_CANCELED

    您会看到 cancelled 的值实际上是 0。因此,在您的代码中,您正在检查活动是否被取消。

    把你的代码改成

    if (resultCode == Activity.RESULT_OK) {
    ...
    }
    

    另外将您的 Intent 操作更改为:

    intent.setAction(Intent.ACTION_PICK);
    

    如果你这样做,你可以调用

        Intent intent = new Intent(Intent.ACTION_PICK);
        intent.setType("image/*");
        startActivityForResult(intent, 0); 
    

    而不是创建选择器。它会自动选择与该意图和 mimetype 关联的活动并将它们显示给您

    【讨论】:

    • 我将上面的代码放在了一个测试活动中,并在我的手机上试用了它,它运行良好。我不确定是什么阻止了 onActivityResult(..) 被调用。您确定在调用 startActivityForResult(..) 的同一活动中有 onActivityResult 吗?
    【解决方案6】:

    onActivityResult 的调用方式取决于 Activity 的 launchMode(在清单中)。我不确定这是否会成为问题。

    【讨论】:

      【解决方案7】:

      你的 onActivityRestult 上方有 @Override 吗?

      (查看执行此操作的旧代码,因此不确定为什么需要它)调用 super.onactivityresult(requestcode, resultscode, data) 作为方法中的第一个调用

      我的意图也没有其他的东西 startActivityForResult(意图.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);
          }
      
      }
      

      【讨论】:

      • 我的活动中有覆盖,我会尝试您的其他建议
      • 也试试 Dymmeh 下面的建议?
      • 关于意图,我正在打开内置库,这会调用我的应用程序之外的 android 应用程序。如果 source.class、destination.class 在我的应用程序之外,我不能这样做。无论如何,我没有运气。我的活动仍然没有被调用。使用 Dymmeh 的结果代码和您的 super 建议
      • 查看我关于 Intent 操作的更新答案。我“认为”这就是你所需要的。
      • 不确定您所说的“我的应用程序之外的 android 应用程序”是什么意思,听起来您尝试做的项目与我过去做过的项目非常相似。生病用一些代码编辑我的答案,看看是否有帮助。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-08
      • 1970-01-01
      • 2019-12-05
      • 2015-01-15
      相关资源
      最近更新 更多