学习andriod开发之 关于actvity(三)

本文详细介绍了在Android开发中如何实现两个Activity之间的数据传递,通过使用Intent对象来实现数据的发送与接收,并提供了通用的父类BaseAct以简化代码重复性。文章还涉及了Activity间的跳转、动画效果、以及数据类型多样性的传递方式。

        大家好 我是akira 又和大家如期相至 不知道各位看的都怎么样了呢 学习本身是一件漫长的旅程 

我们认为 你在意的是沿途的风景 更是看风景的心情 听上去虽然有点广告化 但的确是这样 编程本身就是一个靠兴趣才能走的更远的

这么一件事 而我也是靠着兴趣慢慢来的 我会跟大家一起学习 一起进步。

        前面我们说了关于act 的生命周期 以及它的启动模式 接下来 为了让我们得应用活起来 我们准备要做两个act进行数据之间的传递 听上去

不错 不是么。

首先 来一个工程 建立actA

 效果图


xml布局代码

<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=".ActA" >

    <EditText
        android:id="@+id/et_typea"
        android:hint="@string/typesomething"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true"
        />
    <Button 
        android:layout_below="@id/et_typea"
        android:id="@+id/bt_send"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/send"
        android:layout_centerHorizontal="true"
        />

</RelativeLayout>

很简单 就是一个输入框 一个按钮 我们要做的就是 接收输入框中的数据 只要点击发送 

就发送到第二个actB上 那么 我们肯定少不了actB 

看下actB的效果


什么都没做 就是一个文字 为了更加明显 我改下文字的大小和颜色


这样就显得好看了很多 当然这里我们学到了两个新属性 

颜色和大小

 android:textColor="#ff0000"
        android:textSize="25sp"

这里颜色可以使用一个单独的颜色属性 为了简易 我就使用RGB ff则是red的最大亮度 这个就好比三个小灯泡 

三原色的原理估计大家都知道 这里就不多说了 而我们使用指定文字大小则用sp 

有道面试题是问 dip dp 和sp 和dpi 各有什么区别 

这里 我们知道 在andriod开发初期 那时候除了文字其余比如设置图片宽高都用dip为单位 而到后期演变成了dp 所以可以说dp和dip是同一个概念 

sp刚才已经讲过 和dp作用差不多 不过只能文字使用 那么dpi这是什么东西呢

原来 dpi也称 dot per inch 在现在阶段 你知道其是每英寸像素点数就可以了 后期我们再细讲

       

         OK 现在我们就来做传输数据的操作 需求是讲A中的数据传入B中 听上去简直so easy 

那么 我们就来写代码吧

public class ActA extends Activity implements OnClickListener {

	private EditText et_typea;
	private Button bt_send;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_act);
		findview();
		setListener();
	}

	private void setListener() {
		bt_send.setOnClickListener(this);
	}

	private void findview() {
		et_typea = (EditText) findViewById(R.id.et_typea);
		bt_send = (Button) findViewById(R.id.bt_send);
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.activity_act, menu);
		return true;
	}

	@Override
	public void onClick(View v) {
		    String content = et_typea.getText().toString().trim();
		if(v.getId()==R.id.bt_send){
			if(content.equals("")){
				ToastUtil.showToast(this, "还没有内容", Toast.LENGTH_LONG);
				return;
			}
			//传递
		}
			
		
	}

}

上述代码我们已经写得很熟了 因为考虑到可能要多次用到吐司 所以我们做了一个自己的工具类进行了下封装

/**
 * 吐司的工具类
 * @author akira
 * @date
 *
 */
public class ToastUtil {
	
	public static void showToast(Context ct,String content,int time){
		Toast.makeText(ct, content, time).show();
		
	}

}

但是随之而然的问题也来了 我们该如何传递数据并且发送出去 

首先 我们要了解下一个东西叫做intent 请记住这个对象 因为我们在以后的讲解中要频繁的使用到它

完善代码

//传递
			Intent intent = new Intent(this,ActB.class);
			intent.putExtra("name", content);
			startActivity(intent);
我们发现intent更像map 因为有key和value 那么我们就照着map的思路写b的代码

public class ActB extends Activity {
	private TextView tv;

	@Override
	protected void onResume() {
		// TODO Auto-generated method stub
		super.onResume();
		setContentView(R.layout.activity_actb);
		findview();
		initView();
	}

	private void initView() {
		tv.setText(getIntent().getStringExtra("name"));
		ToastUtil.showToast(this, "内容来了", Toast.LENGTH_SHORT);
	}

	private void findview() {
		tv = (TextView) findViewById(R.id.tv);
		
	}

}

这里思路差不多 按照intent拿东西即可 写完之后千万不要忘了在清单文件中加入actB

