隐藏Acitivity标题栏
如果觉得标题栏相当占用屏幕空间,隐藏Activity
的标题栏只需在MainActivity
类中的onCreate()
方法中添加requestWindowFeature(Window.FEATURE_NO_TITLLE)
代码即可。
再次运行Android程序,就会看到,此时标题栏已经被隐藏掉了。
在Activity中使用Toast
Toast
是Android提供的一种非常好的提醒方式,在程序中可以使用他们将一些短小的信息通知给用户。这些信息会在一段时间后自动消失,并且不会太占用屏幕空间。
首先创建一个Button
按钮
Button button1 = (Button) findViewById(R.id.button_1);
这里通过findViewById(R.id.button_1)
获取在布局文件中定义的Button
元素。findViewById()
方法返回的是一个View
对象,我么需要把他向下转型成Button
对象。得到按钮的实例对象后,调用setOnClickListener()
方法为按钮注册一个监听器
button1.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(MainActivity.this, "you clicked button 1", Toast.LENGTH_SHORT )
}
});
点击按钮时候就会执行监听器中的onClick()
方法。因此弹出Toast
的功能要在onClick()
方法中编写咯。Toast
的用法非常简单,通过静态的makeText()
方法创建一个Toast
对象,然后调用show()
方法把Toast
显示出来。这里需要注意,makeText()
方法需要传入三个参数,第一个参数是Context
,也就是Toast
要求的上下文环境,第二个参数是Toast
显示的文本内容,第三个参数是Toast
显示的时长,有两个内置常量可供选择:Toast.LENGTH_SHORT
、Toast.LENGTH_LONG
运行就可以看到效果咯。
在Activity中使用Menu
需要在MainActivity类中重写onCreateOptionsMenu()
方法
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflayer().inflater(R.menu.main, menu );
return true;
}
getMenuInflayer()
可以得到MenuInlater
对象,在调用它的inflater()
方法就可给当前Activity创建菜单了。inflater()
方法接受两个参数,第一个擦拿书用于指定通过哪个资源文件来创建菜单,这里传入R.menu.main
,第二个参数用于指定我们的菜单项将添加到哪个Menu
对象中,这里直接用onCreateOptionsMenu()
方法传入的参数menu
。然后给这个方法返回true
,表示允许创建的菜单显示出来,如果返回了false
, 则创建的菜单将不能显示。
光创建菜单没有任何实际意义,我们还要为菜单定义响应事件,在MainActivity
类中重写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;
default :
}
return true;
}
在onOptionsItemSelected()
方法中,调用item.getItemId()
来判断点击的是哪个菜单项,然后给每个菜单项加入自己的处理逻辑,这里我们就弹出Toast
。
销毁一个Actiivty
button1.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
});
使用Intent在Activity间穿梭
Intent
有两种构造器,第一种接收传入两个参数,分别为:启动Intent
的上下文环境、目标活动。即为显式Intent
。第二种接收传入一个action
活动作为参数,这个action
活动以字符串类型传入。即为隐式Intent
。
- 显式使用
Intent(MainActivity.this, OtherActivity,class)
代码如下:
Button button1 = (Button) findViewById(R.id.button_1);
button1.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
Intent intent = new Intent(FirstActivity.this, SecondActivity.class );
startActivityForResult(intent, 1);
}
});
- 隐式使用
Intent("action")
代码如下
Button button1 = (Button) findViewById(R.id.button_1);
button1.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
Intent intent = new Intent("com.example.activitytest.ACTION_START");
startActivityForResult(intent);
}
});
Activity最佳实践
实际开发中遇到的程序肯定不会只有几个简单的Activity
,特别是面对那么多Activity
,加上不是自己开发的时候,经常会纳闷当前是在哪个Activity
,下面介绍的这个小技巧,可以帮助你快速的判断出程序当前在哪个Activity
。
首先常见BaseActivity
继承Activity
,然后重写onCreate()
方法,代码如下
package com.example.activitytest;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
public class BaseActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d("BaseActivity", getClass().getSimpleName());
ActivityCollector.addActivity(this);
}
@Override
protected void onDestroy() {
super.onDestroy();
ActivityCollector.removeActivity(this);
}
}
在onCreate()
方法中,通过getClass().getSimpleName()
获取了当前实例的类名,并通过Log.d("BaseActivity", getClass().getSimpleName())
方法在日志中打印出来。接下来,让所有的Activity
都继承BaseActivity
,它们不再直接继承Activity
,但是它们仍然间接继承了Activity
中的所有特性。重新运行程序,就可以打印出当前所在Activity
的类名。
<——————————-分割线——————————————–>
不知道你有没有发现,当你在手机浏览器中打开很多网页时,要想退出程序是不是要按很多次的返回键?有没有觉得这样很麻烦?你可能会说直接按下Home键就OK,但你可能不知道,按Home键只是把程序挂起,并没有真正退出程序。那我们该怎样实现按一下Back键就可以直接退出程序呢?
我们设想有一个专门负责Activity
管理的ActivityCollector
集合类,每创建一个新的Activity
,就把它添加到ActivityCollector
中来,每关闭一个Activity
就把它从ActivityCollector
中移除,要想关闭打开的所有Activity
,就直接把ActivityCollector
中存储的所有Activity
全部移除,
这样设想,我们的功能是不是实现了呢?
先来创建一个ActivityCollector
类作为Activity
管理器,代码如下
package com.example.activitytest;
import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
public class ActivityCollector {
public static List<Activity> activities = new ArrayList<Activity>();
public static void addActivity(Activity activity) {
activities.add(activity);
}
public static void removeActivity(Activity activity) {
activities.remove(activity);
}
public static void finishAll() {
for (Activity activity : activities ) {
if ( !activity.isFinishing()) {
activity.finish();
}
}
}
}
其中addActivity(Activity activity)
方法向ActivityCollector
中添加Activity
、 removeActivity(Activity activity)
方法从ActivityCollector
中移除Activity
、finishAll()
方法先遍历集合中存储的每一个Activity
,得到每个Activity
调用activity.finish()
方法,将集合中的所有Activity
都结束掉。
所以在创建新的Activity
的时候,只需要重写onCreate()
方法,在其中添加ActivityCollector.addActivity(this)
,重写onDestroy()
方法,添加ActivityCollector.addActivity(this)
即可。代码如下
package com.example.activitytest;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
public class BaseActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d("BaseActivity", getClass().getSimpleName());
ActivityCollector.addActivity(this);
}
@Override
protected void onDestroy() {
super.onDestroy();
ActivityCollector.removeActivity(this);
}
}
如果想直接一键退出所有的Activity
并结束程序,只需要修改该Activity
界面按钮的监听器点击事件的代码即可。代码如下
Button button = (Button) findViewById(R.id.button);
button.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
ActivityCollector.finishAll();
}
其中ActivityCollector.finishAll()
方法,负责关闭所有存活的Activity
。
<——————————-分割线——————————————–>
还有一种情况是,当你想启动某个Activity
时,你却并不清除启动这个Activity
需要传递那些数据?其实换一种写法,就可以轻松帮你解决上面的问题。我们现在actionStart(Context context, String data1, String data2 )
方法中构建一个Intent
,需要存储的数据通过String data1, String data2
这两个形参传递进来,然后又把他们存储到Intent,最后调用context.startActivity(intent)
方法来启动Activity
,一目了然。代码如下
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);
}
然后启动Activity
只需要一行代码,在onClick()
点击事件中添加如下代码
Activity.actionStart(DemoActivity.this, "data1", "data2")