前端开发入门到精通的在线学习网站

网站首页 > 资源文章 正文

第一行代码第二版(郭霖著)笔记之第二章(上)

qiguaw 2024-10-22 14:18:59 资源文章 24 ℃ 0 评论

第一行代码第二版已经发布一段时间了,现在把我做的笔记分享给大家,以便大家能更方便的学习,抓住重点,节约时间。

第一代码第二版本

1.1在活动中使用menu

手机屏幕空间有限,如果活动中有大量的菜单需要显示,就会占用大量的屏幕空间,这个时候创建一个menu,既不会占用空间,设计也美观。

创建方式:

  1. res—New—Directory 输入文件夹名menu,点击OK

  2. 在menu文件夹下创建名为main的菜单文件:右击menu—New-Menu resource file-输入main-点击OK

main.xml中添加如下代码:

<menu xmlns:android="http://schemas.android.com/apk/res/android">

<item 用来创建具体的某一个菜单项

android:id="@+id/add_item" id的目的是就是给这个菜单项指定一个唯一的标识符

android:title="Add"/>title的目的是给这个菜单项指定一个名称

<item

android:id="@+id/remove_item"

android:title="Remove"/>

</menu>

iii.在Activity中重写onCreateOptionMenu()方法,重写方法可以使用Ctrl+O快捷键:编写如下代码:

public boolean onCreateOptionsMenu(Menu menu){

getMenuInflater().inflate(R.menu.main,menu);

return true;

}

getMenuInflater()的目的是得到MenuInflater对象,再调用它的inflate()方法就可以给当前活动创建菜单了,inflate方法的第一个参数用于指定我们通过哪一个资源文件来创建菜单,传入R.menu.main;第二个参数用于指定我们的菜单项将添加到哪一个Menu对象当中,这里直接使用onCreateOptionsMenu()方法中传入的menu参数。然后给这个方法返回true,表示允许菜单显示出来,false是不显示出来。

菜单创建出来以后,下一步就要使用菜单了,也就是需要再定义菜单响应事件,在Acivitiy中重写onOptionsItemSelected()方法:

@Override

public boolean onOptionsItemSelected(MenuItem item) {

switch (item.getItemId()){

  • case R.id.add_item: 用来判断点击的是哪个菜单

Toast.makeText(this,"You clicked Add",Toast.LENGTH_SHORT).show(); 处理菜单的逻辑

break;

case R.id.remove_item:

Toast.makeText(this,"You clicked Remove",Toast.LENGTH_SHORT).show();

break;

}

return true;

}

1.2隐式Intent

隐式Intent,顾名思义比较含蓄,当我们开启隐式intent的时候,不用指明它的活动(Acitivity)的名称,指明它所包含的action和category就可以了

如开启SecondActivity:

  1. 首先配置<intent-filter>设置action和category

<activity android:name=".SecondActvity">

<intent-filter>

<action android:name="com.beidou.newtest.ACTION_START"></action>

<category android:name="android.intent.category.DEFAULT"></category>

</intent-filter>

</activity>

2. 开启:startActivity(new Intent("com.beidou.newtest.ACTION_START"));

注:

  • 在这里为什么没有指明category呢?是因为我们刚刚配置的category是默认的category配置,当我们调用startActivity()方法的时候会自动将这个category添加到Intent中。

  • Action只能配置一个,而category可以配置很多个;

下面我们就再增加一个category:

1.首先配置<intent-filter>设置action和category

<activity android:name=".SecondActvity">

<intent-filter>

<action android:name="com.beidou.newtest.ACTION_START"></action>

<category android:name="android.intent.category.DEFAULT"></category>

<category android:name="com.beidou.newtest.My_Categrory"></category>

</intent-filter>

</activity>

2.开启:

Intent intent = new Intent("com.beidou.newtest.ACTION_START");

intent.addCategory("com.beidou.newtest.My_Categrory");

startActivity(intent);

1.3更多intent用法:

使用隐式Intent不仅可以启动自己程序的活动,还可以启动其他程序的活动,比如你的应用程序中需要展示一个网页,只需要调用系统的浏览器来打开这个网页就行了(后面会讲解webview,不用打开系统浏览器就可以加载一个网页界面,webview通常用来做Android原生和html5之间的交互,先简单了解下)

代码如下:

Intent intent = new Intent(Intent.ACTION_VIEW);(首先指定action为Intent.ACTION_VIEW,这是Android系统内置的动作,常量值为android.intent.action.View)

intent.setData(Uri.parse("http://www.baidu.com")); (通过Uri.parse()方法,将一个网址字符串解析成一个Uri对象,再调用Intent的setData()方法将这个Uri对象传递进去)

startActivity(intent);

setData()这个方法并不复杂,它接收一个Uri对象,主要用于指定当前Intent正在操作的数据,而这些数据通常都是以字符串的形式传入到Uri.parse()方法中解析产生的。

