[关闭]
@stepbystep 2015-01-18T09:48:35.000000Z 字数 11038 阅读 3745

Intent操作Activity

Android


上一节课的复习

本节主要内容

Intent操作Activity

启动Activity有两种方式,直接启动和带返回值的启动

直接启动

  1. Intent intent=new Intent(this,NewActivity.class);
  2. this.startActivity(intent);

带返回值的启动

  1. Intent data=new Intent();
  2. data.putExtra("name",name);
  3. this.setResult(RESULTCOCE, data);
  4. //销毁当前Actvity
  5. this.finish();

关闭Activity

两种启动Activity的方法的实验

新建IntentActivity工程

新建一个工程名为IntentActivity, 再新建一个Activity,因为之前已经试过全程手工新建普通java文件再编辑的流程,此后,我们一般采用系统新建Activity的方法,因为会自动在AndroidManifest.xml文件中注册该Activity
此处输入图片的描述

新建MainActivity
此处输入图片的描述

同理新建OtherActivity和OnResultActivity, 新建后,工程目录如下:
此处输入图片的描述

编辑工程

修改MainActivity相关文件

activity_main.xml

  1. <!-- 线性布局
  2. android:orientation="vertical" 必须加,因为线性布局默认的是水平的
  3. -->
  4. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  5. xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
  6. android:layout_height="match_parent"
  7. android:orientation="vertical"
  8. >
  9. <!-- EditText的属性
  10. editTexxt表示可输入的文本框,类似html的input标签
  11. android:textColor="#2988e4" 设置文本显示的颜色,此处采用html格式,#后面可以跟3位,6位,8位16进制数
  12. android:textSize="18sp" 设置字体大小,注意字体一般使用18sp
  13. android:hint="" 表示该TextView在文本为空的时候显示的内容
  14. android:layout_margin="10dp" 表示距离周围的其他控件4个方向都是10dp 注意,表示间隔一般用dp为单位
  15. -->
  16. <EditText
  17. android:id="@+id/txt_input"
  18. android:layout_width="match_parent"
  19. android:layout_height="wrap_content"
  20. android:layout_margin="10dp"
  21. android:textColor="#2988e4"
  22. android:textSize="18sp"
  23. android:hint="在此处输入需要传递的信息"/>
  24. <!-- Button的属性
  25. android:onClick="clickOtherActivity" 表示点击此按钮调用的事件,在对应的Activity文件中
  26. 需要添加public void startActivityNoResult(View v)() 的函数
  27. -->
  28. <Button
  29. android:layout_width="match_parent"
  30. android:layout_height="wrap_content"
  31. android:layout_margin="10dp"
  32. android:text="点我无返回值的打开"
  33. android:onClick="startActivityNoResult"
  34. />
  35. <Button
  36. android:id="@+id/btn_on_result_activity"
  37. android:layout_width="match_parent"
  38. android:layout_height="wrap_content"
  39. android:layout_margin="10dp"
  40. android:text="点我带返回值的打开,修改我自己"
  41. android:onClick="startActivityWithResult"
  42. />
  43. </LinearLayout>

