数据传递
全局变量传递数据
类似于Java Web中的Application域,除非android应用程序清除内存,否则全局对象将一直可以被访问。
全局变量传递数据方法
1、构建布局和活动,传递数据在这两个活动中进行,构建数据对象(java类对象,持久数据),并在清单文件中声明。
2、启动进入主活动,对布局进行触发事件的监听,设置监听器,其中获得全局对象数据(getApplication)
3、定义意图,意图设定在两个活动之间传递。
4、次活动获得数据进行回显。
使用剪切板传递数据
Windows、Linux操作系统中支持剪切板技术,某一个程序将数据复制到剪切板上,其他程序从剪切板上获取。
MyData myData = new MyData("Jack", 23);
// 将对象转换为字符串
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
String base64String = "";
try {// 捕获异常
ObjectOutputStream objectOutputStream = new ObjectOutputStream(
byteArrayOutputStream);
objectOutputStream.writeObject(myData);
base64String = Base64.encodeToString(
byteArrayOutputStream.toByteArray(), Base64.DEFAULT);
objectOutputStream.close();
} catch (Exception e) {
// TODO: handle exception
}
ClipboardManager clipboardManager = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
ClipData clipData = ClipData
.newPlainText("label", base64String);
clipboardManager.setPrimaryClip(clipData)
ClipboardManager clipboardManager = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
ClipData clipData = clipboardManager.getPrimaryClip();// 从剪切板中获取数据
Item item = clipData.getItemAt(0);
String msgString = item.getText().toString();
byte[] base64_byte = Base64.decode(msgString, Base64.DEFAULT);
ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(
base64_byte);
try {
ObjectInputStream objectInputStream = new ObjectInputStream(
byteArrayInputStream);
MyData myData = (MyData) objectInputStream.readObject();
textView.setText(myData.toString());
} catch (Exception e) {
// TODO: handle exception
}
使用意图传递数据
Intent
运行时绑定机制,它在程序运行的过程中连接两个不同的组件,通过Intent,你的程序可以向Android表达某种请求或者医院,Android根据请求和意愿的内容选择适当的组件来完成请求。
这些组件之间的通讯,主要由Intent协助完成。Intent负责对应用中一次操作的动作、动作涉及数据、附加数据进行描述,Android根据Intent的描述,负责找到对应的组件,将Intent传递给调用的组件并完成组件调用。
Intent在这里起着一个媒体中介的作用,专门提供组件互相调用的相关信息,实现调用者与被调用者之间的解耦。
intent.putExtra("name","zwl");
intent.putExtra("score",89);
Intent intent=getIntent();
int score = intent.getIntExtra("score", 0);
String name = intent.getStringExtra("name");
静态变量传递数据
Intent无法传递不能序列化的对象,通过静态变量解决问题。
定义静态变量,可以直接赋值
Activity返回值
....
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
int a = Integer.parseInt(editText1.getText().toString());
int b = Integer.parseInt(editText2.getText().toString());
Intent intent = new Intent(MainActivity.this,OtherActivity.class);
intent.putExtra("a",a);
intent.putExtra("b",b);
startActivityForResult(intent,REQUESTCODE);
}
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(resultCode==2){
if(requestCode==REQUESTCODE){
int three = data.getIntExtra("three",0);
editText3.setText(String.valueOf(three));
}
}
}
...
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent1 = new Intent();
int three = Integer.parseInt(editText.getText().toString());
intent1.putExtra("three",three);
setResult(2,intent1);
finish();
}
});
}
Android常用布局
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".OtherActivity"></activity>
七大布局分别为:线性布局(LInearLayout)、相对布局(RelativeLayout)、帧布局(FrameLayout)、表格布局(TableLayout)、绝对布局(absoluteLayout)、网格布局(GridLayout)、约束布局(ConstraintLayout)
1.线性布局(LInearLayout)
主要属性:
1.1 orientation设置布局管理器内组件的排列方式,可以设置为horizontal(横向)、vertical(纵向)两个值之一
1.2 gravity设置布局管理器内组件的对齐方式,layout_gravity控制自己在父元素的位置。
1.3 layout_weight设置权重,推荐layout_width="0dp"或layout_height=“0dp”。
可以嵌套
android:orientation设置线性布局方向
android:weight 按比例分配,方向、指定方向值0与wrap_content按比例分配,
不拉伸
match_parent 规则另置。
android:gravity 确定位置,可以使用|
2.相对布局(RelativeLayout)
主要属性:
相对布局,在这个容器内部的子元素们可以相对对方位置确定或者相对父容器
layout:above、layout:below、layout:toLeftOf 、layout:toRightOf 相对位置上下左右
layout:alignBaseline、layout:alignBottom、layout:alignLeft、layout:alignRight、layout:alignTop 基线(字体对齐)、底、左、右、顶对齐
layout_alignParentLeft、layout_alignParentRight、layout_alignParentTop、layout_alignParentBottom位于父控件的左、右、顶、底部
layout_centerHorizontal、layout_centerVertical、layout_centerInParent位于父水平居中、垂直居中、居中
layout_margin(Left、Right、Top、Bottom) 外,上下左右距离
layout_padding(Left、Right、Top、Bottom)内,上下左右距离
容器本身和子元素不能循环产生依赖。
3.帧布局(FrameLayout)
继承自ViewGroup组件,很少使用这个布局,主要可以使布局叠加。FrameLayout为每个加入其中的组件创建一个空白的区域(称为一帧),每个子组件占据一帧,这些帧会根据gravity属性执行自动对齐。
4.表格布局(TableLayout)
TableLayout包裹TableRow(行数),
TableRow包裹view(列数)。
shrinkColumns属性:当TableRow里边的空间布满布局的时候,指定列自动延伸以填充可用部分。当TableRow里边的控件还没有布满布局时,不起作用。
stretchColumns属性:设置可伸展的列。该列可以向行方向伸展,最多可占据一整行。
collapseColumns属性:设置要隐藏的列。
表格行和列行,默认与width和height
放在TableLayout从0开始
collapseColums隐藏指定的列
shrinkColums 收缩指定的列适应屏幕
stretchColums扩张指定的列以适应屏幕
放在子控件下
layout_column 把控件放在在指定TableRow的列
layout_span合并列数 ,1默认不合并
5.绝对布局(absoluteLayout)
绝对布局是需要指定子元素的 xy 精确坐标的布局。绝对布局缺乏灵活性,在没有绝对定位的情况下相比其他类型的布局更难维护,不建议使用。
指定子控件的xy精确坐标的布局,没有绝对布局不推荐使用
layout_x,layout_y
6.网格布局(GridLayout)
Android4.0(API Level 14)新引入的网格矩阵形式的布局控件。
使用的时候需要注意兼容:
compile ‘com.android.support:gridlayout-v7:22.+’
7.约束布局(ConstraintLayout)
Android Studio 2.2推出的新布局,并从Android Studio 2.3开始成为默认布局。
它的出现是为了解决复杂布局时,布局嵌套过多的问题(嵌套布局会增加绘制界面所需的时间)
相关属性