在活动中使用Toast(这里只简单介绍和Toast的使用)
Toast是Android系统提供的一种提醒方式,可以使用它发送一些信息提示给用户,一段时间后会自动消失,不占用屏幕空间。
使用案例:定义一个触发点,例如在之前建立的活动中添加一个按钮,重写按钮的点击事件弹出一个Toast。在onCreate()中添加如下代码:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<Button
android:id="@+id/button"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Button" />
</LinearLayout>
上述代码中可以看出定义了一个按钮,按钮的id="@+id/button",这里有一点要注意在定义id的时候有三种形式,表现的含义也不一样:
- android:id="@android:id/tabhost" 调用系统内部的的id
- android:id="@+id/button" 定义一个新的id
- android:id=@id/button 使用一个已经存在的id号引用(跟第一个不同,这里引用的不是系统的)
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.first_layout);
//获取到按钮
Button button1=(Button)findViewById(R.id.button);
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//Toast用法
Toast.makeText(MainActivity.this,"You clicken Button1",Toast.LENGTH_SHORT).show();
}
});
}
上述java代码中使用了一个回调机制实现了一个点击事件。这里的重点在Toast的时候,回调的具体机制可以去看源码,后面的自定义控件中会涉及到。andoid监听事件的回调机制可以参考这篇博客:点击打开链接
在活动中使用Menu
要创建选项菜单,首先需要定义一个菜单的布局,查看res目录下是否有menu这个文件夹,没有的就新建一个,在这个文件夹下面添加一个布局。
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/add_item"
android:title="Add"/>
<item android:id="@+id/removr_item"
android:title="Remove"/>
</menu>
然后在使用Menu的活动重写onCreateOptionsMenu()
//创建Menu
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main,menu);
return true;
}
//监听Menu的选中事件
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()){
case R.id.add_item:
Toast.makeText(this,"You clicken Add",Toast.LENGTH_SHORT).show();
break;
case R.id.removr_item:
Toast.makeText(this,"You clicked Remove",Toast.LENGTH_SHORT).show();
break;
default:
}
return true;
}
在活动中使用Intent
在android中提供了Intent机制来协助应用间的交互与通讯,Intent负责对应用中一次操作的动作、动作涉及数据、附加数据进行描述,android则根据此Intent的描述,负责找到对应组件,将Intent传递给调用的组件,并完成组件的调用。Intent不仅可用于应用程序之间,也可yongyu用于应用程序内部Activity/Service之间的交互。因此Intent在这里起着一个媒体中介的作用,专门提供组件互相调用的相关信息,实现调用者之间的解耦。
显示启用活动的方法:构建一个Intent,传入MainActivity.ths作为上下文,传入secondActivity.class作为活动目标。
//显式启用活动
Intent intent = new Intent(MainActivity.this,secondActivity.class);
startActivity(intent);
隐式启用活动的方法:
AndroidMainfes.xml中定义某个Activity的intent-fliter
<activity android:name=".secondActivity">
<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>
//隐式启用活动
Intent intent=new Intent("com.example.activitytest.ACTION_START");
intent.addCategory("com.example.activitytest.MY_CATEGORY");
startActivity(intent);
隐式启动活动在启动的时候是不明确的,需要匹配系统或者AndroidMainfes.xml中的intent-fliter,只有action和category完全匹配时才会启动。
隐式启动不仅可以启动自己的Activity,还可以启动其他应用Activity:
//隐式启用活动更多用法---调用本地浏览器浏览网页
Intent intent=new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("http://www.baidu.com"));
startActivity(intent);
//隐式启用活动更多用法---调用系统拨号界面
Intent intent=new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("tel:10086"));
startActivity(intent);
活动之间传递数据(向下一个活动传递数据)
在启动活动时传递数的思路很简单,Intent中提供了一系列putExtra()方法的重载,可以把我们想要传递的数据暂存在Intent中,启动了另一个活动后,只需要把这些数据从Intent中取出。
//向下一个活动传递数据
String data="Hello SecondActivity";
Intent intent=new Intent(MainActivity.this,secondActivity.class);
intent.putExtra("extra_data",data);
startActivity(intent);
//接收上一个活动传递过来的数据
Intent intent=getIntent();
String data=intent.getStringExtra("extra_data");
Log.d("SecondActivity",data);
活动之间传递数据(返回数据给上一个活动)
在Activity中还有一个starActivityForResult()方法也是用于启动活动,这个方法在活动销毁的时候能够返回一个结果给上一个活动。
starActivityForResult()方法接收两个参数,第一个参数是Intent,第二个参数是请求码,用于回调中标识返回数据的来源。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.first_layout);
//创建menu
//获取到按钮
Button button1=(Button)findViewById(R.id.button);
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent=new Intent(MainActivity.this,secondActivity.class);
startActivityForResult(intent,1);
}
});
}
//重写页面返回回调事件
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode){
case 1:
if (resultCode==RESULT_OK){
String returnData=data.getStringExtra("data_return");
Log.d("MainActivity",returnData);
}
}
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.second_layout);
Button button=(Button)findViewById(R.id.button2);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent=new Intent();
intent.putExtra("data_return","Hello MainActivity");
setResult(RESULT_OK,intent);
finish();
}
});
}
//重写返回按钮事件
@Override
public void onBackPressed() {
Intent intent=new Intent();
intent.putExtra("data_return","Hello MainActivity");
setResult(RESULT_OK,intent);
finish();
}