Android开发学习第二天

数据传递

全局变量传递数据

类似于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控制自己在父元素的位置。
img
1.3 layout_weight设置权重,推荐layout_width="0dp"或layout_height=“0dp”。

可以嵌套

android:orientation设置线性布局方向

android:weight 按比例分配,方向、指定方向值0与wrap_content按比例分配,

不拉伸

match_parent 规则另置。

android:gravity 确定位置,可以使用|

2.相对布局(RelativeLayout)

主要属性:img
相对布局,在这个容器内部的子元素们可以相对对方位置确定或者相对父容器

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开始成为默认布局。

它的出现是为了解决复杂布局时,布局嵌套过多的问题(嵌套布局会增加绘制界面所需的时间)

相关属性img

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值