Javascript 如何为DroidScript中的每个按钮创建具有不同值的回调函数?

Javascript 如何为DroidScript中的每个按钮创建具有不同值的回调函数?,javascript,android,droidscript,Javascript,Android,Droidscript,我尝试在Android上使用DroidScript制作一个小游戏。它使用Javascript 这是一场纸牌游戏。每个按钮代表牌组中的一张牌。当我触摸一个按钮时,我希望应用程序会显示带有我触摸过的按钮(卡)值的弹出窗口 function callbackFunction( value ) { app.ShowPopup(value); } //Called when application is started. function OnStart() { //Create a l

我尝试在Android上使用DroidScript制作一个小游戏。它使用Javascript

这是一场纸牌游戏。每个按钮代表牌组中的一张牌。当我触摸一个按钮时,我希望应用程序会显示带有我触摸过的按钮(卡)值的弹出窗口

function callbackFunction( value )
{
    app.ShowPopup(value);
}

//Called when application is started.
function OnStart()
{
    //Create a layout with objects vertically centered.
    lay = app.CreateLayout( "linear", "VCenter,FillXY" );   

    var deck = [1,2,3,4,5,6,7,8,9,10];

    for (var card of deck)
    {
        var btn = app.CreateButton(card.toString(), 0.3, 0.1);
        btn.SetOnTouch( callbackFunction );
        lay.AddChild(btn);
    }

    //Add layout to app.    
    app.AddLayout( lay );
}
但这不会输出任何内容,因为我无法将值传递给回调函数。因此,我尝试使用一系列按钮:

//Called when application is started.
function OnStart()
{
    //Create a layout with objects vertically centered.
    lay = app.CreateLayout( "linear", "VCenter,FillXY" );   

    // Deck array
    var deck = [1,2,3,4,5,6,7,8,9,10];

    // array of buttons
    var btns = [];

    for (var card of deck)
    {
        var btn = app.CreateButton(card.toString(), 0.3, 0.1);
        btns.push(btn);
        btns[btns.length - 1].SetOnTouch( 
            () => { app.ShowPopup(btns[btns.length - 1].GetText())} );
        lay.AddChild(btns[btns.length - 1]);
    }

    //Add layout to app.    
    app.AddLayout( lay );
}
问题是,每次我按下任何按钮,应用程序都会显示“10”。基本上,我希望调用回调,并将卡的值作为参数。所以我试了一下:

button.SetOnTouch( callbackFunction( button.GetText() );

但这不被接受为回调。我真的不知道如何将值传递到回调函数中。

您可以非常简单地引用按钮,方法如下:

function callbackFunction(){
 var button = this;
 var name = this.GetText();
}
// Deck array
    var deck = [1,2,3,4,5,6,7,8,9,10];

    // array of buttons
    var btns = [];

    for (var card of deck)
    {
        var btn = app.CreateButton(card.toString(), 0.3, 0.1);
        btns.push(btn);
        eval("btns["+(btns.length - 1)+"].SetOnTouch(function(){callbackFunction("+card.toString()+");} );");
        lay.AddChild(btns[btns.length - 1]);
    }

function callbackFunction(name){
  app.ShowPopup(name);
}
您还可以将自己的数据保存到按钮或任何类型的对象:

var deck = [1,2,3,4,5,6,7,8,9,10];

    for (var card of deck)
    {
        var btn = app.CreateButton(card.toString(), 0.3, 0.1);
        btn.SetOnTouch( callbackFunction );
        btn.name = card.toString();
        btn.index = deck.indexOf(card);
        lay.AddChild(btn);
    }
您可以使用数组保存按钮(最好使用我为您提供的第一个解决方案),方法如下:

function callbackFunction(){
 var button = this;
 var name = this.GetText();
}
// Deck array
    var deck = [1,2,3,4,5,6,7,8,9,10];

    // array of buttons
    var btns = [];

    for (var card of deck)
    {
        var btn = app.CreateButton(card.toString(), 0.3, 0.1);
        btns.push(btn);
        eval("btns["+(btns.length - 1)+"].SetOnTouch(function(){callbackFunction("+card.toString()+");} );");
        lay.AddChild(btns[btns.length - 1]);
    }

function callbackFunction(name){
  app.ShowPopup(name);
}