在 <intent-filter>中,我们除了可以配置action 和 category 以外,还可以配置data标签,data标签主要配置以下内容:

  • android:scheme :用于指定数据的协议部分:如上例中的http部分。

  • android:host:用于指定数据的主机名部分,如上例中的www.baidu.com部分。

  • android:port:用于指定数据的端口部分,一般紧随在主机名之后,如“http://192.168.0.0:9080/getAddress.do?type=0”这个9080就是端口

  • adnroid:pah:用于指定主机名和端口之后的部分,如以短网址中跟在域名之后的内容,如上面网址中的“getAddress.do?type=0”部分

只要开启隐身intent,不管是aciton或category,乃至data,Intent中携带的数据都要一致才可以。一般不会在data中添加过多的内容:

示例如下:

SecondActvity:

<activity android:name=".SecondActvity">

<intent-filter>

<action android:name="android.intent.action.View"></action>

<category android:name="android.intent.category.DEFAULT"></category>

<data android:scheme="http"></data>

</intent-filter>

</activity>

开启:

Intent intent = new Intent(Intent.ACTION_VIEW);

intent.setData(Uri.parse("http://www.baidu.com"));

startActivity(intent);

action category data数据都是一样的,所以还是可以打开浏览器并且展示到百度页面(不过除了打开浏览器之外,它还可以跳转到其他的拥有http协议的actvity中,所以了解即可,因为用户体验不好,还需要客户去选择是打开浏览器还是打开这些符合条件的activity)

除了http协议外,我们还可以指定其他协议:比如geo表示显示地理位置、tel表示拨打电话。

Intent intent = new Intent(Intent.ACTION_DIAL);

指定action是Intent.ACTION_DIAL,这又是一个Android系统的内置动作(不同的协议有不同的动作,因为调动系统的动作,所以掌握这些系统的action就可以了)

intent.setData(Uri.parse("tel://10086")); 只需要修改一下协议即可,这里tel表示拨打电话 10086表示拨打的号码

startActivity(intent);

1.4向下一个活动传递数据

活动(activity)之间有时候不单单是跳转,还要传递数据;这个时候借助putExtra()方法,把数据暂存在Intent中,然后再从Intent中取出数据即可。

活动分别是FirstActivity,SecondActivity。

暂存数据(FirstActivity中):

String value = "我是value值";

Intent intent = new Intent(FirstActivity.this,SecondActvity.class);

intent.putExtra("key",value); (方法接收两个参数,第一个是key,第二个是value)

startActivity(intent);

取数据:

Intent intent = getIntent();

String value = intent.getStringExtra("key"); (因为接收的是一个字符串,所以用getStringExtra()方法;如果传递的是布尔型数据,则使用getBooleanExtra()方法)

1.5返回数据给上一个活动

既然我们可以传递数据给下一个活动,那么我们也可以返回数据给上一个活动,这个时候借用startActivityForResult()方法来启动FirstActivity跳转到SecondActivity,这个方法期望在SecondActivity销毁的时候能够返回一个结果给上一个活动(FirstActivity),这正是我们需要的。

startActivityForResult()接收两个参数,第一个参数是intent,第二个参数是请求码,用于区分数据的来源。

实战:

  • 在FirstActivity中添加按钮点击事件,执行以下操作:

Intent intent = new Intent(FirstActivity.this,SecondActvity.class);

startActivityForResult(intent,1);

  • 在SecondActivity中添加按钮点击事件,添加返回数据的逻辑:

Intent intent = new Intent();

intent.putExtra("data_return","Hello FirstActivity");

setResult(RESULT_OK,intent);

finish();

注:这次的intent仅仅传递数据,并没有跳转方面的意图,只是把数据放在intent中;然后调用setResult()方法,第一个参数用于向上一个活动返回处理结果,一般只使用RESULT_OK或者RESULT_CANCELED这两个值,第二个参数则把带有数据的Intent传递回去,finish()用于销毁SecondAcitivity活动。

  • 我们使用startActivityForResult()方法来启动FirstActivity跳转到SecondActivity,在SecondActivity被销毁之后会回调上一个活动的onActivityResult()方法,所以我们需要在FirstActivity中重写这个方法来得到返回的数据,代码如下:

@Override

protected void onActivityResult(int requestCode, int resultCode, Intent data) {

switch (requestCode){

case 1:

if (resultCode == RESULT_OK){

String returndata = data.getStringExtra("data_return");

}

break;

}

}

onActivityResult有三个参数,第一个参数requestCode,即我们在启动活动的时候传入的请求码,第二个参数resultCode,即我们在返回数据时传入的处理结果,第三个参数data,即携带着返回数据的Intent。由于在一个活动中有可能调用startActivityForResult()方法启动很多不同的方法,每一个活动返回的数据会回调到onActivityResult()方法中,因此我们通过判断requestCode值来判断数据的来源,在以上例子中确定数据是从SecondActivity中返回之后,我们再通过resultCode的值来判断处理结果是否成功。最后从data中取值。

注:以上我们是参数按钮的点击方法来添加返回数据的逻辑,所以我们也可以通过点击back的方式返回,只不过重写onBackPressed()方法来解决这个问题,在这个方法中添加和点击事件里面相同的代码即可。

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表