Activity

介绍

多个Activity之间交换数据

        当在一个 Activity 中启动另一个 Activity 时,经常需要传递一些数据。这时就可以通过 Intent来实现,因为 Intent 通常被称为是两个 Activity 之间的信使,通过将要传递的数据保存在 Intent 中,就可以将其传递到另一个 Activity 中了。在 Android 中,可以将要保存的数据存放在 Bundle 对象中,然后通过 Intent 提供的 putExtras() 方法将要携带的数据保存到 Intent 中。通过 Intent 传递数据的示意图如图 9.16 所示。

        

        Bundle是一个key-value(键-值)对的组合,用于保存要携带的数据包。这些数据可以是boolean、byte、int、long、float、double和String等基本类型或者对应的数组,也可以是对象或者对象数组。如果是对象或者对象数组时,必须实现Serializable或者Parcelable接口

Bundle的使用和解析

调用另一个Activity并返回结果

        在 Android 应用开发时,有时需要在一个 Activity 中调用另一个 Activity,当用户在第二个Activity 中选择完成后,程序将自动返回到第一个 Activity 中,第一个 Activity 能够获取并显示用户在第二个 Activity 中选择的结果。例如,用户在修改信息的时候可以对头像进行修改,在修改头像时首先需要调用选择头像的界面,效果如图 9.19 所示。在选择头像后会自动返回到修改信息界面,并显示用户选择的新头像,效果如图 9.20 所示。

        此功能也可以通过 Intent 和 Bundle 来实现。与在两个 Activity 之间交换数据不同的是,此处需要使用startActivityForResult()方法来启动另一个Activity。调用startActivityForResult()方法启动Activity后,关闭新启动的 Activity 时,可以将选择的结果返回到原 Activity 中。startActivityForResult() 方法的语法格式如下:

public void startActivityForResult (Intent intent, int requestCode)

        该方法将以指定的请求码启动 Activity,并且程序将会获取新启动的 Activity 返回的结果(通过重写 onActivityResult() 方法来获取)。requestCode 参数代表了启动 Activity 的请求码,该请求码的值由开发者根据业务自行设置,用于标识请求来源。 

生命周期

