四种基本布局
下面接着上一篇博客,写下另外两种布局
FrameLayout
FrameLayout又称帧布局,这种布局没有任何的定位方式,所有的控件都会摆在布局的左上角。以后在学习碎片的时候,会用到这种布局!
TableLayout
TableLayout又称表格布局,允许我们使用表格的方式来排列控件。在设计这种布局时,我们尽量应该让每一行有相同的列数,如果表格的某一行一定要有不相等的列数时,就要用android:layout_span属性来合并单元格使之对齐。
注意:
1. 在TableLayout中每加入一个 TableRow就表示添加了一行,然后在 TableRow中每加入一个控件,就表示在该行中添加了一列,TableRow中的控件是不能指定宽度的。
2. android:stretchColumns表示指定某一列填补该行中剩余的空白
3. android:collapseColumns表示隐藏某一列
4. android:shrinkColumns表示收缩某一列
5. 在一个控件中写入 android:layout_span=”2” 表示让该控件占据两列的空间。
<?xml version="1.0" encoding="utf-8"?>
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:stretchColumns="1">
<TableRow>
<TextView
android:layout_height="wrap_content"
android:text="账号:" />
<EditText
android:layout_height="wrap_content"
android:hint="请输入您的账号"/>
</TableRow>
<TableRow>
<TextView
android:layout_height="wrap_content"
android:text="密码:"/>
<EditText
android:layout_height="wrap_content"
android:inputType="textPassword" />
</TableRow>
<TableRow>
<Button
android:layout_height="wrap_content"
android:text="登录"
android:layout_span="2"/>
</TableRow>
</TableLayout>
运行效果:
Activity操作
界面的操作
- 隐藏标题栏,全屏
第一种方法:写在manifest.xml中
<Application
android:theme="@android:style/Theme.NoTitleBar.Fullscreen">
</Application>
第二种方法:写在所在Activity的java类中
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN)
且这两句必须写在setContentView()的前边。
2. 横屏,竖屏
在manifest.xml中写
<Activity
android:screenOrentation="landspace"
android:screenOrentation="portrait">
</Activity>
使用Intent启动Activity
使用显式Intent
在FirstActivity中的按钮写一个点击事件,通过显式Intent启动SecondActivity。
button_start.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
Intent intent = new Intent(FirstActivity.this,SecondActivity.class);
startActivity(intent);
}
});
使用隐式Intent
- 在Androidmanifest.xml中注册SecondActivity时,添加代码:
<activity android:name="com.example.intenttest.SecondActivity" >
<intent-filter>
<action android:name="com.example.intenttest.start" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
①通过在activity标签下配置intent-filter的内容,可以指定当前活动能够相应的action和category。
②只有action和category的内容同时匹配Intent中指定的action和category时,这个活动才能够响应该Intent。
③”android.intent.category.DEFAULT”是一种默认的category ,在调用startActivity()方法的时候会自动将这个category 添加到Intent中。
2. 修改FirstActivity中按钮的点击事件
button_start.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
Intent intent = new Intent("com.example.intenttest.start");
startActivity(intent);
}
});
注意:每个Intent中只能指定一个action,但是能指定多个category。可以调用Intent中的addCategory()方法来添加一个category,当然你也必须在intent-filter标签中添加上该category的声明。
隐式Intent的更多用法
打电话
Intent intent = new Intent(Intent.ACTION_DIAL);
intent.setData(Uri.parse("tel:10086"));
startActivity(intent);
直接打电话
Intent intent = new Intent(Intent.ACTION_CALL);
intent.setData(Uri.parse("tel:10086"));
startActivity(intent);
/*这种方式需要在Androidmanifest.xml中声明调用打电话的权限
<uses-permission android:name="android.permission.CALL_PHONE" />*/
发短信
Intent intent = new Intent();
intent.setAction(Intent.ACTION_SENDTO);
intent.setData(Uri.parse("smsto:10086"));
//sms_body表示标签,The SMS Text为发送的短信内容。
intent.putExtra("sms_body", "The SMS Text");
startActivity(intent);
打开网页
Intent intent = new Intent(Intent.ACTION_VIEW,Uri.parse("http://www.baidu.com"));
startActivity(intent);
向下一个活动传递数据
在启动活动时传递数据,Intent中提供了一系列putExtra()方法的重载,可以把我们想要传递的数据暂存在Intent中,启动另一个Activity后,只需要把这些数据从Intent中取出即可。
比如在第一个活动中,要向下一个活动传递一个字符串:
button_start.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
Intent intent = new Intent("com.example.intenttest.start");
intent.putExtra("data", "你好,第二个界面");
startActivity(intent);
}
});
然后在SecondActivity中把数据取出,显示在TextView中
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.widget.TextView;
public class SecondActivity extends Activity{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.secondactivity_layout);
TextView textView = (TextView) findViewById(R.id.textview);
Intent intent =getIntent();
textView.setText(intent.getStringExtra("data"));
}
}
运行结果:
返回数据给上一个活动
Activity中有一个startActivityForResult()方法也是用于启动活动,但是这个方法会在活动销毁时返回一个结果给上一个活动。
①这里点击MainActivity中的按钮,启动SecondActivity
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
startActivityForResult(intent, 1);
}
});
②在SecondActivity中添加一个EditEditText,向里边输入内容,然后点击按钮,返回输入的内容。其中setResult()方法专门用于向上一个活动返回数据。这个方法传入的第一个参数用于向上一个活动返回处理结果,一般只使用RESULT_OK和RESULT_CANCELED这两个值,第二个参数则是把带有数据的Intent传递回去。最后调用finish()方法来销毁这个活动。
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
public class SecondActivity extends Activity{
private Button button;
private EditText editText;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
button = (Button) findViewById(R.id.button);
editText=(EditText) findViewById(R.id.edittext);
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
Intent intent = new Intent();
intent.putExtra("返回值", editText.getText().toString());
setResult(RESULT_OK, intent);
finish();
}
});
}
}
如果SecondActivity 不是通过点击按钮返回,然后按下Back键回到MainActivity,这样我们可以通过重写
@Override
public void onBackPressed(){
Intent intent = new Intent();
intent.putExtra("返回值", editText.getText().toString());
setResult(RESULT_OK, intent);
finish();
}
③在MainActivity中重写onActivityResult()方法得到返回的数据,并把它写入TextView中。
onActivityResult()方法带有三个参数,第一个参数requestCode,即我们在启动活动时传入的请求码,第二个参数resultCode,即我们在返回数据时传入的处理结果,第三个参数data,即携带着返回数据的Intent。
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if(requestCode==1){
if(resultCode==RESULT_OK){
textView.setText(data.getStringExtra("返回值"));
}
}
}
运行结果: