【Android】《第一行代码—Android》第二章总结

来源:互联网 发布:俄法战争 知乎 编辑:程序博客网 时间:2024/05/07 07:59

隐藏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_SHORTToast.LENGTH_LONG运行就可以看到效果咯。

在Activity中使用Menu

需要在MainActivity类中重写onCreateOptionsMenu()方法

@Overridepublic 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中添加ActivityremoveActivity(Activity activity)方法从ActivityCollector中移除ActivityfinishAll()方法先遍历集合中存储的每一个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")
0 0
原创粉丝点击