Android—探究活动1
活动
活动是一种可以包含用户界面的组件,主要用于和用户交互。
1.1.1 Toast
可以使用它将一些小信息通知给用户,这些信息会在一段时间后自动消失,并且不会占用任何屏幕空间。
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button = (Button)findViewById(R.id.Button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Toast.makeText(MainActivity.this,"you click",Toast.LENGTH_SHORT).show();
}
});
}
1.通过findViewById()方法获取到在布局文件中定义的元素,返回View对象,这里向下转型转成Button对象,得到按钮实例后,通过调用setOnClickListener()方法为按钮注册一个监听器,点击按钮就会执行监听器中的onClick()方法,所以,弹出Toast的功能要在
onClick()方法中编写。
2.Toast通过静态方法makeTest()创建一个Toast对象,然后调show()显示出来,传三个参数,第一个Context,也就是Toast要求的上下文,第二个是Toast显示的文本内容,第三个是时长。
1.1.2 Menu
在res目录下新建一个menu的文件夹,右击res目录,New,Directory,输入文件夹名menu,接着,在这个文件夹下新建一个名叫main的菜单文件,右击menu文件夹,New,Menu resource file,文件名输入main,点击ok,在main.xml中添加代码:
<item
android:id="@+id/add_item"
android:title="Add"/>
<item
android:id="@+id/remove_item"
android:title = "Remove"/>
</menu>
item标签用来创建具体的某一个菜单项,然后通过android:id给这个菜单项指定一个唯一的标识符,通过android:title给这个菜单指定一个名称。
然后在MainActivity中重写**onCreateOptionsMenu()**方法
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main,menu);
return true;
}
getMenuInflater()方法能获得一个MenuInflater的对象,再调用它的inflate()方法gei当前活动创建菜单,第一个参数指定通过哪一个资源文件来创建菜单,R.menu.main,第二个参数指定我们的菜单项将添加到哪一个Menu对象中,返回true,表示允许创建的菜单显示出来。
再定义菜单响应事件
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.add_item:
Toast.makeText(this, "you click Add", Toast.LENGTH_SHORT).show();
break;
case R.id.remove_item:
Toast.makeText(this, "you click remove", Toast.LENGTH_SHORT).show();
break;
default:
break;
}
return true;
}
1.1.3销毁一个活动
点击Back键
修改监听器的代码,finish()方法。
1.2使用Intent在活动之间穿梭
Intent是android程序中各组件之间进行交互的一种重要方式,不仅可以指明当前组件想要执行的动作,还可以在不同组件之间传递数据,一般被用于启动活动,启动服务,发送广播等场景。
1.2.1显式Intent
Intent(),两个参数,Context要求提供一个启动活动的上下文,第二个参数Class是指定想要启动的活动,**startActivite()**方法,专门用于启动活动,接受一个Intent参数
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(MainActivity.this,SecondActivity.class);
startActivity(intent);
}
});
1.2.2隐式活动
指定了一系列更为抽象的action和category等信息,然后交由系统去分析这个Intent,并帮我们找出合适的活动去启动。
<activity android:name=".SecondActivity">
<intent-filter>
<action android:name="com.example.activitytest.ACTION_START"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</activity>
在activity标签下配置intent-filter的内容,可以指定当前活动能够响应的action和category,action标签中指明了当前活动可以响应com.example.activitytest.ACTION_START这个action,category标签则包含了一些附加信息,更精确的指明了当前活动能够响应的Intent中还可能带有category。只有action和category中的内容同时匹配上Intent中指定的action和category时,活动才能响应。每个Intent中能指定一个action,但却能指定多个category。
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent("com.example.activitytest.ACTION_START");
startActivity(intent);
}
});
1.2.3向下一个活动传递数据
Intent提供了一系列**putExtra()**方法的重载,可以把我们想要传递的数据暂存在Intent中,启动另一个活动,再从Intent中取出来。
例如:想把MainActivity中的数据传到SecondActivity中。
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
String data = "Hello SecondActivity";
Intent intent = new Intent(MainActivity.this,SecondActivity.class);
intent.putExtra("extra_data",data);
startActivity(intent);
}
});
SecondActivity中:
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);
}
putExtra()方法接受两个参数,第一个参数是键,用于从后面Intent中取值,第二个参数是真正要传递的数据。
在SecondActivity中将传递的数据取出来,通过**getIntent()方法获取到启动SecondActivity的Intent,然后调用getStringExtra()**方法传入相应的键值,就得到传递的数据了。(还有getIntExtra,getBooleanExtra)
1.2.4返回数据给上一个活动
startActivityForResult()方法,这个方法期望在活动销毁的时候能够返回一个结果给上一个活动,接受两个参数,Intent和请求码,请求码用于在之后的回调中判断数据的来源。
public void onClick(View view) {
Intent intent = new Intent(MainActivity.this,SecondActivity.class);
startActivityForResult(intent,1);
}
这里使用了startActivityForResult()方法来启动SecondActivity,请求码只要是一个唯一值就可以。
Button button2 = (Button) findViewById(R.id.button_2);
button2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent();
intent.putExtra("data_return","Hello MainActivity");
setResult(RESULT_OK,intent);
finish();
}
});
在SecondActivity中给按钮点击注册事件,并在点击事件中添加返回数据的逻辑。构建一个Intent,仅用于传递数据,要把传递的数据存放在Intent中,然后调用setResult()方法,这个方法专门用于向上一个活动返回数据,setResult()方法接受两个参数,第一个参数用于向上一个活动返回处理结果,一般使用RESUT_OK或RESULT_CANCELED,第二个参数把带有数据的Intent传递回去,然后调用finish()方法来销毁当前活动。
因为我们使用startActivityForResult()方法来启动SecondActivity,在SecondActivity被销毁之后会回调上一个活动的onActivityResult()方法,所以我们需要在MainActivity中重写这个方法来得到返回的数据
@Override
protected void onActivityResult(int requestCode,int resultCode,Intent data){
switch (requestCode){
case 1:
if(resultCode==RESULT_OK){
String returnedData = data.getStringExtra("data_return");
Log.d("data_return",returnedData);
}
break;
default:
}
}
onActuivityResult()方法有三个参数,第一个requestCode,启动活动时传入的请求码,第二个resultCode,返回数据时传入的处理结果,第三个data,即携带着返回数据的Intent,我们先通过requestCode的值来判断数据来源,确定是从SecondActivity返回的之后,在检查resultCode的值来判断
处理结果是否成功,最后从data中取值并打印出来
补充:如果想通过back键返回,可以在SecondActivity中重写onBackPressed()
@Override
public void onBackPressed(){
Intent intent = new Intent();
intent.putExtra("data_return","Hello MainActivity");
setResult(RESULT_OK,intent);
finish();
}