Below is the code I created for a Custom Alert Module for Titanium Alloy that runs on both iOS and Android – it is used as a replacement for the Titanium.UI.AlertDialog
For this module to work in Android you need to be able to target the spesific window, to do this we set a Alloy.Globals var
In app.js
// set Alloy.Globals.openWindow Alloy.Globals.openWindow = '';
In every new Window eg. index.js
// set Alloy.Globals.openWindow Alloy.Globals.openWindow = $.indexWindow;
Usage:
// require module customAlert in app/assets/lib/
var customAlert = require('customAlert');
//createAlert AlertDialog with params
var notificationData = {
cancelIndex: 2, // The Index is used to identify the Cancel button - It will always be appended to the end of the Button List
buttonNames: ["YES","NO","CANCEL"], // AS MANY BUTTONS AS NEEDED CAN BE ADDED HERE
message: "The Message",
title: "The Title",
click: function(e){
//START IF - Check what Button was clicked and run appropriate Function
if (e.index == 0){
Ti.API.info('The YES Button was clicked');
}else if (e.index == 1){
Ti.API.info('The NO Button was clicked');
}else{
Ti.API.info('The Cancel button was clicked');
};
//END IF - Check what Button was clicked and run appropriate Function
},
};
// show notification
customAlert.show(notificationData);
Module Code:
customAlert.js
////////////////////////////////////////////////////////////////////////////////////////////////////
/// Start customAlert Functions ///
exports.show = function (data){
var title = data.title;
var message = data.message;
var cancelIndex = data.cancelIndex;
var buttonNames = data.buttonNames;
// START IF - iOS or Android
if (Ti.Platform.name == 'iPhone OS'){
// Set alertWindow
var alertWindow = Ti.UI.createWindow({
backgroundImage: '/images/transparent_black.png', // YOU SHOULD ADD A 1px X 1px semit-transparent image to your resources folder
});
}else{
// Set alertWindow
var alertWindow = Ti.UI.createView({
backgroundImage: '/images/transparent_black.png', // YOU SHOULD ADD A 1px X 1px semit-transparent image to your resources folder
width: Ti.UI.FILL,
height: Ti.UI.FILL,
});
};
// END IF - iOS or Android
// create alertView container
var alertView = Ti.UI.createView({
backgroundColor:'white',
opacity: 0.90,
borderRadius:5,
width: "85%",
height: Ti.UI.SIZE,
layout: 'vertical',
});
// create alertTitleView
var alertTitleView = Ti.UI.createView({
width: Ti.UI.FILL,
height: Ti.UI.SIZE,
});
// create alertTitleLabel
var alertTitleLabel = Ti.UI.createLabel({
text: title,
color: 'black',
textAlign: 'center',
font: {
fontSize: '20dp',
},
touchEnabled: false,
top: "15dp",
left: 5,
right: 5,
});
alertTitleView.add(alertTitleLabel);
alertView.add(alertTitleView);
// create alertMessageView
var alertMessageView = Ti.UI.createView({
width: Ti.UI.FILL,
height: Ti.UI.SIZE,
});
// create alertMessageLabel
var alertMessageLabel = Ti.UI.createLabel({
text: message,
color: 'black',
textAlign: 'center',
font: {
fontSize: '16dp',
},
touchEnabled: false,
bottom: "15dp",
left: 5,
right: 5,
});
alertMessageView.add(alertMessageLabel);
alertView.add(alertMessageView);
// set buttonArray
var buttonArray = [];
// set cancelButton
var cancelButton = '';
// START Loop - through Menu Buttons and create
for (var m=0; m<buttonNames.length; m++){
// set buttonIndex
var buttonIndex = m;
// START IF - iOS else Android
if (Ti.Platform.name == 'iPhone OS'){
// Start Create alertButtonRow
var alertButtonRow = Ti.UI.createTableViewRow({
className:'buttonRow',
height: "45dp",
width: Ti.UI.FILL,
top: 0,
layout: "vertical",
selectedBackgroundColor: "#c8c8c8",
});
}else{
// Start Create alertButtonRow
var alertButtonRow = Ti.UI.createView({
height: "45dp",
width: Ti.UI.FILL,
top: 0,
layout: "vertical",
});
};
// END IF - iOS else Android
// create alertButtonView
var alertButtonView = Ti.UI.createView({
width: Ti.UI.FILL,
height: Ti.UI.FILL,
backgroundSelectedColor: "#c8c8c8",
buttonIndex: buttonIndex,
});
// create alertButtonView
var alertButtonSeperator = Ti.UI.createView({
width: Ti.UI.FILL,
height: "1dp",
backgroundColor: "#c8c8c8",
top: 0,
});
// START IF - check buttonIndex and set vars
if (buttonIndex == cancelIndex){
var fontSizeVar = '14dp';
var colorVar = 'black';
}else{
var fontSizeVar = '18dp';
var colorVar = '#639a13';
};
// END IF - check buttonIndex and set vars
// create alertButtonLabel
var alertButtonLabel = Ti.UI.createLabel({
text: buttonNames[m],
color: colorVar,
textAlign: 'center',
font: {
fontSize: fontSizeVar,
},
touchEnabled: false,
left: 5,
right: 5,
});
// add eventlistener to Button
alertButtonView.addEventListener('click', function() {
if (data.click){
data.click({index: this.buttonIndex});
// START IF - iOS or Android - CLOSE WINDOW
if (Ti.Platform.name == 'iPhone OS'){
alertWindow.close();
}else{
var currentWindow = Alloy.Globals.openWindow;
currentWindow.remove(alertWindow);
};
// END IF - iOS or Android - CLOSE WINDOW
};
});
alertButtonView.add(alertButtonSeperator);
alertButtonView.add(alertButtonLabel);
alertButtonRow.add(alertButtonView);
// START IF - buttonIndex is cancelIndex set cancelButton else add to buttonArray
if (buttonIndex == cancelIndex){
var cancelButton = alertButtonRow;
}else{
buttonArray.push(alertButtonRow);
};
// END IF - buttonIndex is cancelIndex set cancelButton else add to buttonArray
};
// END Loop - through Menu Buttons and create
// Push cancelButton to end of buttonArray
buttonArray.push(cancelButton);
// START IF - iOS or Android
if (Ti.Platform.name == 'iPhone OS'){
// Create tableView with rows as buttons
var buttonTableView = Ti.UI.createTableView({
data:buttonArray,
width: Ti.UI.FILL,
height: Ti.UI.SIZE,
separatorColor: "transparent",
scrollable: false,
});
// add buttonTableView to alertView
alertView.add(buttonTableView);
}else{
// START Loop - through createButtons and add
for (var b=0; b<buttonArray.length; b++){
alertView.add(buttonArray[b]);
};
// END Loop - through createButtons and add
};
// END IF - iOS or Android
// add alertView to Window
alertWindow.add(alertView);
// START IF - iOS or Androdi OPEN WINDOW
if (Ti.Platform.name == 'iPhone OS'){
alertWindow.open();
}else{
var currentWindow = Alloy.Globals.openWindow;
currentWindow.add(alertWindow);
};
// END IF - iOS or Androdi OPEN WINDOW
};
// END Function - customAlert Functions //
//////////////////////////////////////////////////////////////////////////////////////////////////
Titanium Alloy iOS Android Module: Custom Alert Module to replace Titanium.UI.AlertDialog