MainActivity.java

  1. package com.example.shiyanlou.intentactivity;
  2. import android.app.Activity;
  3. import android.content.Intent;
  4. import android.os.Bundle;
  5. import android.view.Menu;
  6. import android.view.MenuItem;
  7. import android.view.View;
  8. import android.widget.Button;
  9. import android.widget.EditText;
  10. import android.widget.TextView;
  11. // 此处修改为继承自Activity
  12. public class MainActivity extends Activity {
  13. // 对应布局文件中的TextView
  14. EditText txtInput = null;
  15. // 对应布局文件中的点击带返回值的Button
  16. Button btnResult = null;
  17. // 请求码:指定启动源(从当前界面的那个控件部分启动的)
  18. private static final int REQUEST_CODE = 1;
  19. // 用系统生成工具会自动创建如下代码
  20. @Override
  21. protected void onCreate(Bundle savedInstanceState) {
  22. super.onCreate(savedInstanceState);
  23. setContentView(R.layout.activity_main);
  24. //寻找控件
  25. txtInput = (EditText)this.findViewById(R.id.txt_input);
  26. btnResult = (Button)this.findViewById(R.id.btn_on_result_activity);
  27. }
  28. /**
  29. * 启动Activity不带返回值
  30. * Intent(意图):想要干什么.
  31. * Intent意图的分类:
  32. * 1.显式意图:指定启动目标(组件名)的意图;
  33. * 2.隐式意图:没有指定组件名,是通过匹配Action,Category和Data进行目标组件的查找的.
  34. * Intent的功能:1.激活组件;2.携带数据
  35. *
  36. * 对应Button中的onClick属性,注意,此处应该带参数View
  37. */
  38. public void startActivityNoResult(View view){
  39. // 首先判断txtInput内容是否为空
  40. if(txtInput.getText().toString().isEmpty()){
  41. // 设置txtInput显示错误信息
  42. txtInput.setError("输入内容不能为空!");
  43. return;
  44. }
  45. //使用显式意图激活组件方式如下
  46. //方式1
  47. Intent intent=new Intent(this, OtherActivity.class);
  48. //方式2
  49. //Intent intent=new Intent();
  50. //intent.setClass(this,OtherActivity.class);
  51. //方式3
  52. //Intent intent=new Intent();
  53. //intent.setClassName(this,"com.example.shiyanlou.intentactivity.OtherActivity");
  54. //方式4
  55. //Intent intent=new Intent();
  56. //ComponentName component=new ComponentName(this, OtherActivity.class);
  57. //intent.setComponent(component);
  58. //携带数据的方式如下
  59. //方式1
  60. //intent.putExtra("name","张三");
  61. //intent.putExtra("text", txtInput.getText().toString());
  62. //方式2
  63. Bundle bundle=new Bundle();
  64. bundle.putString("text", txtInput.getText().toString());
  65. intent.putExtras(bundle);
  66. // 直接启动Activity
  67. startActivity(intent);
  68. }
  69. /**
  70. * 启动Activity带返回值
  71. * 对应Button中的onClick属性,注意,此处应该带参数View
  72. */
  73. public void startActivityWithResult(View view){
  74. Intent intent=new Intent(this,OnResultActivity.class);
  75. /*
  76. * 启动目标Activity并要求带回目标Activity中的数据到当前Activity,方式是
  77. * 重写源Activity中的onActivityResult方法
  78. */
  79. startActivityForResult(intent, REQUEST_CODE);
  80. }
  81. @Override
  82. /**
  83. * 重写onActivityResult方法
  84. * @param requestCode 指定启动源
  85. * @param resultCode 指定目标或者目标的哪个部分被点击后返回的值
  86. * @param data 在目标Activity被销毁前使用this.setResult(REQUEST_CODE, intent);
  87. * 方法后携带数据的intent值, 即data==intent
  88. */
  89. protected void onActivityResult(int requestCode, int resultCode, Intent data) {
  90. super.onActivityResult(requestCode, resultCode, data);
  91. //指定哪个启动源启动的目标Activity
  92. if(requestCode==REQUEST_CODE){
  93. //指定目标Activity的那个控件被点击后返回的值
  94. if(resultCode == OnResultActivity.RESULT_CODE){
  95. String txt=data.getStringExtra("text");
  96. btnResult.setText("我被修改为"+txt);
  97. }
  98. }
  99. }
  100. }

修改OnResultActivity相关文件

activity_on_result.xml

  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. xmlns:tools="http://schemas.android.com/tools"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent"
  5. android:orientation="vertical">
  6. <!-- 此处同样也用EditText
  7. android:gravity="start" 表示从控件的开始部分显示
  8. android:padding="20dp" 设置内间距为20dp,4个方向都有
  9. -->
  10. <EditText
  11. android:id="@+id/txt_result"
  12. android:layout_width="match_parent"
  13. android:layout_height="200dp"
  14. android:textSize="30sp"
  15. android:hint="我将传递数据给MainActivity"
  16. android:textColor="#2988e4"
  17. android:padding="20dp"
  18. android:gravity="start"/>
  19. <Button
  20. android:id="@+id/btn_commit"
  21. android:layout_width="match_parent"
  22. android:layout_height="wrap_content"
  23. android:layout_margin="10dp"
  24. android:textSize="20dp"
  25. android:text="提交数据"/>
  26. </LinearLayout>

OnResultActivity.java

  1. package com.example.shiyanlou.intentactivity;
  2. import android.app.Activity;
  3. import android.content.Intent;
  4. import android.os.Bundle;
  5. import android.text.TextUtils;
  6. import android.view.Menu;
  7. import android.view.MenuItem;
  8. import android.view.View;
  9. import android.widget.EditText;
  10. // 实现点击事件的新方法, 主类实现OnclickListener接口,并重写onClick方法
  11. public class OnResultActivity extends Activity implements View.OnClickListener{
  12. private EditText txtResult;
  13. public static final int RESULT_CODE = 2;
  14. @Override
  15. protected void onCreate(Bundle savedInstanceState) {
  16. super.onCreate(savedInstanceState);
  17. setContentView(R.layout.activity_on_result);
  18. txtResult = (EditText) this.findViewById(R.id.txt_result);
  19. // 注册点击事件,因为本类实现了OnClickListener接口,故而此处填写this
  20. this.findViewById(R.id.btn_commit).setOnClickListener(this);
  21. }
  22. @Override
  23. public void onClick(View v) {
  24. if(v.getId() == R.id.btn_commit){
  25. // 点击提交
  26. String text=this.txtResult.getText().toString();
  27. if(TextUtils.isEmpty(text)){
  28. // 为空的时候让EditText显示错误信息
  29. txtResult.setError("请填写返回信息");
  30. return;
  31. }
  32. Intent data=new Intent();
  33. data.putExtra("text",text);
  34. //指定当前Activity被销毁时 向启动源返回的结果码和意图对象(携带数据)
  35. this.setResult(RESULT_CODE, data);
  36. //销毁当前Actvity
  37. this.finish();
  38. }
  39. }
  40. }

