Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android學習筆記二十之Toast吐司、Notification通知、PopupWindow彈出窗

Android學習筆記二十之Toast吐司、Notification通知、PopupWindow彈出窗

編輯:關於Android編程

Toast吐司

Toast吐司是我們經常用到的一個控件,Toast是AndroidOS用來顯示消息的一種機制,它與Dialog不同,Toast不會獲取到焦點,通常顯示一段時間之後就會自動消失,下面我們來介紹Toast的幾種常用方式:

第一種,默認顯示方式,也是最常用的方式:

 Toast.makeText(MainActivity.this, "這是默認的顯示方式", Toast.LENGTH_SHORT).show();

第二種,自定義設置位置的顯示方式:

Toast toast = Toast.makeText(MainActivity.this, "這是自定義顯示位置的效果", Toast.LENGTH_SHORT);
toast.setGravity(Gravity.CENTER_HORIZONTAL | Gravity.CENTER, 0, 0);
toast.show();

第三種,帶圖片顯示:

 Toast toast = Toast.makeText(MainActivity.this, "這是帶圖片的效果", Toast.LENGTH_LONG);
toast.setGravity(Gravity.CENTER_HORIZONTAL | Gravity.CENTER, 0, 0);
LinearLayout linearLayout = (LinearLayout) toast.getView();
ImageView imageView = new ImageView(MainActivity.this);
imageView.setImageResource(R.mipmap.ic_launcher);
linearLayout.addView(imageView, 0);
toast.show();

第四種,完全自定義顯示方式:

 LayoutInflater layoutInflater = getLayoutInflater();
View toastView = layoutInflater.inflate(R.layout.custom_toast, (ViewGroup) findViewById(R.id.ll_toast));
Toast toast = new Toast(MainActivity.this);
toast.setDuration(Toast.LENGTH_LONG);
toast.setGravity(Gravity.CENTER, 0, 0);
toast.setView(toastView);
toast.show();

布局文件代碼:








第五種,其他線程通過handler顯示:

new Thread(new Runnable() {
@Override
public void run() {
handler.sendEmptyMessage(1);
}
}).start();

public void showToast() {
    Toast.makeText(MainActivity.this, "這是來自其它線程的吐司", Toast.LENGTH_SHORT).show();
}
private Handler handler = new Handler() {
    @Override
    public void handleMessage(Message msg) {
        if (msg.what == 1) {
            showToast();
        }
        super.handleMessage(msg);
    }
};

實現效果圖:

最後附上Toast的國內鏡像API

Notification通知

  Notification是一種具有全局效果的通知,程序一般通過NotificationManager服務來發送Notification。在AndroidAPI3.0之前,推薦使用Notification.Builder構建一個消息,但是在3.0之後,推薦使用NotificationCompat.Builder構建。

下面我們介紹一下Notification的基本使用方法:

通知主要涉及到兩個類:

Notification類:通知信息類,它用於承載通知的內容,一般我們不直接構建這個對象,而是使用它的一個內部類NotificationCompat.Builder來實例化一個對象(Android3.0之下使用Notification.Builder),並設置通知的各種屬性,最後通過NotificationCompat.Builder.build()方法得到一個Notification對象。當獲得這個對象之後,可以使用NotificationManager.notify()方法發送通知。 NotificationManager類:是一個通知管理器類,這個對象是由系統維護的服務,是以單例模式獲得,所以一般並不直接實例化這個對象。在Activity中,我們直接傳入Context.NOTIFICATION_SERVICE就可以通過調用Activity.getSystemService(String)方法獲取NotificationManager對象。

通知設置的相關方法:

setContentTitle(CharSequence):設置標題,必須要設置 setContentText(CharSequence):設置內容,必須要設置 setSmallIcon(int):設置在接收到通知的時候頂部顯示的小圖標,必須要設置 setSubText(CharSequence):設置內容下面一小行的文字 setTicker(CharSequence):設置收到通知時在頂部顯示的文字信息 setLargeIcon(Bitmap):設置大圖標 setAutoCancel(boolean):用戶點擊Notification點擊面板後是否讓通知取消(默認不取消) setDefaults(int):向通知添加聲音、閃燈和振動效果的最簡單、 使用默認(defaults)屬性,可以組合多個屬性,Notification.DEFAULT_VIBRATE(添加默認震動提醒);Notification.DEFAULT_SOUND(添加默認聲音提醒);Notification.DEFAULT_LIGHTS(添加默認三色燈提醒);Notification.DEFAULT_ALL(添加默認以上3種全部提醒) setVibrate(long[]):設置振動方式 setLights(int argb, int onMs, int offMs):設置三色燈,參數依次是:燈光顏色, 亮持續時間,暗的時間 setSound(Uri):設置接收到通知時的鈴聲,可以用系統的,也可以自己設置 setOngoing(boolean):設置為ture,表示它為一個正在進行的通知 setProgress(int,int,boolean):設置帶進度條的通知 參數依次為:進度條最大數值,當前進度,進度是否不確定 如果為確定的進度條 setContentIntent(PendingIntent):PendingIntent和Intent略有不同,它可以設置執行次數, 主要用於遠程服務通信、鬧鈴、通知、啟動器、短信中,在一般情況下用的比較少 setPriority(int):設置優先級

使用Notification的步驟:

