zoukankan      html  css  js  c++  java
  • Android学习笔记_16_添加多个Activity、参数传递、请求码和结果码使用

    一、添加新的Activity步骤:

      第一步:新建一个继承Activity的类,如:NewActivity

    public class NewActivity extends Activity {
        @Override 
      protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);    //这里可以使用setContentView(R.layout.xxx)显示某个视图....     }   ... }

      第二步:需要在功能清单AndroidManifest.xml文件中添加进上面Activity配置代码:

    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.example.action"
          android:versionCode="1"
          android:versionName="1.0">
    
        <application android:icon="@drawable/icon" android:label="@string/app_name">
            .....
        <activity android:name=".NewActivity" android:label="新activity的页面标题"/>
    
        </application>
        ...
    </manifest>

      android:name属性值的前面加了一个点表示NewActivity是当前包com.example.action下的类,如果类在应用的当前包下,可以省略点符号,如果类在应用的子包下必须加点,如:NewActivity类在com.example.action.user包下可以这样写:<activity android:name=“.user.NewActivity“ />。如果在其他包,需要些全类名。

    二、打开新的Activity:

      打开Activity可以通过Intent,它分为显式意图和隐式意图,下面通过显式意图打开Activity。其中参数传递主要通过Bundle类。

    public class MainActivity extends Activity {
      @Override protected void onCreate(Bundle savedInstanceState) {
        .......
         button.setOnClickListener(new View.OnClickListener(){//点击该按钮会打开一个新的Activity
                  public void onClick(View v) {
                     Intent intent = new Intent(MainActivity.this, NewActivity.class)
              Bundle bundle = new Bundle();//该类用作携带数据
              bundle.putString("name", "kiki");
              bundle.putInt("age", 25);
              intent.putExtras(bundle);//附带上额外的数据
              startActivity(intent);
        }}); }
    }
    // 在新的Activity中接收前面Activity传递过来的参数:
    public class NewActivity extends Activity {
                @Override protected void onCreate(Bundle savedInstanceState) {
                 //........    
                 Bundle bundle = this.getIntent().getExtras();
                 String name = bundle.getString("name");            
             int age = bundle.getInt("age"); } }

    三、Bundle类介绍:

      Bundle类用作携带数据,它类似于Map,用于存放key-value名值对形式的值。相对于Map,它提供了各种常用类型的putXxx()/getXxx()方法,如:putString()/getString()和putInt()/getInt(),putXxx()用于往Bundle对象放入数据,getXxx()方法用于从Bundle对象里获取数据。Bundle的内部实际上是使用了HashMap<String, Object>类型的变量来存放putXxx()方法放入的值:

    public final class Bundle implements Parcelable, Cloneable {
      Map<String, Object> mMap;
     public Bundle() {
           mMap = new HashMap<String, Object>();
     }
     public void putString(String key, String value) {
         mMap.put(key, value);
     }
    public String getString(String key) {
           Object o = mMap.get(key);
            return (String) o;
            ........//类型转换失败后会返回null,这里省略了类型转换失败后的处理代码
    }}

      在调用Bundle对象的getXxx()方法时,方法内部会从该变量中获取数据,然后对数据进行类型转换,转换成什么类型由方法的Xxx决定,getXxx()方法会把转换后的值返回。
    四、Intent附带数据的两种方法:

    第一种写法,用于批量添加数据到Intent:
    Intent intent = new Intent();
    Bundle bundle = new Bundle();//该类用作携带数据
    bundle.putString("name", "kiki");
    intent.putExtras(bundle);//为意图追加额外的数据,意图原来已经具有的数据不会丢失,但key同名的数据会被替换
    
    第二种写法:这种写法的作用等价于上面的写法,只不过这种写法是把数据一个个地添加进Intent,这种写法使用起来比较方便,而且只需要编写少量的代码。 Intent intent
    = new Intent(); intent.putExtra("name", "kiki"); Intent提供了各种常用类型重载后的putExtra()方法,如: putExtra(String name, String value)、 putExtra(String name, long value),
    在putExtra()方法内部会判断当前Intent对象内部是否已经存在一个Bundle对象,如果不存在就会新建Bundle对象,以后调用putExtra()方法传入的值都会存放于该Bundle对象,
    下面是Intent的putExtra(String name, String value)方法代码片断:
    public class Intent implements Parcelable { private Bundle mExtras; public Intent putExtra(String name, String value) { if (mExtras == null) { mExtras = new Bundle(); } mExtras.putString(name, value); return this; }

     五、得到新打开Activity 关闭后返回的数据:

      如果你想在Activity中得到新打开Activity 关闭后返回的数据,你需要使用系统提供的startActivityForResult(Intent intent, int requestCode)方法打开新的Activity,新的Activity 关闭后会向前面的Activity 传回数据,为了得到传回的数据,你必须在前面的Activity中重写onActivityResult(int requestCode, int resultCode, Intent data)方法。当新Activity关闭后,新Activity返回的数据通过Intent进行传递,android平台会调用前面Activity 的onActivityResult()方法,把存放了返回数据的Intent作为第三个输入参数传入,在onActivityResult()方法中使用第三个输入参数可以取出新Activity返回的数据。

    public class MainActivity extends Activity {
       @Override 
      protected void onCreate(Bundle savedInstanceState) { .......   Button button =(Button) this.findViewById(R.id.button);   button.setOnClickListener(new View.OnClickListener(){//点击该按钮会打开一个新的Activity     public void onClick(View v) {       //第二个参数为请求码,可以根据业务需求自己编号         startActivityForResult (new Intent(MainActivity.this, NewActivity.class), 1); }}); } //第一个参数为请求码,即调用startActivityForResult()传递过去的值 //第二个参数为结果码,结果码用于标识返回数据来自哪个新Activity @Override
      protected void onActivityResult(int requestCode, int resultCode, Intent data) {   String result = data.getExtras().getString(“result”));//得到新Activity 关闭后返回的数据 } }

      在NewActivity类里面可以接收MainActivity发送的参数,并返回相应信息。

    public class NewActivity extends Activity {
        @Override 
      protected void onCreate(Bundle savedInstanceState) { ...... button.setOnClickListener(new View.OnClickListener(){     public void onClick(View v) {     Intent intent = new Intent();//数据是使用Intent返回      intent.putExtra("result", "return code");//把返回数据存入Intent    NewActivity.this.setResult(RESULT_OK, intent);//设置返回数据    NewActivity.this.finish();//关闭Activity }}); } }
    setResult()方法的第一个参数值可以根据业务需要自己定义,上面代码中使用到的RESULT_OK是系统Activity类定义的一个常量,值为-1,代码片断如下:
    public class android.app.Activity extends ......{
      public static final int RESULT_CANCELED = 0;
      public static final int RESULT_OK = -1;
      public static final int RESULT_FIRST_USER = 1;
    }

    六、请求码的作用:
      使用startActivityForResult(Intent intent, int requestCode)方法打开新的Activity,我们需要为startActivityForResult()方法传入一个请求码(第二个参数)。请求码的值是根据业务需要由自已设定,用于标识请求来源。例如:一个Activity有两个按钮,点击这两个按钮都会打开同一个Activity,不管是那个按钮打开新Activity,当这个新Activity关闭后,系统都会调用前面Activity的onActivityResult(int requestCode, int resultCode, Intent data)方法。在onActivityResult()方法如果需要知道新Activity是由那个按钮打开的,并且要做出相应的业务处理。

    @Override  
    public void onCreate(Bundle savedInstanceState) {
            ....
            button1.setOnClickListener(new View.OnClickListener(){
              public void onClick(View v) {
                   startActivityForResult (new Intent(MainActivity.this, NewActivity.class), 1);
           }});
            button2.setOnClickListener(new View.OnClickListener(){
              public void onClick(View v) {
                   startActivityForResult (new Intent(MainActivity.this, NewActivity.class), 2);
           }}); 
           @Override 
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
                   switch(requestCode){
                       case 1:
                           //来自按钮1的请求,作相应业务处理
                         case 2:
                          //来自按钮2的请求,作相应业务处理
                    }
              }
    }

    七、结果码的作用:

      在一个Activity中,可能会使用startActivityForResult()方法打开多个不同的Activity处理不同的业务,当这些新Activity关闭后,系统都会调用前面Activity的onActivityResult(int requestCode, int resultCode, Intent data)方法。为了知道返回的数据来自于哪个新Activity,在onActivityResult()方法中可以这样做(ResultActivity和NewActivity为要打开的新Activity)。

    public class ResultActivity extends Activity {
           .....
           ResultActivity.this.setResult(1, intent);
           ResultActivity.this.finish();
    }
    public class NewActivity extends Activity {
           ......
            NewActivity.this.setResult(2, intent);
            NewActivity.this.finish();
    }
    public class MainActivity extends Activity { // 在该Activity会打开ResultActivity和NewActivity
           @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) {
                   switch(resultCode){
                       case 1:
                           // ResultActivity的返回数据
                          case 2:
                           // NewActivity的返回数据
                    }
              }
    }
  • 相关阅读:
    ArrayList用法
    MessageBox
    将文本文件导入Sql数据库
    在桌面和菜单中添加快捷方式
    泡沫排序
    Making use of localized variables in javascript.
    Remove double empty lines in Visual Studio 2012
    Using Operations Manager Connectors
    Clear SharePoint Designer cache
    Programmatically set navigation settings in SharePoint 2013
  • 原文地址:https://www.cnblogs.com/lbangel/p/3452864.html
Copyright © 2011-2022 走看看