文档章节

Activity

d
 dwq09
发布于 2015/10/11 22:42
字数 1378
阅读 9
收藏 0
  1. 代码绑定自定义视图

    setContentView(R.layout.my_layout);

  2. 启动另一个Activity

    startActivity(new Intent(StartAnother.this,HelloWorld.class));//启动另外一个Activity

  3. 启动一个网页

    startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.baidu.com")));

  4. Activity的生命周期

  5. 两个Activity在跳转当中的生命周期

    (1) B不透明,完全遮住A。点击按钮后 startActivity(new Intent(A.this,B.class));

    启动Activity A:A onCreate -->A onStart -->A onResume -->A Activity Running

    点击Activity A中的按钮跳转至Activity B

    A onPause --> B onCreate --> B onStart --> B onResume -->A onStop

    (2) B透明的,没有完全遮住A。在AndroidManifest.xml设置B为android:theme="@style/Base.Animation.AppCompat.Dialog"

    这样对话框没有完全遮住 A,此时

    启动Activity A:A onCreate -->A onStart -->A onResume -->A Activity Running 

    点击Activity A中的按钮跳转至Activity B

       A onPause --> B onCreate --> B onStart --> B onResume (此时没有A onStop)

       关闭对话框B后

      B onPause --> A onResume --> B onStop --> B onDestroy

6. 两个Activity之间的简单传值,Activity之间通过 Intent 来进行传值。

  传值:intent.putExtra("key",data); //将传递的参数保存进 intent

  获取: Intent recvIntent = getIntent();  String data=recvIntent.getStringExtra("key");

/**
 * 两个Activity之间传递简单的参数
 * 起始Activity,触发跳转到另一个Activity
 */
public class SendArgsStart extends AppCompatActivity {
    private Button startAty;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_send_args_start); //关联视图
        startAty= (Button) findViewById(R.id.start_aty);  //在界面中找到Button
        startAty.setOnClickListener(new View.OnClickListener() {  //添加监听事件
            @Override
            public void onClick(View v) {
                Intent intent=new Intent(SendArgsStart.this,DisPlayArgs.class);
                intent.putExtra("data","测试数据");    //传递数据
                startActivity(intent);       //启动另外一个Activity
            }
        });
    }
}
/**
 * 另一个Activity,显示第一个Activity传递的简单的参数
 */
public class DisPlayArgs extends AppCompatActivity {
    private TextView tv;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_dis_play_args);  //关联视图
        tv= (TextView) findViewById(R.id.dispay_args);  //找到显示传递参数的TextView
        Intent intent=getIntent(); //获取传递过来的intent
        String args=intent.getStringExtra("data"); //获取传递的参数
        tv.setText(args); //TextView显示传递的参数
    } 
}

7. 传递一个数据包Bundle

//设置数据包bundle,并传值。
    Bundle bundle = new Bundle();   //创建bundle对象
    bundle.putString("name", "Bob"); //存入值
    bundle.putInt("age",12);
    Intent intent =new Intent(SendArgsStart.this,DisPlayArgs.class);  //创建intent对象
    //方式一
    intent.putExtras(bundle);       //放入bundle
    startActivity(intent);      //启动另一个Activity
    //方式二
//  intent.putExtra("data",bundle);
//  startActivity(intent);
//获取传递过来的数据包
   Intent intent = getIntent(); //获取intent
   //方式一
   Bundle bundle=intent.getExtras();
   tv.setText(String.format("name=[%s] age=[%s]",bundle.getString("name"),bundle.getInt("age")));
   //方式二
// Bundle bundle = intent.getBundleExtra("data");
// tv.setText(String.format("name=[%s] age=[%s]", bundle.getString("name"), bundle.getInt("age")));

8.传递值对象

   Intent intent=new Intent(ObjectArgsStartAty.this,ObjectDisplayAty.class);
   intent.putExtra("user", new User( "Super man", 100));  

    //获取时
    User user=(User)intent.getSerializableExtra("user");

  此处使用的方法是  intent.putExtra(String name,Serializable value)

 因此如果类 User 没有实现 Serializable,则会报错:

   解决上述报错可以有以下途径:

 (1)User implements Serializable,实现java jdk的接口,这个方法比较简单。

public class User implements Serializable{
 
}

(2)另外Android提供了专门面向移动设备的序列化接口。

   实现Parcelable

public class User implements Parcelable {
    private String name;
    private int age;
    //...  
}

  Parcelable没有自动生成序列化的功能,所以需要手动添加。

  重写writeToParcel。write的个数与User的字段个数有关

   @Override
    public void writeToParcel(Parcel dest, int flags) {
           dest.writeString(getName());
           dest.writeInt(getAge());
    }

 然后创建Creator

  public static final Creator<User> creator=new Creator<User>() {
     @Override
     public User createFromParcel(Parcel source) {
            return null;
     }
     @Override
     public User[] newArray(int size) {
            return new User[0];
     }
  }

   然后重写 createFromParcel

 @Override
 public User createFromParcel(Parcel source) {
       return new User(source.readString(),source.readInt()); 
 }

 这里针对的是 User中只有一个String类型和一个int 类型的字段的情况,如果User中有多个相同类型的字段则需要用Bundle,来传递值。 writeToParcel方法中dest.writeBundle(Bundle val),createFromParcel方法中 source.readBundle()。

使用这种方法获取user对象为:

User user=intent.getParcelableExtra("user"); //获取user对象

比较上述两种方式,第一种是完全由系统自动进行序列化,操作简单,但是速度比较慢;第二种需要我们手动添加,操作麻烦,但是速度比较快。

9.Activity返回参数

