活动
在活动中使用Toast
1.Toast是Android系统提供的一种提醒方式,在程序中可以使用它将一些短小的信息通知给用户,这些信息会在一段时间后自动消失,并且不会占用任何屏幕空间。
2.用法:通过静态方法makeText()创建一个Toast对象,然后调用show()将Toast显示出来就行啦。
注意:makeText()方法需要传入三个参数。第一个参数是Context,也就是Toast要求的上下文,由于活动本身就是Context对象,所以这里直接传入FirstActivity.this即可。第二个参数是Toast显示的内容。第三个是Toast显示的时长,有两个内置常量Toast.LENGTH_SHOUT和Toast.LENGTH_LONG。
示例:Toast.makeText(FristActivity.this, "You clicked Button 1", Toast.LENGTH_SHOUT).show();
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//Log.d("FirstActivity", this.toString());
Log.d("FirstActivity", "Task id is" + getTaskId());
setContentView(R.layout.first_layout);
Button button1 = (Button) findViewById(R.id.button_1);
button1.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
Toast.makeText(FirstActivity.this, "You clicked Button 1", Toast.LENGTH_SHORT).show();//当你点击按钮会打印You...
}
});
}
}
在活动中使用Menu
1.首先在res目录下新建一个menu文件夹,接着在这个文件夹下新建一个叫main的菜单文件,然后在main.xml中添加代码:
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/add.item"
android:title="Add"/>
<item
android:id="@+id/remove_item"
android:title="Remove"/>
</menu>
其中< item >标签就是用来创建具体的一个菜单项,然后通过android:id给这个菜单项指定唯一的标识符,通过android:title给这个菜单项指定一个名称 。
然后在FirstActivity中重写onCreateoptionsMenu()方法:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main,menu);
return true;
}
通过getMenuInflater()方法能够得到MenuInflater对象,再调用他的inflate()方法就可以给当前活动创建菜单了。
注意:inflate()方法接收两个参数,第一个参数用于指定我们通过那一个资源文件来创建菜单,第二个参数用于指定我们的菜单项将添加到哪一个Menu对象中,返回true表示允许创建的菜单显示出来,false则无法显示。
2.定义菜单响应事件
在FirstActivity中重写onOptionsItemSelected()方法:
@Override
public boolean onOptionsItemSelected(@NonNull 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;
default:
}
return true;
}
通过调用item.getItemId()来判断我们点击的是哪一个菜单项,然后给每个菜单项加入逻辑处理,这里用的是Toast,弹出一个提示。
可以看到,菜单里的菜单项默认是不会显示的,只有点击一下菜单按钮才会弹出里面具体的内容,因此他不会占用任何活动的空间。
销毁一个活动
1.按一下Back键就可以销毁当前的活动了
2.Activity类中提供了一个finish()方法,在活动中调用一下这个方法就能销毁当前活动了
button1.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
//finish();//销毁本次活动
}
});
使用Intent在活动之间穿梭
Intent是Android程序中各组件之间进行交互的一种重要方式,它不仅可以指明当前组件想要执行的动作,还可以在不同组件之间传递数据
使用显示Intent
要在活动之间穿梭就需要多个活动,创建SecondActivity活动,布局文件second_layout。
在布局文件中定义Button 2:
<Button
android:id="@+id/button_2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Button 2"
/>
- 构建出Intent的“意图”
Intent有多个构造函数的重载,
Intent(Context packageContext, class<?> cls),这个构造函数接收两个参数,第一个参数Context要求提供一个启动活动的上下文,第二个参数Class则是指定想要启动的目标活动。通过这个构造就可以构建出Intent的“意图”。 - 启动活动
Activity类中提供了一个startActivity()方法,这个方法是专门用于启动活动的,它接收一个Intent参数,就可以启动目标活动了。
button1.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
Intent intent = new Intent(FirstActivity.this, SecondActivity.class);//第一个参数是上下文,二是目标活动,“意图”为在FirstActivity这个活动的基础上打开SecondActivity这个活动
startActivity(intent);//启动活动
}
});
使用这种方式来启动活动,Intent的“意图”非常明显,因此我们称之为显示Intent。
使用隐式Intent
隐式Intent不同于显式Intent,他不明确指定我们想要启动的活动,而是指定一些抽象的action和category,然后交给系统去分析这个intent并帮我们决定启动哪个活动。
此时有两个活动FirstActivity和SecondActivity,在AndroidManifest.xml为SecondActivity添加action和category标签代码:
<activity android:name=".SecondActivity"
android:launchMode="singleInstance">
<intent-filter>
<action android:name="com.example.activitytest.ACTION_START"/>
<category android:name="android.intent.category.DEFAULT" />
<category android:name="com.example.activitytest.MY_CATEGORY"
/>
</intent-filter>
</activity>
只有当< action>和< category>中的内容同时能够匹配上intent中指定的action和category时,SecondActivity这个活动才能响应该intent
此时为intent设置< action>和< category>,FirstActivity中的按钮点击事件,代码:
button1.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
Intent intent = new Intent("com.example.activitytest.ACTION_START");
intent.addCategory("com.example.activitytest.MY_CATEGORY");
startActivity(intent);
}
});
特别说明:每个Intent中只能指定一个action,但却能指定多个category
添加category的方法:
调用Intent中的addCategory()方法添加一个category。
不是说< action>和< category>同时匹配上才能响应吗?怎么没有指定category:android.intent.category.DEFAULT呢?因为它是一种默认的category,在调用startActivity()方法时会自动将这个category添加到intent中。
使用Intent向下一个活动传递数据
Intent中提供了一系列putExtra()方法的重载,可以把我们想要传递的数据暂存在Intent中,启动另一个活动后,只需要把这些数据再从Intent中取出即可。
比如有两个活动FirstActivity和SecondActivity,现在想要将FirstActivity的一个字符串传递给SecondActivity。
首先在FirstActivity中使用显式Intent将SecondActivity启动,并通过putExtra()方法传递一个字符串。
button1.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
String data = "Hello SecondActivity";
Intent intent = new Intent(FirstActivity.this,SecondActivity.class);//显式Intent启动活动
intent.putExtra("extra_data", data);将FirstActivity中的一个字符串传递给 SecondActivity
startActivity(intent);
}
});
注意:putExtra接收两个参数,第一个参数是键,用于后面从Intent中取值,第二个参数是传递的数据
然后在SecondActivity中将数据取出
public class SecondActivity extends BaseActivity {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.second_layout);
Intent intent = getIntent();
String data = intent.getStringExtra("extra_data");
Log.d("SecondActivity",data);
}
}
首先通过getIntent() 可以获取启动SecondActivity的intent,然后调用intent中的getStringExtra() 方法传入相应的键值以获取数据。因为这里传递的是字符串所以使用getStringExtra(),如果传递整型数据则使用getIntExtra(),布尔型则使用getBooleanExtra()。
返回数据到上一个活动
返回上一个活动只需要按一下back键即可,但是并没有一个用于启动活动的Intent来传递数据。Activity中还有一个startActivityForResult()方法是用于启动活动的,并且这个方法期望在活动销毁的时候返回一个结果给上一个活动。
startActivityForResult()方法接收两个参数,第一个参数还是Intent,第二个参数是请求码,用于在之后的回调中判断数据的来源,请求码只要是唯一值就行。
在FirstActivity中启动活动SecondActivity,代码如下:
button1.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
startActivityForResult(intent, 1);//请求码
}
});
在SecondActivity中给按钮注册点击事件,并在点击事件中添加返回数据的逻辑,代码如下:
button2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent();
intent.putExtra("data_return","Hello FirstActivity");
setResult(RESULT_OK, intent);
finish();
}
});
此时的Intent没有指定“意图”,仅仅使用来传递数据的。
setResult() 方法是专门向上一个活动返回数据的,它接收两个参数,第一个参数用于向上一个活动返回处理结果,一般只使用RESULT_OK或RESULT_CANCELED第二个参数则把带有数据的Intent传递回去,然后调用finish()方法销毁SecondActivity活动。
在SecondActivity活动被销毁之后会回调上一个活动的onActivityResult() 方法,因此我们需要在FirstActivity中重写 onActivityResult()方法来得到返回的数据,代码如下:
@Override
protected void onActivityResult(int requestCode, int resultCode, 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;
default:
}
}
onActivityResult()方法带有三个参数,第一个参数是我们启动活动时传入的请求码第二个参数是我们在返回数据时传入的处理结果,第三个参数是携带数据的Intent。
注意:由于在一个活动中可能调用startActivityForResult()方法去开启很多不同的活动,每个活动返回的数据都会回调到onActivityResult()这个方法,因此我们首先检查requestCode 的值判断数据来源(请求码),然后通过resultCode判断处理结果是否成功(RESULT_OK 或RESULT_CANCELED),最后从data中取值并打印。
如果需要按下back从SecondActivity回到FirstActivity并返回数据,就必须在SecondActivity重写onBackPressed()方法,代码如下:
@Override
public void onBackPressed() {//按下back则会执行
Intent intent = new Intent();
intent.putExtra("data_return","Hello FirstActivity");
setResult(RESULT_OK, intent);
finish();
}
启动活动的最佳写法
假设SecondActivity中需要用到两个字符串参数,在启动SecondActivity时必须传递过来,那么我们很容易在FirstActivity写出代码:
显式Intent:
Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
intent.putExtra("param1","data1");
intent.putExtra("param2","data2");
startActivity(intent);
最佳:
public class SecondActivity extends BaseActivity {
public static void actionStart(Context context, String data1, String data2) {
Intent intent = new Intent(context,SecondActivity.class);
intent.putExtra("param1","data1");
intent.putExtra("param2","data2");
context.startActivity(intent);//此时在活动SecondActivity,所以前面要加上FirstActivity的上下文
}
}
FirstActivity中调用SecondActivity中的actionStart()方法开启SecondActivity活动
button1.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
SecondActivity.actionStart(FirstActivity.this, "data1", "data2");//类名.调用
}
});