【Android开发】【创建Activity,Activity之间的切换/消息传递】【java】

一、第一个Activity

1.1 创建一个空Activity

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1.2 创建一个布局

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
知识点
在XML中引用一个id:@id/id_name
在XML中定义一个id:@+id/id_name

在这里插入图片描述
右键错误,点击Show Quick-Fixes,再点击弹出的Suppress:Add........,错误会被自动修复
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

1.3 在AndroidManifest.xml文件中注册

在这里插入图片描述
现在程序就可以运行了

1.4 在活动中使用Toast

Toast:显示短小的信息,起到提醒作用

在这里插入图片描述
(不必纠结此处代码的语法)

效果:
在这里插入图片描述

1.5 在活动中使用Menu

在这里插入图片描述
在这里插入图片描述

回到FirstActivity,重写onCreateOptionsMenu()方法【按下Ctrl+o,可生成部分代码】

在这里插入图片描述
在这里插入图片描述

此时菜单就可正常打开了
在这里插入图片描述

之后为菜单添加事件

在FirstActivity中重写onOptionsItemSelected()方法【操作方法同上】

@Overridepublic boolean onOptionsItemSelected(@NonNull MenuItem item) {if (item.getItemId() == R.id.add_item) {Toast.makeText(this,"你点击了add",Toast.LENGTH_SHORT).show();}else if(item.getItemId()==R.id.remove_item){Toast.makeText(this,"你点击了remove",Toast.LENGTH_SHORT).show();}return super.onOptionsItemSelected(item);}

效果如下:
在这里插入图片描述

1.6 销毁一个活动

  1. Android中的Back按键【就是返回键】
  2. Activity类中的finish()方法

第二种,把finish()方法写进button1中,之后点击button1,活动就会关闭

button1.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {finish();//点击button1,活动就会关闭}
});

二、活动之间的切换(Intent)

Intent

  • 可以指明当前组件想执行的动作
  • 可以在不同组件之间传递数据

2.1 显式Intent

启动SecondActivity

新建一个名为SecondActivity的Activity

在这里插入图片描述

修改FirstActivity中button1的代码,使其能启动SecondActivity

button1.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {//启动SecondActivityIntent intent=new Intent(FirstActivity.this, SecondActivity.class);startActivity(intent);}
});

效果如下
在这里插入图片描述

2.2 隐式Intent

隐式Intent不知名我们要启动哪一个活动,系统分析这个Intent,之后帮我们找出合适的活动去启动。

  • 合适的活动:可以 响应 该隐式Intent的活动

注意

  • < action >和< category >同时匹配时,才可响应
  • 每个Intent只能指定一个action,却可以指定多个category

默认的category

修改SecondActivity的 < Activity >标签

在这里插入图片描述
修改FirstActivity中button1的代码,使其能启动SecondActivity

button1.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {//启动SecondActivityIntent intent=new Intent("com.example.noactivity.ACTTION_START");//不需要添加category,因为刚才xml中的是默认categorystartActivity(intent);}
});

之后启动,点击FirstActivity中button1,能启动SecondActivity

不用默认的category

修改SecondActivity的 < Activity >标签

在这里插入图片描述
修改FirstActivity中button1的代码,使其能启动SecondActivity

button1.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {//启动SecondActivityIntent intent=new Intent("com.example.noactivity.ACTTION_START");intent.addCategory("com.example.noactivity.MY_CATEGORY");//指定的categorystartActivity(intent);}
});

之后启动,点击FirstActivity中button1,能启动SecondActivity

2.2 隐式Intent【打开浏览器】

修改FirstActivity中button1的onClick()代码

button1.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {//指定了Intent的action是Intent.ACTION_VIEWIntent intent = new Intent(Intent.ACTION_VIEW);//用Uri.parse(),将网址解析为一个Uri对象。再调用Intent的setData()方法将该Uri对象传进去intent.setData(Uri.parse("http://www.baidu.com"));startActivity(intent);}
});

效果
在这里插入图片描述

