安卓——消息提示Toast——消息通知Notification——菜單Menu(上下文菜單使用了系統的剪切板)——重寫按鍵方法

1.消息提示,如下圖

在這裏插入圖片描述

        Toast toast = Toast.makeText(MainActivity.this,//MainActivity的當前對象
                "輸入的信息不合法",//提示消息
                Toast.LENGTH_LONG);//持續時間
        //修改Toast顯示的相對位置
        toast.setGravity(Gravity.CENTER,0,0); // 第二個參數和第三個參數爲x,y偏移量
        //顯示
        toast.show();

2.消息通知Notification

在這裏插入圖片描述

需要的步驟有7步:

  1. 獲取通知管理器服務
  2. 創建通知渠道
  3. 生成渠道 => 讓渠道可以使用createNotificationChannel
  4. 創建通知構造器
  5. 設置構造器各項屬性
  6. 通過通知構造器創建通知
  7. 發送通知

需要注意的是版本大於26纔可以用含有channel渠道的builder創建方法

//    @RequiresApi(api = Build.VERSION_CODES.O)
    private void sendNotification(){
        //獲取通知管理器服務(NotificationManager);屬於一種系統服務
        NotificationManager notificationManager = (NotificationManager) getSystemService(
                Context.NOTIFICATION_SERVICE);
        //創建通知渠道(NotificationChannel)
        NotificationChannel channel = null;
        Notification.Builder builder;
        //當前程序運行所在的手機系統的API版本是否大於等於26
        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
            channel = new NotificationChannel("channelId",//渠道ID
                    "重要的通知渠道",//渠道的名稱,給用戶看,手機中可以查到這個名字
                    NotificationManager.IMPORTANCE_LOW);//重要級別,不同的重要級別決定了通知顯示的行爲
            notificationManager.createNotificationChannel(channel);
            //創建通知構造器(Notification.Builer);
            builder = new Notification.Builder(this,"channelId");
        }else {
            builder = new Notification.Builder(this);
        }
        builder.setSmallIcon(R.drawable.icon)//設置小圖標
                .setContentTitle("這是通知的標題")//設置標題
                .setContentText("這是通知的內容")//通知內容
                //BitmapFactory創建Bitmap對象的工廠類,定義了一些方法將不同類型的圖片轉換成Bitmap對象
                .setLargeIcon(BitmapFactory.decodeResource(getResources(),R.drawable.baidu));//設置大圖標
        //通過通知構造器創建通知(Notification);
        Notification notification = builder.build();
        //調用通知管理器服務發送通知。
        notificationManager.notify(1, notification);
    }


3.菜單Menu

菜單分爲兩種

  1. 選項菜單
  2. 上下文菜單
    在這裏插入圖片描述在這裏插入圖片描述

選項菜單:只需要重寫兩個方法

	@Override
    //創建選項菜單時調用
    public boolean onCreateOptionsMenu(Menu menu) {
        //加載菜單資源文件
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.options_menu, menu); // 第一個參數是佈局文件
        return super.onCreateOptionsMenu(menu);
    }
    
    @Override
    //點擊選項菜單中的選項時調用
    public boolean onOptionsItemSelected(@NonNull MenuItem item) {
        switch (item.getItemId()){
            case R.id.options1:
                Toast.makeText(this,"點擊了選項一",Toast.LENGTH_SHORT).show();
                break;
            case R.id.options2:
                Toast.makeText(this,item.getTitle(),Toast.LENGTH_SHORT).show();
                break;
            case R.id.sub_options1:
                break;
        }
        return super.onOptionsItemSelected(item);
    }

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:title="選項一" android:id="@+id/options1">
        <!--選項一的子菜單-->
        <menu>
            <item android:title="子菜單選項一" android:id="@+id/sub_options1"></item>
            <item android:title="子菜單選項二" android:id="@+id/sub_options2"></item>
        </menu>
    </item>
    <item android:title="選項二" android:id="@+id/options2"></item>
    <!--給菜單選項分組-->
    <group android:id="@+id/group1" android:checkableBehavior="all">
        <item android:id="@+id/gro_options1" android:title="分組選項一"></item>
        <item android:id="@+id/gro_options2" android:title="分組選項二"></item>
    </group>
</menu>

上下文菜單:重下兩個方法併爲其註冊

PS:因爲是上下文菜單,需要某個組件來觸發,例如按住某段信息可以彈出一系列操作(複製粘貼等,所以需要註冊)

//創建上下文菜單時調用
    @Override
    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
        super.onCreateContextMenu(menu, v, menuInfo);
        //加載菜單資源文件
        getMenuInflater().inflate(R.menu.context_menu,menu);
    }

    //點擊上下文菜單選項時調用
    @Override
    public boolean onContextItemSelected(@NonNull MenuItem item) {
        //獲取剪切板的系統服務
        ClipboardManager manager = (ClipboardManager) getSystemService(
                Context.CLIPBOARD_SERVICE);
        switch (item.getItemId()){
            case R.id.copy://複製
                String content = tvContent.getText().toString();
                //將數據封裝爲ClipDate類型
                ClipData data = ClipData.newPlainText("label",content);
                //將數據放入剪切板
                manager.setPrimaryClip(data);
                break;
            case R.id.paste://粘貼
                //將數據從剪切板取出
                ClipData pasteData = manager.getPrimaryClip();
                //將字符串取出
                String result= pasteData.getItemAt(0).getText().toString();
                //顯示到EditText
                etContent.setText(result);
                break;
        }
        return super.onContextItemSelected(item);
    }
    registerForContextMenu(tvContent); // 寫在onCreate裏面,tvContent爲組件
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:title="複製" android:id="@+id/copy"></item>
    <item android:title="粘貼" android:id="@+id/paste"></item>
</menu>

附帶一個按鍵觸發方法

    @Override
    //按下任意按鍵時會自動調用
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        //判斷用戶連續兩次點擊返回按鈕,時間間隔小於2s時,退出程序
        if (keyCode == KeyEvent.KEYCODE_BACK) {//判斷是否點擊了返回按鈕
            if ((System.currentTimeMillis() - exitTime) > 2000){
                Toast.makeText(this,
                        "再次點擊返回按鈕退出當前程序",
                        Toast.LENGTH_SHORT).show();
                exitTime = System.currentTimeMillis();//獲取當前時間的毫秒數
            }else {
                this.finish();//時間間隔小於2s,退出程序
            }
        }
        return true;//處理完鍵盤按下事件
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章