`
lufengdie
  • 浏览: 247831 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

onActivityResult传值的使用

阅读更多
有时候在群里加入的新人总会喜欢问一些过去的问题  有时候不想回答 是因为回答的次数多了

不回答又打击人的积极性  谁让自己接触的早呢  为了省劲还是把简单的东西作为指导篇吧



多个activity之间的传值 其实就是onActivityResult,然后别忘了还有一个action的问题 就是在主xml中添加自己的action以便于识别,最后次activity别忘了finish()。


public class Wizard extends Activity {   
  
    private TextView step1result, step2result, step3result;   
  
    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;   
  
    @Override  
    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);       
                break;   
            case STEP2:   
                this.step2result.setText(data.getStringExtra("STEP2RESULT"));   
                startActivityForResult(new Intent(Wizard.INTENT_STEP3), STEP3);       
                break;   
            case STEP3:   
                this.step3result.setText(data.getStringExtra("STEP3RESULT"));   
                break;   
        }   
    }   
}  




public class Step1 extends Activity {

    @Override
    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);
                finish();
            }
        });
    }
}



后面的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="http://schemas.android.com/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="http://schemas.android.com/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 Intent 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.sf.org.cn/Android/lumen/20977.html



本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/ghd2000/archive/2010/07/06/5716894.aspx











分享到:
评论

相关推荐

    Android中onActivityResult的用法

    这时,我们就需要使用 onActivityResult 来处理这些返回的数据。 三、如何使用 onActivityResult? ------------------------- 使用 onActivityResult 需要遵循以下步骤: 1. 启动子活动时,需要使用 ...

    android 传值回调

    在页面传值中,回调可能涉及到启动Activity的结果处理,如使用startActivityForResult()启动Activity并重写onActivityResult()方法来接收返回的数据。 总结来说,Android页面间的传值方式多样,开发者可以根据具体...

    使用Delegate在两个ViewController间传值

    在不同视图控制器(ViewController)之间传递数据,我们可以采用多种方法,其中一种常见且灵活的方式就是使用委托(Delegate)协议。本篇将详细介绍如何在两个ViewController之间利用委托协议进行值传递,以及它与...

    startActivityForResult+onActivityResult+setResult

    3个方法的介绍和使用 startActivityForResult(Intent intent, int requestCode ) onActivityResult(int requestCode ,int resultCode, Intent data) setResult(int resultCode,intent intent)

    使用intent传值和回传值

    - 在使用Intent传递数据时,确保在目标Activity中正确地获取数据,使用getExtra()系列方法,如getStringExtra()、getIntExtra()等。 - 请求码(requestCode)是自定义的整型值,用于区分不同来源的返回结果。避免与...

    onActivityResult demo

    在Android应用开发中,`...理解并熟练掌握这两个方法的使用,对于构建功能丰富的Android应用至关重要。通过实践和研究"onActivityResult demo",开发者可以深入理解这一过程,提升自己的Android开发技能。

    Activity间的传值

    总结,Activity间的传值是Android开发中的基本技能,理解并熟练掌握Intent、Bundle、startActivityForResult()等方法,以及何时使用静态变量、全局对象和事件总线,能够帮助开发者构建更高效、可维护的应用程序。

    Android Activity间传值

    当我们从一个Activity返回到另一个Activity时,如果希望回显之前的数据,可以使用startActivityForResult()方法启动新的Activity,并在返回时覆盖onActivityResult()方法。在SecondActivity中,通过setResult()设置...

    Intent跳转传值

    源Activity会在onActivityResult()回调中接收到结果。 总的来说,Intent跳转传值是Android开发中的基础操作,熟练掌握各种传值方式有助于构建更复杂的交互逻辑。在实际项目中,根据数据类型和需求选择合适的方法,...

    Kotlin 实现页面互相跳转和互相传值

    本教程将详细讲解如何在Kotlin环境下实现Android应用中的页面互相跳转以及互相传值。 一、启动新Activity 在Android中,Activity是应用程序的基本组件,用于展示用户界面。要从一个Activity跳转到另一个Activity,...

    android传值总结

    本篇文章将全面总结Android中的传值操作,包括父类到子类、子类到父类的传递方式。 首先,我们来看如何在多个Activity之间进行数据传递。通常,我们使用Intent作为数据的载体。Intent不仅仅用于启动一个新的...

    android页面传值

    标题"android页面传值"和描述提到了三种常见的页面间传值方式,我们将深入探讨这些方法。 1. **从A跳转到B,不带数据**: 在Android中,我们可以使用`Intent`对象来启动一个新的Activity(B)。当不需要传递数据时...

    界面跳转传值demo

    如果需要从目标Activity获取返回值,可以使用`startActivityForResult()`方法启动Activity,并在目标Activity中调用`setResult()`设置结果,然后在原始Activity的`onActivityResult()`方法中接收结果。 总结,`...

    android开发中的传值方式

    本文主要探讨两种常见的传值方式:从一个页面(Activity)跳转到另一个页面时传递值,以及从第二个页面返回时将值带回给第一个页面。 首先,我们来看第一种传值方式:从当前页面(Activity A)跳转到新的页面...

    Android中Activity之间如何通信以及传值

    以及Activity之间的通过Intent传值,startActivityForResult(intent, REQUSET)以及onActivityResult(int requestCode, int resultCode, Intent data)基本使用

    android 跳转与传值

    当使用startActivityForResult()启动Activity并期望得到结果时,需要重写onActivityResult()方法来接收返回的数据: ```java @Override protected void onActivityResult(int requestCode, int resultCode, ...

    Kotlin实现页面互相跳转和互相传值源代码

    最后,为了确保良好的用户体验,我们还需要在接收Activity的`onActivityResult()`方法中处理返回的结果,这在启动Activity进行一些操作并期待结果时非常有用。 总结,Kotlin在Android中的页面跳转和数据传递提供了...

    Activity间传值

    首先在Activity3中创建Intent,将数据放入Intent或Bundle,然后使用startActivityForResult()启动Activity1,并在Activity1中重写onActivityResult()方法来接收数据。这种方式确保了数据的有序传递。

    android两个activity相互传值

    2. **使用结果(startActivityForResult())**:这是更直接的方式,`ActivityA`启动`ActivityB`时,使用`startActivityForResult()`方法,`ActivityB`在完成操作后调用`setResult()`设置结果,然后使用`finish()`...

Global site tag (gtag.js) - Google Analytics