2.3 隐式Intent【新建一个活动,使其能响应打开网站的Intent】

  • < intent-filter >中可再配置一个< data >标签,可以指定当前活动可以响应什么类型的数据
标签说明
android:scheme协议,如http
android:host主机名,如www.baidu.com
android:port端口,一般紧跟主机名之后
android:path主机名和端口之后的部分
android:mimeType指定可以处理的数据类型

创建活动,名为ThirdActivity,布局名为third_layout

third_layout.xml中添加button

<Buttonandroid:id="@+id/button_3"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="Button 3"tools:ignore="MissingConstraints" />

修改AndroidManifest.xml中ThirdActivity的部分

 <activityandroid:name=".ThirdActivity"android:exported="true" ><intent-filter tools:ignore="AppLinkUrlError"><action android:name="android.intent.action.VIEW"/><category android:name="android.intent.category.DEFAULT"/><data android:scheme="http"/></intent-filter></activity>

此时ThirdActivity也可响应button1访问http://www.baidu.com的intent

2.4 隐式Intent【调用系统拨号页面】

修改button按键的onClick()方法。

主要看的是Intent 的action

button1.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Intent intent = new Intent(Intent.ACTION_DIAL);intent.setData(Uri.parse("tel:10086")); //String转Uri,再通过setData()传入intentstartActivity(intent);}
});

效果

在这里插入图片描述

2.5 向下一个活动传递数据

思路:把数据存放在intent中,启动另一个活动后,把这些数据从intent中取出即可

  • intent.putExtra()
  • getIntent()
  • intent.getStringExtra("extra_data")

在FirstActivity中启动SecondActivity

button1.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {String data = "Hello SecondActivity";//要发送的数据Intent intent = new Intent(FirstActivity.this, SecondActivity.class);//intentintent.putExtra("extra_data",data);//两个参数,(“键”,“要传递的数据”)startActivity(intent);}
});

在SecondActivity中取出数据,并打印出来

public class SecondActivity extends AppCompatActivity {private static final String TAG = "SecondActivity";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.second_layout);Intent intent=getIntent();//获取intentString data=intent.getStringExtra("extra_data");//键Log.d(TAG, data);//在logcat中打印数据}
}

logcat中的数据

在这里插入图片描述

2.5 返回数据给上一个活动

  • startActivityForResult();:该方法期望在活动销毁时能够返回一个结果给上一个活动
  • putExtra()
  • setResult()
  • onActivityResult()

在FirstActivity中启动SecondActivity

button1.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Intent intent = new Intent(FirstActivity.this, SecondActivity.class);//intentstartActivityForResult(intent,1);//参数(intent,请求码)}
});

SecondActivity中button事件。点击后SecondActivity结束,返回数据(在intent中)

button2.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Intent intent=new Intent();intent.putExtra("data_return","Hello FirstActivity");setResult(RESULT_OK,intent);//向上一个活动返回数据(数据在intent中)finish();//结束SecondActivity}
});

覆写FirstActivity中的onActivityResult()方法,以获取返回数据