第一步:獲得一個NotificationManager對象, 第二步:創建一個通知欄的Builder構造類 第三步:對Builder進行相關的設置,通過用上面介紹的相關方法 第四步:調用Builder的build()方法為notification賦值 第五步:調用NotificationManager的notify()方法發送通知

注意:Android系統提供兩種取消通知的方法:一種是Notification自己維護,使用setAutoCancel()方法設置是否維護,傳遞一個boolean類型的數據。另外一種方式使用NotificationManager通知管理器對象來維護,它通過notify()發送通知的時候,指定的通知標識Id來操作通知,可以使用cancel(int)來移除一個指定的通知,也可以使用cancelAll()移除所有的通知。

下面我們通過實現一個簡單的例子來體驗Notification的用法:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    mContext = MainActivity.this;
    btn_default_notification = (Button) findViewById(R.id.btn_default_notification);
    btn_default_notification.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Intent intent = new Intent(mContext, DefaultActivity.class);
            PendingIntent pendingIntent = PendingIntent.getActivity(mContext, 0, intent, 0);
            NotificationManager notificationManager = (NotificationManager) MainActivity.this.getSystemService(NOTIFICATION_SERVICE);
            Notification.Builder builder = new Notification.Builder(MainActivity.this);
            builder.setSmallIcon(R.mipmap.ic_launcher);
            builder.setContentTitle("默認消息通知");
            builder.setContentText("我是默認顯示的消息,我進來了");
            builder.setWhen(System.currentTimeMillis());
            builder.setTicker("接受到一條信息");
            builder.setDefaults(Notification.DEFAULT_LIGHTS | Notification.DEFAULT_VIBRATE);
            builder.setAutoCancel(true);
            builder.setContentIntent(pendingIntent);
            if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN) {
                Notification notification = builder.build();
                notificationManager.notify(NOTIFICATION, notification);
            }

        }
    });
}

這裡的話就只放Java的代碼,其他的就不再設置了,也比較簡單。

照例附上Notification的國內鏡像API

PopupWindow彈出窗

PopupWindow這個類用來實現一個彈出框,PopupWindow可以加載任意內容的View,這個彈出框是懸浮在當前activity之上的。如果PopupWindow顯示了,那麼所有的事件都會被其攔截,除了home的之外,例如:一個PopupWindow彈出了,那麼你需要點擊手機上的退出鍵讓PopupWindow消失,然後Activity才會退出。

下面我們通過一個例子來體驗一下PopupWindow:

Activity代碼:

package com.example.popupwindow;

import android.graphics.drawable.ColorDrawable;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.PopupWindow;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {
private Button btn_show_pop;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    btn_show_pop = (Button) findViewById(R.id.btn_show_pop);
    btn_show_pop.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            initPop(view);
        }
    });
}

private void initPop(View view) {
    View popView = LayoutInflater.from(MainActivity.this).inflate(R.layout.pop_custom, null);
    Button btn_01 = (Button) popView.findViewById(R.id.btn_01);
    Button btn_02 = (Button) popView.findViewById(R.id.btn_02);
    Button btn_03 = (Button) popView.findViewById(R.id.btn_03);
    //初始化一個PopupWindow,第一個參數是加載的View,第二個參數是View的寬度,第三個參數是View的高度,第四個是是否獲取焦點
    final PopupWindow popupWindow = new PopupWindow(popView, ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT, true);
    //設置加載動畫
    popupWindow.setAnimationStyle(R.anim.pop_anim);
    //設置可以點擊空白處讓PopupWindow消失
    popupWindow.setOutsideTouchable(true);
    popupWindow.setTouchable(true);

    popupWindow.setTouchInterceptor(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View view, MotionEvent motionEvent) {
            System.out.println("touch");
            //這裡如果返回true的話,touch事件將被攔截
            return false;
        }
    });
    //設置背景顏色
    popupWindow.setBackgroundDrawable(new ColorDrawable(0x00ff0000));
    //設置PopupWindow顯示的位置,第一個參數是相對的View,第二個是X軸,第三個參數是Y軸
    //showAsDropDown(View anchor):相對某個控件的位置(正左下方),無偏移
    //showAsDropDown(View anchor, int xoff, int yoff):相對某個控件的位置,有偏移
    //showAtLocation(View parent, int gravity, int x, int y): 相對於父控件的位置(例如正中央Gravity.CENTER,下方Gravity.BOTTOM等),可以設置偏移或無偏移 PS:parent這個參數只要是activity中的view就可以了!
    popupWindow.showAsDropDown(view, 40, 0);
    btn_01.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Toast.makeText(MainActivity.this, "你點擊了水果", Toast.LENGTH_SHORT).show();
            popupWindow.dismiss();
        }
    });
    btn_02.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Toast.makeText(MainActivity.this, "你點擊了運動", Toast.LENGTH_SHORT).show();
            popupWindow.dismiss();
        }
    });
    btn_03.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Toast.makeText(MainActivity.this, "你點擊了吃飯", Toast.LENGTH_SHORT).show();
            popupWindow.dismiss();
        }
    });
}
}

布局文件代碼:


實現效果:

其中,PopupWindow有9種構造方法,如下圖所示:

我們常用就一下幾種:

public PopupWindow (Context context)
public PopupWindow(View contentView, int width, int height)
public PopupWindow(View contentView)
public PopupWindow(View contentView, int width, int height, boolean focusable)

 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved