uni小小白
uni小小白
  • 发布:2020-08-25 23:32
  • 更新:2020-08-26 14:40
  • 阅读:751

plus.android.newObject创建的原生按钮,要怎么监听它的click事件呢

分类:uni-app

使用 plus.android.newObject 创建原生按钮

let mainActivity = plus.android.runtimeMainActivity();  
let mainContext = plus.android.invoke(mainActivity, "getApplicationContext");  
// 创建原生 button  
let nBtn = plus.android.newObject('android.widget.Button', mainContext);  
// 如何在uni中监听这个按钮的click事件呢?

我的尝试:Android中可以通过设置按钮的监听器来实现,我参考着试了下边的方法,但碰到了问题

  • Android里边的实现方法:自定义一个监听器,实现View.OnClickListener接口

    class MyListener implements View.OnClickListener{  
    @Override  
    public void onClick(View view) {  
        //处理逻辑  
    }  
    }  
    // 按钮设置监听器  
    btn.setOnClickListener(new MyListener());
  • uni-app中碰到的问题

    plus.android.invoke(btn, 'setOnClickListener', 监听器实例对象);    // 设置监听器,未完成  
    // 这个监听器要怎么创建呢...
2020-08-25 23:32 负责人:无 分享
已邀请:
DCloud_heavensoft

DCloud_heavensoft

这方法不太对劲,button应该是前端来做,点击button可以给原生发消息

  • uni小小白 (作者)

    我其实是想做一个桌面悬浮按钮,就是在app退到后台后,仍能悬浮在桌面或其他app上的按钮,然后在uni中监听这个按钮的点击事件。在uni前端创建的按钮好像都是不能挂载app之外的层级的…但是我又不想写android原生插件。所以想用plus.andriod来间接在原生上创建更底层的按钮,不知道可不可行。目前是能实现在uni中直接创建一个桌面悬浮按钮,但是不知道怎么在uni中监听这个按钮的点击事件…不知道有没有什么解决方案呢

    2020-08-26 21:29

  • uni小小白 (作者)

    // 成功在桌面创建悬浮按钮,但无法点击    
    let mainActivity = plus.android.runtimeMainActivity();
    let mainContext = plus.android.invoke(mainActivity, "getApplicationContext");

    let AndroidContext = plus.android.importClass('android.content.Context');
    let AndroidWindowManager = plus.android.importClass('android.view.WindowManager');
    let windowManager = plus.android.invoke(mainContext, "getSystemService",AndroidContext.WINDOW_SERVICE);
    let layoutParams = new AndroidWindowManager.LayoutParams(); // 用于控制控件设置样式
    if(windowManager !== null){
    // 控件大小
    layoutParams.plusSetAttribute('width', 200);
    layoutParams.plusSetAttribute('height', 200);

    // 设置 type: 控件设置为悬浮窗类型,允许在其他应用和窗口悬浮
    let AndroidBuild = plus.android.importClass('android.os.Build');
    if(AndroidBuild.VERSION.SDK_INT >= AndroidBuild.VERSION_CODES.O){
    // 26及以上必须使用TYPE_APPLICATION_OVERLAY
    layoutParams.plusSetAttribute('type', AndroidWindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY);
    }
    else{
    layoutParams.plusSetAttribute('type', AndroidWindowManager.LayoutParams.TYPE_PHONE);
    }
    // 设置flags
    // FLAG_NOT_TOUCH_MODAL: 使用了此标识,可以将点击事件传递到悬浮窗以外的区域,也就是非按钮区域可以正常点击
    layoutParams.plusSetAttribute('flags', AndroidWindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL)

    // 背景设置成透明
    let AndroidPixelFormat = plus.android.importClass('android.graphics.PixelFormat');
    layoutParams.plusSetAttribute('format', AndroidPixelFormat.TRANSPARENT)

    // 获取屏幕的宽和高,让控件在屏幕右侧中间悬浮
    let screenHeight = plus.screen.height;
    let screenWidth = plus.screen.width;
    layoutParams.plusSetAttribute('x', screenWidth)
    layoutParams.plusSetAttribute('y', screenHeight / 2)
    let AndroidGravity = plus.android.importClass('android.view.Gravity');
    layoutParams.plusSetAttribute('gravity', AndroidGravity.TOP)

    // 新建一个按钮
    let btn = plus.android.newObject('android.widget.Button', mainContext);
    plus.android.invoke(btn, "setText", "悬浮按钮");

    // 添加到屏幕上
    plus.android.invoke(windowManager, 'addView', btn, layoutParams);

    // 改变按钮位置
    let x = screenWidth;
    let interval = setInterval(()=>{
    layoutParams.plusSetAttribute('x', x-=100);
    plus.android.invoke(windowManager, 'updateViewLayout', btn, layoutParams);
    }, 500)

    // 关闭按钮
    setTimeout(()=>{
    clearInterval(interval);
    plus.android.invoke(windowManager, 'removeView', btn);
    }, 10000)

    // 要怎么在uni中监听这个按钮的点击事件嘞?
    }

    2020-08-26 22:10

该问题目前已经被锁定, 无法添加新回复