如何解决部队 onActivityResult com组件调用错误后的关闭错误

Android开发(61)
问题对人有帮助,内容完整,我也想知道答案
问题没有实际价值,缺少关键内容,没有改进余地
使用add的方法生成的Fragment,返回时会执行onActivityResult方法; 但当使用replace的方法生成Fragment时,返回时不会执行onActivityResult访求。而是在fragment当前的Activity中执行了该方法,什么情况?
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
Case 2:当我们从一个Activity启动了一个Fragment,然后在这个Fragment中又去实例化了一些子Fragment,在子Fragment中去有返回的启动了另外一个Activity,即通过startActivityForResult方式去启动,这时候造成的现象会是,子Fragment接收不到OnActivityResult,如果在子Fragment中是以getActivity.startActivityForResult方式启动,那么只有Activity会接收到OnActivityResult,如果是以getParentFragment.startActivityForResult方式启动,那么只有父Fragment能接收(此时Activity也能接收),但无论如何子Fragment接收不到OnActivityResult。
这是一个非常奇怪的现象,按理说,应该是让子Fragment接收到OnActivityResult才对,究竟是什么造成的呢?这是由于某位写代码的员工抱怨没发奖金,稍稍偷懒了,少写了一部分代码,没有考虑到Fragment再去嵌套Fragment的情况。
我们来看看FragmentActivity中的代码:
protected void onActivityResult(int requestCode, int resultCode, Intent data)
this.mFragments.noteStateNotSaved();
int index = requestCode && 16;
if (index != 0) {
if ((this.mFragments.mActive == null) || (index & 0) || (index &= this.mFragments.mActive.size())) {
Log.w(&FragmentActivity&, &Activity result fragment index out of range: 0x& + Integer.toHexString(requestCode));
Fragment frag = (Fragment)this.mFragments.mActive.get(index);
if (frag == null) {
Log.w(&FragmentActivity&, &Activity result no fragment exists for index: 0x& + Integer.toHexString(requestCode));
frag.onActivityResult(requestCode & 0xFFFF, resultCode, data);
super.onActivityResult(requestCode, resultCode, data);
很显然,设计者把Fragment的下标+1左移16位来标记这个request是不是Fragment的,拿到result再解码出下标,直接取对应的Fragment,这样并没有去考虑对Fragment嵌套Fragment做一个Map映射,所以出现了这种BUG。
但是如果我们需要在OnActivityResult的时候处理一些事情的话,我们可以通过在子Fragment中以getParentFragment.startActivityForResult的方式来启动,然后在父Fragment中去接收数据,我们需要在子Fragment中提供一个方法,如:getResultData(Object obj),通过父Fragment中的子Fragment实例去调用这个方法,把相应的数据传过去,然后去更新子Fragment。
以上是在使用Fragment去嵌套Fragment的时候可能会遇到的BUG,了解了BUG存在的原因之后,就可以完美的解决问题。
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:39349次
排名:千里之外
转载:81篇
(3)(1)(3)(4)(1)(7)(9)(2)(8)(7)(14)(23)(4)(6)
(window.slotbydup = window.slotbydup || []).push({
id: '4740887',
container: s,
size: '250,250',
display: 'inlay-fix'在 SegmentFault,解决技术问题
每个月,我们帮助 1000 万的开发者解决各种各样的技术问题。并助力他们在技术能力、职业生涯、影响力上获得提升。
一线的工程师、著名开源项目的作者们,都在这里:
获取验证码
已有账号?
问题对人有帮助,内容完整,我也想知道答案
问题没有实际价值,缺少关键内容,没有改进余地
我知道可用利用onActivityResult把照片返回到原来的Activity,但是怎么直接传递到新的Activity呢?就像微信发图片朋友圈那样。
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
这应该是不可能的,除非你有系统相机的源码,修改源码,然后在系统相机内直接启动你想启动的activity。可是为什么想要这样直接传递到新的activity呢?这多么费力不讨好啊。
不论是通过显示的还是隐式的intent,启动第三方的activity,应该总要返回到自己的activity,在onActivityResult()中处理返回的数据和结果。
所以我猜,你想实现的那种“直接”的效果,应该是在onActivityResult中拿到图片后,再次启动了另一个新的activity。
我做了一个测试:在A中启动B;B返回后,在A的onActivityResult中启动C。视觉上,B直接跳到了C。如下gif图:
分享到微博?
关闭理由:
删除理由:
忽略理由:
推广(招聘、广告、SEO 等)方面的内容
与已有问题重复(请编辑该提问指向已有相同问题)
答非所问,不符合答题要求
宜作评论而非答案
带有人身攻击、辱骂、仇恨等违反条款的内容
无法获得确切结果的问题
非开发直接相关的问题
非技术提问的讨论型问题
其他原因(请补充说明)
我要该,理由是:有时候在群里加入的新人总会喜欢问一些过去的问题& 有时候不想回答 是因为回答的次数多了
不回答又打击人的积极性& 谁让自己接触的早呢& 为了省劲还是把简单的东西作为指导篇吧
多个activity之间的传值 其实就是onActivityResult,然后别忘了还有一个action的问题 就是在主xml中添加自己的action以便于识别,最后次activity别忘了finish()。
public class Wizard extends Activity {
private TextView step1result, step2result, step3
public static final String INTENT_STEP1 = "com.novoda.STEP1";
public static final String INTENT_STEP2 = "com.novoda.STEP2";
public static final String INTENT_STEP3 = "com.novoda.STEP3";
private static final int STEP1 = 1;
private static final int STEP2 = 2;
private static final int STEP3 = 3;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.wizard);
this.step1result = (TextView)findViewById(R.id.step1result);
this.step2result = (TextView)findViewById(R.id.step2result);
this.step3result = (TextView)findViewById(R.id.step3result);
startActivityForResult(new Intent(Wizard.INTENT_STEP1), STEP1);
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode) {
case STEP1:
this.step1result.setText(data.getStringExtra("STEP1RESULT"));
startActivityForResult(new Intent(Wizard.INTENT_STEP2), STEP2);
case STEP2:
this.step2result.setText(data.getStringExtra("STEP2RESULT"));
startActivityForResult(new Intent(Wizard.INTENT_STEP3), STEP3);
case STEP3:
this.step3result.setText(data.getStringExtra("STEP3RESULT"));
public class Step1 extends Activity {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.step1);
Button nextStep = (Button)findViewById(R.id.goto2);
nextStep.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
Intent it = new Intent();
it.putExtra("STEP1RESULT", ((EditText)findViewById(R.id.step1value)).getText()
.toString());
setResult(Activity.RESULT_OK, it);
后面的step2 step3都是一样的了
然后还有主xml
&application android:icon="@drawable/icon" android:label="@string/app_name"&
&activity android:name=".Wizard" android:label="@string/app_name"&
&intent-filter&
&action android:name="android.intent.action.MAIN" /&
&category android:name="android.intent.category.LAUNCHER" /&
&/intent-filter&
&/activity&
&activity android:name=".Step1" android:label="Step1"&
&intent-filter&
&action android:name="com.novoda.STEP1" /&
&category android:name="android.intent.category.DEFAULT" /&
&/intent-filter&
&/activity&
&activity android:name=".Step2" android:label="Step2"&
&intent-filter&
&action android:name="com.novoda.STEP2" /&
&category android:name="android.intent.category.DEFAULT" /&
&/intent-filter&
&/activity&
&activity android:name=".Step3" android:label="Step3"&
&intent-filter&
&action android:name="com.novoda.STEP3" /&
&category android:name="android.intent.category.DEFAULT" /&
&/intent-filter&
&/activity&
&/application&
&uses-sdk android:minSdkVersion="7" /&
&/manifest&
======================================================================
根据文档的解释,Activity是Android开发中非常重要的一个基础类。我把它想像成J2ME中的Display类,或者是Win32平台上的Form类,也许不准确,但是它的重要性我觉得应该是一样的(当然,如果我们写的是一个没有界面的应用,例如后台运行的服务之类的,可以不用Display的)。
1.&&&& 在一个Activity中使用多个View
如果把Activity看作MVC中的Control?它负责管理UI和接受事件(包括用户的输入),虽然说一个Activity通常对应一个屏幕,但事实上,我们是可以只用一个Activity管理多个不同的View来实现简单的逻辑。
首先,我们增加一个新的资源描述layout/second.xml。
&?xml version="1.0" encoding="utf-8"?&
&LinearLayout xmlns:android="/apk/res/android"
&&& android:orientation="vertical"
&&& android:layout_width="fill_parent"
&&& android:layout_height="fill_parent"
&&& &
&TextView id="@+id/txt"&
&&& android:layout_width="fill_parent"
&&& android:layout_height="wrap_content"
&&& android:text="Hello 中国"
&&& /&
&Button id="@+id/go2"
&&&&&&& android:layout_width="wrap_content" android:layout_height="wrap_content"
&&&&&&& android:text="back"&
&&&&&&& &requestFocus /&
&&& &/Button&&&
&/LinearLayout&
除了一个“Hello中国”以外,增加一个按钮可以返回前一个界面。然后,在代码中我们要为helloTwo增加两个方法,setViewOneCommand和setViewTwoCommand,分别处理一下在不同界面时,从资源里加载组件并为组件绑定一个事件处理器。
& public void setViewOneCommand()
&&& ...{
&&&&&&& Button btn = (Button)findViewById(R.id.go);
&&&&&&& btn.setOnClickListener(new View.OnClickListener()
&&&&&&& ...{
&&&&&&&&&&& public void onClick(View v)
&&&&&&&&&&& ...{
&&&&&&&&&&&&&&& helloTwo.this.setContentView(R.layout.second);
&&&&&&&&&&&&&&& helloTwo.this.setViewTwoCommand();&&&&&&&&&&&&&&&
&&&&&&&&&&& }
&&&&&&& });&&&&&&
&&&&&&& Button btnExit=(Button)findViewById(R.id.exit);
&&&&&&& btnExit.setOnClickListener(new View.OnClickListener()...{
&&&&&&&&&&& public void onClick(View v)...{
&&&&&&&&&&&&&&& helloTwo.this.finish();
&&&&&&&&&&& }
&&&&&&& });&&&
&&& }
&&& public void setViewTwoCommand()
&&& ...{
&&&&&&& Button btnBack=(Button)findViewById(R.id.go2);
&&&&&&& btnBack.setOnClickListener(new View.OnClickListener()...{
&&&&&&&&&&& public void onClick(View v)...{
&&&&&&&&&&&&&&& helloTwo.this.setContentView(R.layout.main);
&&&&&&&&&&&&&&& helloTwo.this.setViewOneCommand();
&&&&&&&&&&& }&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&& });
&&& }
最后,我们需要在onCreate的时候,也就是启动后的main界面上设置一下按钮事件处理器。新的onCreate方法如下:
&&& public void onCreate(Bundle icicle) ...{
&&&&&&& super.onCreate(icicle);
&&&&&&& setTheme(android.R.style.Theme_Dark);
&&&&&&& setContentView(R.layout.main);&&&
&&&&&&& setViewOneCommand();&&&&&&&
编译,运行,OK。
2.&&&& 还是回到正道上,多个Activity之间的跳转
Android中提供一个叫Intent的类来实现屏幕之间的跳转,按文档的说法,似乎他们也建议采用这种方法,Intent的用法比较复杂,现在我先看看它最简单的用法。
先在应用中增加两个Activity,这需要修改AndroidManifest.xml文件了,如下:
&?xml version="1.0" encoding="utf-8"?&
&manifest xmlns:android="/apk/res/android"
&&& package="cn.sharetop.android.hello.three"&
&&& &application android:icon="@drawable/icon"&
&&&&&&& &activity class=".HelloThree" android:label="@string/app_name"&
&&&&&&&&&&& &intent-filter&
&&&&&&&&&&&&&&& &action android:value="android.intent.action.MAIN" /&
&&&&&&&&&&&&&&& &category android:value="android.intent.category.LAUNCHER" /&
&&&&&&&&&&& &/intent-filter&
&&&&&&& &/activity&
&&&&&&& &activity class=".HelloThreeB" android:label="@string/app_name"&
&&&&&&& &/activity&
&&& &/application&
&/manifest&
很简单,就是加一个标签而已,新标签的class是.HelloThreeB,显示的应用标题与前一个Activity一样而已,然后第二步就是修改一个HelloThree类的实现,在onCreate方法中绑定按钮的事件处理器:
&&& public void onCreate(Bundle icicle) ...{
&&&&&&& super.onCreate(icicle);
&&&&&&& setTheme(android.R.style.Theme_Dark);
&&&&&&& setContentView(R.layout.main);
&&&&&&& setViewOneCommand();
&&& }
&&& public void setViewOneCommand()
&&& ...{
&&&&&&& Button btn = (Button)findViewById(R.id.go);
&&&&&&& btn.setOnClickListener(new View.OnClickListener()
&&&&&&& ...{
&&&&&&&&&&& public void onClick(View v)
&&&&&&&&&&& ...{
&&&&&&&&&&&&&&& Intent intent = new Intent();
&&&&&&&&&&&&&&& intent.setClass(HelloThree.this, HelloThreeB.class);
&&&&&&&&&&&&&&& startActivity(intent);
&&&&&&&&&&&&&&& finish();&&&&&&&&&&&
&&&&&&&&&&& }
&&&&&&& });&&&&&&
&&&&&&& Button btnExit=(Button)findViewById(R.id.exit);
&&&&&&& btnExit.setOnClickListener(new View.OnClickListener()...{
&&&&&&&&&&& public void onClick(View v)...{
&&&&&&&&&&&&&&& HelloThree.this.finish();
&&&&&&&&&&& }
&&&&&&& });&&&
这里的跳转功能用Intent来操作,它的最简单用法就是用函数setClass()设置跳转前后两个Activity类的实例,然后调用Activity自己的startActivity(intent)即可。最后一句finish()表示将当前Activity关掉(如果不关掉会如何?你可以自己试一下看效果,事实上有时我们是不需要关掉当前Activity的)。
然后,我们同样弄一个Activity类HelloThreeB,代码与前面的差不多,只是将setClass的两个参数反一下,这样就可以简单地实现在两个Activity界面中来回切换的功能了。
3.&&&& 如果我想在两个Activity之间进行数据交换,怎么办?
前例中的startActivity()只有一个参数,如果需要向新打开的Activity传递参数,我们得换一个函数了, Android提供了startSubActivity(Intent,int)这个函数来实现这个功能。
函数原型为: public void startSubActivity(Intent intent, int requestCode)
这里的requestCode用来标识某一个调用,一般由我们定义一个常量。
如何把参数传过去呢?Intent类在提供setClass()函数的同时也提供了一个setData()函数。
函数原型为:public Intent setData(ContentURI data)
参数类型是ContentURI,它的详细内容下回再分析,现在就把它当成一个String类型来用吧。
参数带到新的Activity后,同样用Activity.getIntent()函数可以得到当前过来的Intent对象,然后用getData()就取到参数了。
把参数带回来的方法是Activity.setResult(),它有几个形式,现在先看最简单的一个吧。
函数原型是:public final void setResult(int resultCode, String data)
resultCode是返回代码,同样用来标识一个返回类型,而data则是它要返回的参数。
在原来的Activity中的事件处理回调函数onActivityResult,会被系统调用,从它的参数里可以得到返回值。
函数原型为:protected void onActivityResult(int requestCode, int resultCode,String data, Bundle extras)
这里的requestCode就是前面启动新Activity时的带过去的requestCode,而resultCode则关联上了setResult中的resultCode,data是参数,extras也是一个很重要的东西,后面再研究一下它的作用。
下面,我们来看一下代码吧,先看看HelloThree中的代码:
&&& public void setViewOneCommand()
&&& ...{
&&&&&&& Button btn = (Button)findViewById(R.id.go);
&&&&&&& btn.setOnClickListener(new View.OnClickListener()
&&&&&&& ...{
&&&&&&&&&&& public void onClick(View v)
&&&&&&&&&&& ...{
&&&&&&&&&&&&&&& try
&&&&&&&&&&&&&&& ...{&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&& Intent intent = new Intent();
&&&&&&&&&&&&&&&&&&& intent.setClass(HelloThree.this, HelloThreeB.class);
&&&&&&&&&&&&&&&&&&& intent.setData(new ContentURI("One"));&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&& startSubActivity(intent,REQUEST_TYPE_A);
&&&&&&&&&&&&&&& }
&&&&&&&&&&&&&&& catch(Exception ex)...{}
&&&&&&&&&&& }
&&&&&&& });&&&&&&
&&&&&&& Button btnExit=(Button)findViewById(R.id.exit);
&&&&&&& btnExit.setOnClickListener(new View.OnClickListener()...{
&&&&&&&&&&& public void onClick(View v)...{
&&&&&&&&&&&&&&& HelloThree.this.finish();
&&&&&&&&&&& }
&&&&&&& });&&&
&&& protected void onActivityResult(int requestCode, int resultCode,
&&&&&&&&&&& String data, Bundle extras)
&&& ...{
&&&&&&& if (requestCode == REQUEST_TYPE_A) ...{
&&&&&&&&&&& if (resultCode == RESULT_OK) ...{
&&&&&&&&&&&&&&& Log.v(TAG,data);
&&&&&&&&&&&&&&& TextView txt = (TextView)findViewById(R.id.txt);
&&&&&&&&&&&&&&& txt.setText(data);&&&&&&&&&&&&&&&
&&&&&&&&&&& }
&&&&&&& }
&&& }
这里的REQUEST_TYPE_A是我们定义的一个常量。在onActivityResult中用它与RESULT_OK一起作为条件判断如何处理返回值,这里只是简单将TextView显示值换成传来的字串。
再来看看另一个HelloThreeB类的实现代码:
&&& private I
&&& protected void onCreate(Bundle icicle) ...{
&&&&&&& super.onCreate(icicle);
&&&&&&& setContentView(R.layout.second);&&&
&&&&&&& i = getIntent();
&&&&&&&
&&&&&&& android.util.Log.v(TAG,"onCreate");
&&&&&&& Button btn = (Button)findViewById(R.id.go);
&&&&&&& btn.setOnClickListener(new View.OnClickListener()...{
&&&&&&&&&&& public void onClick(View v)...{
&&&&&&&&&&&&&&& String result=HelloThreeB.this.i.getData().toString()+" And Two";
&&&&&&&&&&&&&&& HelloThreeB.this.setResult(RESULT_OK,result);
&&&&&&&&&&&&&&& finish();
&&&&&&&&&&& }&&&&&&&&&&&
&&&&&&& });
&&&&&&&
&&&&&&& TextView v = (TextView)findViewById(R.id.txt);
&&&&&&& v.setText("Param is "+i.getData().toString());
&&&&&&&
在按钮处理事件中,从Intent取出参数,处理一下再用setResult返回给前一个Activity即可。
编译运行即可。
来源:http://www./Android/lumen/20977.html
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/ghd2000/archive//5716894.aspx
下载次数: 27
浏览: 210402 次
来自: 西安
custom debug keystore/key must
丨悟空 写道如果只是提示安装失败而控制台和logcat都没有错 ...
如果只是提示安装失败而控制台和logcat都没有错误信息呢?
leehonpjp 写道老兄,第一种方法怎么弄?
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'

我要回帖

更多关于 类型错误调用需要函数 的文章

 

随机推荐