【问题标题】:starting activity in onCreate and getting an result在 onCreate 中启动活动并获得结果
【发布时间】:2014-08-07 16:33:34
【问题描述】:

我有一个应用程序在初始启动时会打开一个配置活动,并且该配置活动会打开一个列表活动(onCreate 中的 startActivityForResult)。在列表活动中,用户可以选择一个值,该值会关闭列表并将该值发送到配置活动(setResult、finish、onActivityResult)。

当我在模拟器中尝试时效果很好,几乎所有尝试过的人都可以使用。

但是,现在有人发送了一封无法在他的设备(Galaxy)上运行的邮件:他可以选择列表中的某些内容并将其关闭,但配置活动再次将其打开(好像它没有收到选定的结果)。会发生什么?我需要让用户弄清楚什么?

public class AccountInfo extends VideLibriBaseActivity /* extends SherlockActivity */ {
   void openList(){ //called in onCreate and on cancel
        findViewById(R.id.libraryTextView).postDelayed(new Runnable() {
            @Override
            public void run() {
                Intent intent = new Intent(AccountInfo.this, LibraryList.class);
                //...
                startActivityForResult(intent, REQUEST_LIBRARY_FOR_ACCOUNT_CREATION);
            }
        }, 200); //did not work without delay on some devices
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == REQUEST_LIBRARY_FOR_ACCOUNT_CREATION) {
            if (resultCode == LibraryList.RESULT_OK) {
                libId = data.getStringExtra("libId");
                libName = data.getStringExtra("libName");
                lib.setText(libName);
                //...
            } else if (libId.equals(""))
                if (mode == MODE_ACCOUNT_CREATION_INITIAL && (VideLibriApp.accounts.length == 0))
                    openList();
                else
                    finish();
        }
    }        
}

public class LibraryList extends VideLibriBaseActivity /* extends SherlockActivity */  {
  //...
  lv.setOnChildClickListener(new ExpandableListView.OnChildClickListener() {
        @Override
        public boolean onChildClick(ExpandableListView expandableListView, View view, int i, int i2, long l) {
            Intent result = new Intent();
            result.putExtra("libName", localLibs.get(i).get(i2).get("NAME"));
            result.putExtra("libId", localLibs.get(i).get(i2).get("ID"));
            //...
            setResult(RESULT_OK, result);
            LibraryList.this.finish();
            return true;
        }
    });
    //...
}

launchMode 是两个活动的 singleTop

【问题讨论】:

  • 您正在接收 libName,但如果不是这种情况,则与 libId 核对,您能否显示有关如何调用 openList() 以及 UpdateLibrary() 是什么的代码
  • @RajnishMishra:似乎我简化了太多。 updateLibrary 是 openList,它接收 libId 和 libName。
  • 你能确保 localLibs.get(i).get(i2) 永远不会给出空字符串
  • @RajnishMishra:它不应该为空(它是加载其他值的文件的名称)。但即使它是空的,也没有关系,因为它只测试 else 分支中的空,它不应该采用

标签: android android-activity


【解决方案1】:

在某些设备上,由于内存不足或其他原因,AccountInfo 可能会在 LibraryList 完成时调用 onCreate,您在从 onActivityResult 获取结果后仅在两个地方调用打开列表,而其他来自 OnCreate,因为您是确保 onActivityResult 总是会得到结果

这里有一些你可以尝试的检查

  • 检查您是否正确使用startActivityForResult(),不要使用startActivity()
  • 如果你在重写的onBackPressed 方法中做某事,super.onBackPressed(); 必须位于方法的最后,而不是第一行。 (我的案子要花 5 个小时)
  • 删除清单或等效参数中的 android:launchMode="singleInstance" 以创建意图。
  • 删除被调用者活动清单中的noHistory="true"
  • 检查setResult() 是否遗漏。
  • 调用finish() 来关闭活动。使用finishActivity() 关闭被调用者活动。
  • 使用requestCode 大于零。负值不起作用。

【讨论】:

  • 3) 什么是等价的? 6)finishActivity() 不是应该完成其他活动而不是当前活动吗? 7) 有最大值吗?
猜你喜欢
  • 1970-01-01
  • 2014-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-26
  • 1970-01-01
  • 1970-01-01
  • 2013-02-18
相关资源
最近更新 更多