@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {super.onActivityResult(requestCode, resultCode, data);switch (requestCode) {//根据请求码,进入不同的分支case 1:if (resultCode == RESULT_OK) {String returnedData = data.getStringExtra("data_return");//根据键值,获取返回数据Log.d("FirstActivity", returnedData);}break;case 2:break;default:}
}

结果:

在这里插入图片描述

参考

第一行代码,郭霖

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/562438.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【C语言】动态内存分配

1、为什么要有动态内存分配 不管是C还是C中都会大量的使用&#xff0c;使用C/C实现数据结构的时候&#xff0c;也会使用动态内存管理。 我们已经掌握的内存开辟方式有&#xff1a; int val 20; //在栈空间上开辟四个字节 char arr[10] { 0 }; //在栈空间…

利用Base64加密算法将数据加密解密

1. Base64加密算法 Base64准确来说并不像是一种加密算法&#xff0c;而更像是一种编码标准。 我们知道现在最为流行的编码标准就是ASCLL&#xff0c;它用八个二进制位&#xff08;一个char的大小&#xff09;表示了127个字符&#xff0c;任何二进制序列都可以用这127个字符表…

【小沐学AI】智谱AI大模型的一点点学习(Python)

文章目录 1、简介1.1 大模型排行榜 2、智谱AI2.1 GLM2.1.1 模型简介2.1.2 开源代码2.1.2.1 GLM-130B 2.2 ChatGLM2.2.1 模型简介2.2.2 开源代码2.2.2.1 ChatGLM-6B2.2.2.2 ChatGLM3 2.3 CodeGeeX2.3.1 模型简介2.3.2 开源代码 2.4 CogView2.4.1 模型简介2.4.2 开源代码 2.5 Cog…

关于序列化和反序列化

什么是序列化&#xff0c;什么是反序列化 简单来说&#xff1a; 序列化&#xff1a;将数据结构或对象转换成二进制字节流的过程反序列化&#xff1a;将在序列化过程中所生成的二进制字节流转换成数据结构或者对象的过程 为什么要进行序列化 我们要将java对象进行网络传输&a…

Grok-1安装

安装 源代码 huggingface git clone https://github.com/xai-org/grok-1.git # 新建虚拟环境 conda create --prefixD:\CondaEnvs\grok1 python3.11conda activate D:\CondaEnvs\grok1 pip install huggingface_hub[hf_transfer] pip install -U "huggingface_hub[cli]&…

#Linux(Source Insight安装及工程建立)

&#xff08;一&#xff09;发行版&#xff1a;Ubuntu16.04.7 &#xff08;二&#xff09;记录&#xff1a; &#xff08;1&#xff09;安装教程&#xff1a; Source insight 工具安装及使用方法-CSDN博客https://blog.csdn.net/YAOHAIPI/article/details/125191451&#xff…

浅谈前端路由原理hash和history

1、认识前端路由 本质 前端路由的本质&#xff0c;是监听 url 地址或 hash 值的改变&#xff0c;来切换渲染对应的页面组件 前端路由分为两种模式 hash 模式 history 模式 两种模式的对比 2、hash 模式 &#xff08;1&#xff09;hash 定义 hash 模式是一种把前端路由的路…

SpringCloud之网关组件Gateway学习

SpringCloud之网关组件Gateway学习 GateWay简介 Spring Cloud Gateway是Spring Cloud的⼀个全新项目&#xff0c;目标是取代Netflix Zuul&#xff0c;它基于Spring5.0SpringBoot2.0WebFlux&#xff08;基于高性能的Reactor模式响应式通信框架Netty&#xff0c;异步⾮阻塞模型…

Wireshark TS | DNS 案例分析之外的思考

前言 承接之前一篇《Packet Challenge 之 DNS 案例分析》&#xff0c;在数据包跟踪文件 dnsing.pcapng 中&#xff0c;关于第 4 题&#xff08;What is the largest DNS response time seen in this trace file? &#xff09;的分析过程中曾经碰到一个小问题&#xff0c;主要…

Pycharm小妙招之Anaconda离线配环境

Pycharm小妙招之Anaconda离线配环境———如何给无法联网的电脑配python环境&#xff1f; 1. 预备工作2. 电脑1导出包2.1 环境路径2.2 压缩py38导出至U盘 3. 电脑2导入包4. 验证是否导入成功4.1 conda查看是否导入4.2 pycharm查看能否使用 1. 预备工作 WINDOWS系统电脑1(在线)…

设计模式及其在项目、框架中的应用

设计模式的作用&#xff1a; 1、类之间关系图&#xff0c;明确的角色及其关系、作用&#xff1b; 2、符合开闭原则&#xff0c;职责明确&#xff0c;并且开放的拓展点可以有效应对后期的变化。 &#xff08;一&#xff09;、责任链模式 适用场景&#xff1a; 在一个流程中&…

mysql无法看到3306端口监听

参考:https://blog.csdn.net/shumeigang/article/details/103902459 mysql> show global variables like ‘port’; 是0 原因是我的my.cnf有话&#xff1a; skip-network 或 注释掉&#xff0c;然后重新启动下数据库&#xff0c;运行netstat -an|grep 3306 就可以看到了