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

隐藏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()方法

@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中添加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")


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值