前面提到的传递参数都是从第一个Activity传给第二个Activity。下面介绍,从第二个Activity返回参数给第一个Activity。

需要第二个Activity返回参数,则第一个Activity需要这样启动另外一个Activity

startActivityForResult(Intent intent,int requestCode);

获取返回参数

   @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        sendReturnStartTV.setText(String.format("返回的参数为:%s  %s  %s",data.getStringExtra("result"),requestCode,resultCode));
    }

第二个Activity返回参数

setResult(int resultCode,Intent intent);

上两个Activity的代码:

public class SendReturnStartAty extends AppCompatActivity {
    private Button sendReturnStartButton;  //启动另一个Activity的按钮
    private TextView sendReturnStartTV;   //显示返回信息的文本框
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_send_return_start_aty); //关联视图
        sendReturnStartButton= (Button) findViewById(R.id.sendReturnStartButton);  //在界面中找到按钮
        sendReturnStartTV= (TextView) findViewById(R.id.sendReturnStartTV); //在界面中找到文本框
        //按钮添加点击监听事件
        sendReturnStartButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent=new Intent(SendReturnStartAty.this,SendReturnBackAty.class);
                intent.putExtra("user",new User("Return",111));
                startActivityForResult(intent,0);  //需要第二个Activity返回参数,用这个方法
            }
        });
    }
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        sendReturnStartTV.setText(String.format("返回的参数为:%s  %s  %s",data.getStringExtra("result"),requestCode,resultCode));
    }
}

另一个Activity的代码

public class SendReturnBackAty extends AppCompatActivity {
    private TextView sendReturnBackTV;  //显示第一个Activity传递的对象信息
    private EditText sendReturnBackET;  //返回给第一个Activity参数的文本编辑框
    private Button sendReturnBackButton; //触发返回的按钮
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_send_return_back_aty);  //关联视图
        sendReturnBackButton= (Button) findViewById(R.id.sendReturnBackButton);//在界面中找到按钮
        sendReturnBackET= (EditText) findViewById(R.id.sendReturnBackET);  //在界面中找到输入框
        sendReturnBackTV=(TextView)findViewById(R.id.sendReturnBackTV); //在界面中找点文本框
        User user=getIntent().getParcelableExtra("user");
        sendReturnBackTV.setText(String.format("姓名=【%s】 年龄=【%s】",user.getName(),user.getAge()));
        //给按钮添加点击监听事件,将参数返回给第一个Activity
        sendReturnBackButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent=new Intent();
                intent.putExtra("result",sendReturnBackET.getText().toString());
                setResult(1,intent);
                finish();
            }
        });
    }
}

© 著作权归作者所有

上一篇: Android日志系统
下一篇: Android日志系统
d
粉丝 0
博文 3
码字总数 2219
作品 0
梧州
私信 提问
android设置layout的时候为什么大小颠倒了啊

我最后两个layout明明设置的是3:2但是到手机上显示的时候成了2:3了,求教。下面是我的布局文件:

找到组织
2013/01/25
280
0
viewPage中嵌套listView结果 listView挤到一块去了 求大神

效果图如上,listView没有布满下面的空间 下面呈上XML代码 (主界面) (lisView的) (listView的Item) 按理说布局应该没限制到listView的高度 怎么会出现这种情况呢 难道是java文件上的错误...

Just-the-CJ
2013/08/26
1K
4
安卓开发 各种布局xml代码示例 【原创】

垂直线性布局: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layoutwidth......

bluecoffee
2014/05/18
251
0
关于apk验证 求助高手

能不能绕过这个验证步骤!

clear_qian
2013/04/03
1K
12
第七讲:用户界面 View(三)

5、表格布局 TableLayout 表格布局TableLayout以行列的形式管理子元素,每一行是一个TableRow布局对象,当然也可以是普通的View对象,TableRow离每放一个元素就是一列,总列数由列数最多的那...

程序袁_绪龙
2014/08/25
16
0

没有更多内容

加载失败,请刷新页面

加载更多

DDD(五)

1、引言 之前学习了解了DDD中实体这一概念,那么接下来需要了解的就是值对象、唯一标识。值对象,值就是数字1、2、3,字符串“1”,“2”,“3”,值时对象的特征,对象是一个事物的具体描述...

MrYuZixian
26分钟前
1
0
数据库中间件MyCat

什么是MyCat? 查看官网的介绍是这样说的 一个彻底开源的,面向企业应用开发的大数据库集群 支持事务、ACID、可以替代MySQL的加强版数据库 一个可以视为MySQL集群的企业级数据库,用来替代昂贵...

沉浮_
今天
4
0
解决Mac下VSCode打开zsh乱码

1.乱码问题 iTerm2终端使用Zsh,并且配置Zsh主题,该主题主题需要安装字体来支持箭头效果,在iTerm2中设置这个字体,但是VSCode里这个箭头还是显示乱码。 iTerm2展示如下: VSCode展示如下: 2...

HelloDeveloper
今天
6
0
常用物流快递单号查询接口种类及对接方法

目前快递查询接口有两种方式可以对接,一是和顺丰、圆通、中通、天天、韵达、德邦这些快递公司一一对接接口,二是和快递鸟这样第三方集成接口一次性对接多家常用快递。第一种耗费时间长,但是...

程序的小猿
今天
4
0
Python机器学习之数据探索可视化库yellowbrick

背景介绍 从学sklearn时,除了算法的坎要过,还得学习matplotlib可视化,对我的实践应用而言,可视化更重要一些,然而matplotlib的易用性和美观性确实不敢恭维。陆续使用过plotly、seaborn,...

yeayee
今天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部