<activity android:name="com.akira.actdemo3.ActB"></activity>

我们验证的时候 最好接入真机进行验证 我手头正好有一部小米2s 就拿它啦 

如果其他手机找不到设备 我们需要利用豌豆家 91这样的助手 帮我们找下设备驱动你的adt就可以认了 

然后在ddms上会有你的设备

而ddms又叫视图 我们发现在eclipse上端有很多视图 

这里有三种 有个java 也就是一般你写代码时候用的视图 而我们还会经常接触到debug也就是调试视图 

这将有助于我们测试 发现深层问题 

我们在想看的地方打上断电

tv.setText(getIntent().getStringExtra("name"));

比如这句代码 我们右键工程run as andriod XXX这个 然后刚开始不要动 找到ddms视图 有个绿色虫子的图标

点一下 

发现进入了调试状态 然后 我们点击发送按钮

发现这里数据已经过来了 这里有个小技巧 进入方法 f5 一步一步是f6 切记

OK 我们完成了页面的传递和跳转 但是有点不太爽 因为我们知道工程里有很多的类 假如我们每次都要findview 和setListener那这个代码的重复性也太高了 

而开发中尽量避免重复 所以我们得将代码做下提炼 

写一个通用的父类 我们称之为BaseAct

代码如下

public abstract class BaseAct extends Activity {
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
	}
	protected abstract void findview();
	protected abstract void setListener();
	/**
	 * 实现动画效果
	 */
	protected void gotoAct(){
		overridePendingTransition(R.anim.trans_in, R.anim.trans_out);
	}
}
这里 我们稍微做了点改动把通用的都弄成抽象 同时加入一个gotoXXX的方法 

这里面andriod写好一个方法是overXXX这里面要两个动画 这里简单说下动画 其实一般的tween动画可以用xml来做 

我们看下动画的代码 (本期不涉及到动画)

trans in

<?xml version="1.0" encoding="utf-8"?>
<translate
    android:fromXDelta="100%p"
    android:toXDelta="0"
    android:fromYDelta="0"
    android:toYDelta="0"
    android:duration="500"
    xmlns:android="http://schemas.android.com/apk/res/android">
 </translate>

trans out

<?xml version="1.0" encoding="utf-8"?>
<translate
    android:fromXDelta="0"
    android:toXDelta="-100%p"
    android:fromYDelta="0"
    android:toYDelta="0"
    android:duration="500"
    xmlns:android="http://schemas.android.com/apk/res/android">
 </translate>

这样写好之后 我们修改下a和b act的代码

public class ActA extends BaseAct implements OnClickListener {

	private EditText et_typea;
	private Button bt_send;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_act);
		findview();
		setListener();
	}

	@Override
	protected void setListener() {
		bt_send.setOnClickListener(this);
		
	}
	
	@Override
	protected void findview() {
		et_typea = (EditText) findViewById(R.id.et_typea);
		bt_send = (Button) findViewById(R.id.bt_send);
		
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.activity_act, menu);
		return true;
	}

	@Override
	public void onClick(View v) {
		    String content = et_typea.getText().toString().trim();
		if(v.getId()==R.id.bt_send){
			if(content.equals("")){
				ToastUtil.showToast(this, "还没有内容", Toast.LENGTH_LONG);
				return;
			}
			//传递
			Intent intent = new Intent(this,ActB.class);
			intent.putExtra("name", content);
			startActivity(intent);
			gotoAct();
			finish();//关闭当前
		}
			
		
	}

}

B

public class ActB extends BaseAct {
	private TextView tv;

	@Override
	protected void onResume() {
		// TODO Auto-generated method stub
		super.onResume();
		setContentView(R.layout.activity_actb);
		findview();
		initView();
	}

	private void initView() {
		tv.setText(getIntent().getStringExtra("name"));
		ToastUtil.showToast(this, "内容来了", Toast.LENGTH_SHORT);
	}

	
	@Override
	protected void findview() {
		 tv = (TextView) findViewById(R.id.tv);
		
	}

	@Override
	protected void setListener() {
		// TODO Auto-generated method stub
		
	}

}

这里有个finish方法 作用是关闭当前act 至于B中的setListener 由于没有用到做下空实现就可以了 

这里照样没问题

现在你已经知道了传简单的字符串 然而数据类型还有很多种 那么如何传剩下的 我个人比较关注传递对象的问题 

还有 你已经看到了 startAct 是可以跳转的 那么还有没有其他的api做相同的事情呢 

请看下期 学习andriod开发之 关于actvity(四)
本期代码下载

http://download.youkuaiyun.com/detail/mtgodd/8046809

我去愉快的恶灵附身了 

一起努力哦



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值