修改OtherActivity相关文件

activity_other.xml

  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
  3. android:layout_height="match_parent">
  4. <TextView
  5. android:id="@+id/txt_get_content"
  6. android:text="I am OtherActivity"
  7. android:layout_width="match_parent"
  8. android:layout_height="match_parent"
  9. android:textSize="30sp"
  10. android:textColor="#2988e4"
  11. android:gravity="center"/>
  12. </RelativeLayout>

OtherActivity.java

  1. package com.example.shiyanlou.intentactivity;
  2. import android.app.Activity;
  3. import android.os.Bundle;
  4. import android.view.Menu;
  5. import android.view.MenuItem;
  6. import android.widget.TextView;
  7. public class OtherActivity extends Activity {
  8. public TextView txtGetContent;
  9. @Override
  10. protected void onCreate(Bundle savedInstanceState) {
  11. super.onCreate(savedInstanceState);
  12. setContentView(R.layout.activity_ohter);
  13. txtGetContent = (TextView) this.findViewById(R.id.txt_get_content);
  14. // 获取从MainActivity传递过来的数据,注意两边传递的键必须相同,否则此处获取到的将是空
  15. // 得到意图中的数据方式1
  16. String text = getIntent().getStringExtra("text");
  17. //得到意图中的数据方式2
  18. /*Bundle bundle=getIntent().getExtras();
  19. String text=bundle.getString("text");*/
  20. // 设置TextView的值
  21. txtGetContent.setText(text);
  22. }
  23. }

AndroidManifest.xml 文件

说明,使用上述的新建Activity的方法后,Activity会自动在manifest中注册

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"
  3. package="com.example.shiyanlou.intentactivity" >
  4. <application
  5. android:allowBackup="true"
  6. android:icon="@drawable/ic_launcher"
  7. android:label="@string/app_name"
  8. android:theme="@style/AppTheme" >
  9. <activity
  10. android:name="com.example.shiyanlou.intentactivity.MainActivity"
  11. android:label="@string/title_activity_main" >
  12. <intent-filter>
  13. <action android:name="android.intent.action.MAIN" />
  14. <category android:name="android.intent.category.LAUNCHER" />
  15. </intent-filter>
  16. </activity>
  17. <activity
  18. android:name="com.example.shiyanlou.intentactivity.OnResultActivity"
  19. android:label="@string/title_activity_on_result" >
  20. </activity>
  21. <activity
  22. android:name=".OtherActivity"
  23. android:label="@string/title_activity_ohter" >
  24. </activity>
  25. </application>
  26. </manifest>

运行截图

进入主界面如下:
此处输入图片的描述

此时点击无返回值的打开会报错
此处输入图片的描述

输入信息后再点击打开
此处输入图片的描述

进入OtherActivity界面,把I am Good Man!传递过去了
此处输入图片的描述

按Esc键返回后,点击第二个按钮
此处输入图片的描述

进入OnResultActivity, 点击提交按钮,显示错误信息
此处输入图片的描述

输入信息后再点击提交
此处输入图片的描述

重新进入了到MainActivity,并且修改了第二个Button的显示内容
此处输入图片的描述

Activity其他相关

改变标题栏与去除标题栏

<Activity>标签中使用android:label=""属性
onCreate方法中使用setTitle方法

去除标题栏

  1. //注意这句一定要写在setContentView()方法的前面,不然会报错的
  2. //在Activity的onCreate方法中调用
  3. requestWindowFeature(Window.FEATURE_NO_TITLE);//去掉标题栏
  1. <!-- 可以看出,这样写的话,整个应用都会去掉标题栏,如果只想去掉某一个Activity的标题栏的话,可以把这个属性加到activity标签里面-->
  2. <application android:icon="@drawable/icon"
  3. android:label="@string/app_name"
  4. android:theme="@android:style/Theme.NoTitleBar">
  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <resources>
  3. <style name="notitle">
  4. <item name="android:windowNoTitle">true</item>
  5. </style>
  6. </resources>

这样,我们就自定义了一个style,就相当于一个主题,然后在AndroidManifest.xml文件中使用

  1. <application android:icon="@drawable/icon"
  2. android:label="@string/app_name"
  3. android:theme="@style/notitle">

设置其全屏

同上面设置标题一样
- 第一种

  1. // 在onCreate方法中调用
  2. getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);

第二种

  1. <!-- 直接设置主题为全屏-->
  2. android:theme="@android:style/Theme.NoTitleBar.Fullscreen"

第三种

  1. application android:icon="@drawable/icon"
  2. android:label="@string/app_name"
  3. android:theme="@style/fullscreem"

横竖屏显示

  1. private OnClickListener onClick=new OnClickListener() {
  2. @Override
  3. public void onClick(View v) {
  4. //设置屏幕为横屏
  5. if(v==butLandscrpe){
  6. MainActivity.this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
  7. //设置为置屏幕为竖屏
  8. }else{
  9. MainActivity.this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
  10. }
  11. }
  12. };

本节实验

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注