A活动B活动
onCreate
onStart(可见
onResume(获得焦点
跳转到B活动
onPause(失去焦点
onCreate
onStart
onResume
onStop(不可见
onSaveInstanceState
结束B活动
onPause
onRestart
onStart
onResume
onStop
onDestory

savedInstanceState,字面上是保存实例状态的,实际上也就是保存Activity的状态的,在上面实验中可以看出是在活动不可见时调用以下方法,将状态数据以key-value的形式放入到outState中。

@Override
protected void onSaveInstanceState( Bundle outState) {
    super.onSaveInstanceState(outState);
    Log.d(TAG,"A:onSaveInstanceState");
}

相关方法及配置属性

  • startActicity()开启一个新活动
  • finish()关闭活动
  • android:name:指定对应的 Activity 实现类。
  • android:label:为该 Activity 指定标签。
  • android:theme:设置要应用的主题。

1.如果该Activity类在<manifest>标记的package属性指定的包中,则android:name属性的属性值可以直接写类名,也可以是“.类名”的形式;

2.如果在package属性指定包的子包中,则属性值需要设置为“.子包序列.类名”或者是完整的类名(包括包路径)

例子

模拟保存淘宝收货地址

编写activity_tao_bao_edit布局文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="10dp"
    android:orientation="vertical"
    tools:context=".general.TaoBaoEditActivity">

    <EditText
        android:id="@+id/et_site1"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:textColor="@color/black"
        android:textSize="16sp"
        android:hint="输入所在地区"
        android:padding="10dp"
        android:background="@drawable/bg_username"
        android:drawablePadding="15dp"
        android:maxLines="1"
        android:layout_marginTop="50dp"/>
    <EditText
        android:id="@+id/et_site2"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:textColor="@color/black"
        android:textSize="16sp"
        android:hint="输入所在街道"
        android:padding="10dp"
        android:background="@drawable/bg_username"
        android:drawablePadding="15dp"
        android:maxLines="1"
        android:layout_marginTop="10dp"/>

    <EditText
        android:id="@+id/et_site3"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:textColor="@color/black"
        android:textSize="16sp"
        android:hint="输入详细地址"
        android:padding="10dp"
        android:background="@drawable/bg_username"
        android:drawablePadding="15dp"
        android:maxLines="1"
        android:layout_marginTop="10dp"/>

    <EditText
        android:id="@+id/et_name"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:textColor="@color/black"
        android:textSize="16sp"
        android:hint="输入用户姓名"
        android:padding="10dp"
        android:background="@drawable/bg_username"
        android:drawablePadding="15dp"
        android:maxLines="1"
        android:layout_marginTop="10dp"/>

    <EditText
        android:id="@+id/et_phone"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:textColor="@color/black"
        android:textSize="16sp"
        android:hint="输入手机号码"
        android:padding="10dp"
        android:background="@drawable/bg_username"
        android:drawablePadding="15dp"
        android:maxLines="1"
        android:layout_marginTop="10dp"/>

    <EditText
        android:id="@+id/et_email"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:textColor="@color/black"
        android:textSize="16sp"
        android:hint="输入用户邮箱"
        android:padding="10dp"
        android:background="@drawable/bg_username"
        android:drawablePadding="15dp"
        android:maxLines="1"
        android:layout_marginTop="10dp"/>

    <Button
        android:id="@+id/btn_save"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:text="保存"
        android:textSize="20sp"
        android:textColor="#FFFFFF"
        android:background="@drawable/bg_btn4"
        android:layout_marginTop="10dp"/>

</LinearLayout>

编写TaoBaoEditActivity

public class TaoBaoEditActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_tao_bao_edit);

        Button btn = (Button) findViewById(R.id.btn_save); //获取保存按钮
        btn.setOnClickListener(new View.OnClickListener() { //为按钮添加单击监听事件
            @Override
            public void onClick(View v) {
                //获取输入的所在地区
                String site1 = ((EditText) findViewById(R.id.et_site1)).getText().toString();
                //获取输入的所在街道
                String site2 = ((EditText) findViewById(R.id.et_site2)).getText().toString();
                //获取输入的详细地址
                String site3 = ((EditText) findViewById(R.id.et_site3)).getText().toString();
                //获取输入的用户信息
                String name = ((EditText) findViewById(R.id.et_name)).getText().toString();
                //获取输入的手机号码
                String phone = ((EditText) findViewById(R.id.et_phone)).getText().toString();
                //获取输入的邮箱
                String email= ((EditText) findViewById(R.id.et_email)).getText().toString();
                if (!"".equals(site1) && !"".equals(site2) && !"".equals(site3)&&
                        !"".equals(name) && !"".equals(phone) &&!"".equals(email) ) {
                    Intent intent = new Intent(TaoBaoEditActivity.this,
                            TaoBaoInfoActivity.class);

                    Bundle bundle = new Bundle();
                    bundle.putCharSequence("name", name); //保存姓名
                    bundle.putCharSequence("phone", phone); //保存手机号码
                    bundle.putCharSequence("email", email); //保存邮箱
                    bundle.putCharSequence("site1", site1); //保存所在地区信息
                    bundle.putCharSequence("site2", site2); //保存所在街道信息
                    bundle.putCharSequence("site3", site3); //保存详细地址信息
                    intent.putExtras(bundle); //将Bundle对象添加到Intent对象中
                    startActivity(intent);
                }else {
                    Toast.makeText(TaoBaoEditActivity.this,
                            "请将收货地址填写完整!",Toast.LENGTH_SHORT).show();
                }
            }
        });
    }
}

编写activity_tao_bao_info布局文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="10dp"
    android:orientation="vertical"
    tools:context=".general.TaoBaoInfoActivity">

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:padding="10dp">
        <TextView
            android:id="@+id/tv_name"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="收货人:"
            android:textColor="#000000"
            android:textSize="24sp"
            android:singleLine="true" />

        <TextView
            android:id="@+id/name"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_toRightOf="@+id/tv_name"
            android:text="无"
            android:textColor="#000000"
            android:textSize="24sp"
            android:singleLine="true"
            android:ellipsize="marquee"
            android:marqueeRepeatLimit="marquee_forever"
            android:focusable="true"
            android:focusableInTouchMode="true"
            android:clickable="true"/>
    </RelativeLayout>


    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:padding="10dp">
        <TextView
            android:id="@+id/tv_phone"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="电话号码:"
            android:textColor="#000000"
            android:textSize="24sp"
            android:singleLine="true" />

        <TextView
            android:id="@+id/phone"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_toRightOf="@+id/tv_phone"
            android:text="无"
            android:textColor="#000000"
            android:textSize="24sp"
            android:singleLine="true"
            android:ellipsize="marquee"
            android:marqueeRepeatLimit="marquee_forever"
            android:focusable="true"
            android:focusableInTouchMode="true"
            android:clickable="true"/>
    </RelativeLayout>

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:padding="10dp">
        <TextView
            android:id="@+id/tv_email"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="邮箱:"
            android:textColor="#000000"
            android:textSize="24sp"
            android:singleLine="true" />

        <TextView
            android:id="@+id/email"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_toRightOf="@+id/tv_email"
            android:text="无"
            android:textColor="#000000"
            android:textSize="24sp"
            android:singleLine="true"
            android:ellipsize="marquee"
            android:marqueeRepeatLimit="marquee_forever"
            android:focusable="true"
            android:focusableInTouchMode="true"
            android:clickable="true"/>
    </RelativeLayout>

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:padding="10dp">
        <TextView
            android:id="@+id/tv_site"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="地址:"
            android:textColor="#000000"
            android:textSize="24sp"
            android:singleLine="true" />

        <TextView
            android:id="@+id/site"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_toRightOf="@+id/tv_site"
            android:text="无"
            android:textColor="#000000"
            android:textSize="24sp"
            android:singleLine="true"
            android:ellipsize="marquee"
            android:marqueeRepeatLimit="marquee_forever"
            android:focusable="true"
            android:focusableInTouchMode="true"
            android:clickable="true"/>
    </RelativeLayout>

</LinearLayout>

编写TaoBaoInfoActivity

public class TaoBaoInfoActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_tao_bao_info);

        Intent intent = getIntent(); //获取Intent对象
        Bundle bundle = intent.getExtras(); //获取传递的Bundle信息

        TextView name = (TextView) findViewById(R.id.name);
        name.setText(bundle.getString("name"));

        TextView phone = (TextView) findViewById(R.id.phone);
        phone.setText(bundle.getString("phone"));

        TextView email = (TextView) findViewById(R.id.email);
        email.setText(bundle.getString("email"));

        TextView site = (TextView) findViewById(R.id.site);
        site.setText(bundle.getString("site1")
                + bundle.getString("site2") + bundle.get("site3"));

    }
}

效果

 

模拟选择头像功能

编写activity_head_info布局文件

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".general.HeadInfoActivity">

    <ImageView
        android:id="@+id/iv_Head"
        android:layout_width="200dp"
        android:layout_height="200dp"
        android:layout_centerInParent="true"
        android:src="@drawable/img01"
        android:scaleType="centerCrop" />

    <Button
        android:id="@+id/btn_HeadSelect"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/iv_Head"
        android:layout_centerHorizontal="true"
        android:text="选择头像"
        android:textSize="20sp"
        android:textColor="#FFFFFF"
        android:background="@drawable/bg_btn4"
        android:layout_marginTop="10dp"/>

</RelativeLayout>

编写HeadInfoActivity

public class HeadInfoActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_head_info);

        Button button= (Button) findViewById(R.id.btn_HeadSelect);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent=new Intent(HeadInfoActivity.this,
                        HeadSelectActivity.class);
                //requestCode:0x11
                startActivityForResult(intent, 0x11);
            }
        });

    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if(requestCode==0x11 && resultCode==0x11){ //判断是否为待处理的结果
            Bundle bundle=data.getExtras(); //获取传递的数据包
            int imageId=bundle.getInt("imageId"); //获取选择的头像ID
            //获取布局文件中添加的ImageView组件
            ImageView iv=(ImageView)findViewById(R.id.iv_Head);
            iv.setImageResource(imageId); //显示选择的头像
        }
    }
}

编写activity_head_select布局文件

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="10dp"
    tools:context=".general.HeadSelectActivity">

    <GridView
        android:id="@+id/gv_HeadSelect"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_marginTop="10dp"
        android:horizontalSpacing="3dp"
        android:verticalSpacing="3dp"
        android:numColumns="4">
    </GridView>
    
</RelativeLayout>

编写HeadSelectActivity

public class HeadSelectActivity extends AppCompatActivity {

    //定义并初始化保存头像id的数组
    public int[] imageId = new int[]{
            R.drawable.img01, R.drawable.img02,
            R.drawable.img03, R.drawable.img04,
            R.drawable.img05
    };
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_head_select);

        GridView gridview = (GridView) findViewById(R.id.gv_HeadSelect);
        gridview.setAdapter(adapter);
        gridview.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                Intent intent = getIntent();
                Bundle bundle = new Bundle();
                //显示选中的图片
                bundle.putInt("imageId", imageId[position]);
                intent.putExtras(bundle);
                //设置返回的resultCode:0x11,并返回调用该Activity的Activity
                setResult(0x11, intent);
                finish();
            }
        });
    }


    BaseAdapter adapter=new BaseAdapter() {
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            ImageView imageview;
            if(convertView==null){
                imageview=new ImageView(HeadSelectActivity.this);
                /*************设置图像的宽度和高度******************/
                imageview.setAdjustViewBounds(true);
                imageview.setMaxWidth(158);
                imageview.setMaxHeight(150);
                /**************************************************/
                imageview.setPadding(5, 5, 5, 5); //设置ImageView的内边距
            }else{
                imageview=(ImageView)convertView;
            }
            imageview.setImageResource(imageId[position]); //为ImageView设置要显示的图片
            return imageview; //返回ImageView
        }
        /*
         * 功能:获得当前选项的ID
         */
        @Override
        public long getItemId(int position) {
            return position;
        }
        /*
         * 功能:获得当前选项
         */
        @Override
        public Object getItem(int position) {
            return position;
        }
        /*
         * 获得数量
         */
        @Override
        public int getCount() {
            return imageId.length;
        }
    };
}

效果

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值