- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 Titanium SDK 3.1.3 并将一个 Alloy 项目部署到 Android。我在一个名为 UserProfile 的 xml 文件中有一个窗口,如下所示:
<Alloy>
<Window class="container">
<View id="MainHolder">
<View id="MainHolderTitleView">
<View id="CloseButton">
<Label id="CloseButtonLabel"></Label>
</View>
<Label id="MainHolderTitleLabel"></Label>
<View id="CreatePostButton">
<ImageView id="CreatePostButtonImage" image="/images/menu_options.png"></ImageView>
</View>
</View>
<View id="AppSettings">
<View id="AppOptionButtons">
<View id="MenuOption1" class="optionButton">
<Label id="Option1Label" class="optionButtonLabel"></Label>
</View>
<View id="MenuOption2" class="optionButton">
<Label id="Option2Label" class="optionButtonLabel"></Label>
</View>
<View id="MenuOption3" class="optionButton">
<Label id="Option3Label" class="optionButtonLabel"></Label>
</View>
</View>
</View>
<View id="MainHolderWorkspace">
<TableView id="AppTableView"></TableView>
<ActivityIndicator id="activityIndicator"/>
</View>
</View>
</Window>
</Alloy>
tss 看起来像这样:
".container" : {
backgroundColor:"#b1b1b1",
width:Ti.UI.FILL,
height:Ti.UI.FILL,
top:0,
left:0,
navBarHidden : true
},
"#MenuAppsButton":{
height:'20dp'
},
"#MainHolderTitleLabel":{
// width : '250dp',
left : '60dp',
right : '60dp',
height : '25dp',
color:"#FFFFFF",
textAlign : 'center',
font:{fontSize:'12dp'},
ellipsize : true
},
"#CreatePostButton":{
right:0,
width:'44dp',
height:'44dp',
backgroundColor:"#242424"
},
"#CreatePostButtonImage":{
height:'20dp'
},
".optionButton":
{
width:Ti.UI.FILL,
height:'44dp',
backgroundColor:"#f0f0f0",
top:1
},
".optionButtonLabel":
{
color:"#363636",
font:{
fontSize:'12dp',
fontWeight:"bold"
},
height:Ti.UI.SIZE,
width:Ti.UI.SIZE
},
"#AppOptionButtons":
{
width:Ti.UI.FILL,
height:Ti.UI.SIZE,
backgroundColor:"transparent",
layout:"vertical"
},
"#AppSettings":
{
top:'44dp',
left:0,
backgroundColor:"transparent",
width:Ti.UI.FILL,
height:Ti.UI.FILL,
layout:"vertical"
},
"#MenuHolder":
{
width:Ti.UI.FILL,
height:Ti.UI.FILL,
top:0,
left:"-320dp",
zIndex:0,
backgroundColor:"#363636"
},
"#MainHolder":{
width:Ti.UI.FILL,
height:Ti.UI.FILL,
top:0,
left:0,
zIndex:1
},
"#MainHolderTitleView":
{
left:0,
right:0,
height:'44dp',
top:0,
backgroundColor:"#363636",
zIndex:0
},
"#MainHolderTitleDraggingView":
{
left:0,
width:'44dp',
height:'44dp',
top:0,
backgroundColor:"transparent",
zIndex:2
},
"#MainHolderWorkspace":
{
top:'44dp',
bottom:0,
left:0,
backgroundColor:"#b1b1b1",
zIndex:2
},
"#MainHolderTitleViewMenuButton":
{
width:'50dp',
height:'44dp',
left:0,
top:0,
backgroundColor:"#242424"
},
"#CloseButton":
{
width:'60dp',
height:Ti.UI.FILL,
backgroundColor:"#232323",
left:0
},
"#CloseButtonLabel":
{
color:"#FFFFFF",
font:{fontSize:'13dp'},
text : L('close_string')
},
"#AppTableView":
{
width:Ti.UI.FILL,
height:Ti.UI.SIZE,
top:0,
left:0,
showVerticalScrollIndicator:true,
backgroundGradient : {
type : 'linear',
colors : [
{
color : '#e7e7e7',
position : 0.0
},
{
color : '#d8d8d8',
position : 1.0
}
]
},
separatorColor : 'transparent'
},
"#activityIndicator":
{
width:Ti.UI.FILL
}
在我的表格 View 中,我添加了 2 行图像和 20 行更多的信息,这些信息是从网络服务获得的,这些行在开始时也包含图像。每次用户单击加载更多 View 时,都会添加 20 行更多信息,其中包含从网络服务获取的信息。
我添加的每一行都由不同的 View 组成,具体取决于从 Web 服务接收到的内容,唯一不变的是名为 Stream_Item 的 xml 中的 View ,如下所示:
<Alloy>
<View id="ContainerView" class="container">
<View id="GlobalWorkspace">
<View id="Workspace">
<View id="WorkspacePersonalInfo">
<View id="WorkspaceProfileImage">
<ImageView id="WorkspaceProfileImageView" image="/images/emptyPicture.png"></ImageView>
</View>
<View id="WorkspaceNameAndDateHolder">
<View id="WorkspaceNameTargetHolder">
<Label id="WorkspaceNameLastName"></Label>
<ImageView id="TargetImageView"></ImageView>
<Label id="WorkspaceTarget"></Label>
</View>
<Label id="WorkspaceDate"></Label>
</View>
</View>
<View id="WorkspaceContent"></View>
</View>
</View>
<View id="WorkspaceDecorator"></View>
</View>
</Alloy>
编辑 1这个 Controller 的代码如下所示: //获取传递给 Controller 的参数 var args = 参数[0] || {}; //加载脚本来处理图像缓存 var cacheImage = require('cacheImage'); //这是一个简单的还是复杂的条目 var simple = args.simple || 0;
//set values for this controller
$.WorkspaceNameLastName.text = args.user.name;
var created_at = args.created_at;
created_at = created_at.substring(0, created_at.indexOf('T'));
created_at = created_at.replace('-', '/');
created_at = created_at.replace('-', '/');
$.WorkspaceDate.text = created_at;
try
{
cacheImage('cachedImages_UserImages_Thumb', args.user.avatar.thumb, $.WorkspaceProfileImageView, null);
}
catch(error)
{
Ti.API.info(error);
}
//set correct width based on device screen
var workspaceWidth = Ti.Platform.displayCaps.platformWidth;
$.GlobalWorkspace.setWidth(workspaceWidth);
//if user pic is tapped, open profile
$.WorkspaceProfileImage.addEventListener("singletap", function(e) {
Alloy.createController("UserProfile", {
peopleObject:args.user
});
});
//arguments for like/dislike controller
var likenessArgs = {
data : args
};
//arguments for text controller
var textArgs = {
id : args.id,
text : L(args.action),
simple : true,
index : args.index,
simple : simple
};
//function to get the correct name of the class according to internationalization
function getClass(e)
{
switch(e)
{
case "Group":
return L('group_string');
case "Event":
return L('event_string');
case "Todo":
return L('todo_list_string');
case "TodoTask":
return L('todo_string');
case "Album":
return L('album_string');
case "AlbumPhoto":
return L('photo_string');
case "User":
return L('user_string');
}
}
//hide target user arrow image
$.TargetImageView.setOpacity(0);
//function to open viewer according to class
function openViewer(type)
{
switch(type)
{
case "User":
Alloy.createController("UserProfile", {
peopleObject : {
veramiko_id : args.target.veramiko_id
}
});
break;
case "Event":
Alloy.createController("Event_Details", {
evento : {
veramiko_id : args.target.veramiko_id
}
});
break;
case "Group":
Alloy.createController("Group_Profile", {
groupItem : {
veramiko_id : args.target.veramiko_id
}
});
break;
case "Album":
Alloy.createController("PhotoAlbumViewer", {
album : {
veramiko_id : args.target.veramiko_id
}
});
break;
}
}
//arguments for comments controller
var wall_posts_count = {};
wall_posts_count.wall_posts_count = parseInt(args.wall_posts_count);
wall_posts_count.id = args.id;
//variable to store attachment controller
var streamItemImageView;
//check if data received has a secondary target
if ( typeof args.secondary_target !== 'undefined')
{
//check if secondary target has a comment
if ( typeof args.secondary_target.comment !== 'undefined')
{
//construct the comment according to the context
var comment = args.secondary_target.comment;
textArgs.text = comment;
//check if user target is the same as logged user
if(args.target.veramiko_id !== Ti.App.Properties.getObject('loggedUser').user.veramiko_id)
{
if(args.target.veramiko_id !== args.user.veramiko_id)
{
//since there's a target display the necessary info for this target and the arrow target image
$.WorkspaceTarget.text = args.target.name;
$.WorkspaceTarget.width = $.WorkspaceTarget.toImage().width;
$.TargetImageView.image = Ti.Filesystem.resourcesDirectory + 'images/targetArrow.png';
$.TargetImageView.setOpacity(1);
$.WorkspaceTarget.addEventListener('singletap', function(e){
openViewer(args.target.class);
});
}
}
}
//check if there's an attachment
if ( typeof args.secondary_target.attachment !== 'undefined')
{
//create attachment controller
streamItemImageView = Alloy.createController("Stream_Item_Image", {
attachment : args.secondary_target.attachment,
comment : args.secondary_target.comment,
created_at : args.created_at,
updated_at : args.updated_at
}).getView();
$.WorkspaceContent.add(streamItemImageView);
}
}
// since there's no secondary target, it's a text post
else
{
var comment = args.target.name;
comment = "\"" + comment + "\"";
textArgs.text = textArgs.text + ': ' + comment;
}
// create like/dislike controller
var streamItemLikeDislikeView = Alloy.createController("Stream_Item_LikeDislike", likenessArgs);
// variable for user mentions in post
var streamItemMentions;
// check if there's any user mentions in this post
var mentionsArgs;
if(typeof args.mentions !== 'undefined')
{
// since there're user mentions, create the controller and the arguments for it
mentionsArgs = {
mentions : args.mentions
};
streamItemMentions = Alloy.createController("Stream_Item_Mentions", mentionsArgs);
}
// create comments controller
var streamItemCommentsView = Alloy.createController("Stream_Item_Comments", wall_posts_count);
// callback object with functions that update the comments count
var callbackObject = {};
callbackObject.increaseNumberOfComments = streamItemCommentsView.increaseNumberOfComments;
textArgs.callbacks = callbackObject;
// create text controller
var streamItemTextView = Alloy.createController("Stream_Item_Text", textArgs).getView();
$.WorkspaceContent.add(streamItemTextView);
//if there're user mentions, add the controller
if(typeof args.mentions !== 'undefined')
{
$.WorkspaceContent.add(streamItemMentions.getView());
}
// if it's a simple entry add the comments controller
if(args.simple)
{
$.WorkspaceContent.add(streamItemCommentsView.getView());
}
$.WorkspaceContent.add(streamItemLikeDislikeView.getView());
结束编辑 1
在 View WorkspaceContent 中添加了更多 View ,具体取决于是否已发表评论或是否已将图像附加到条目。
编辑 2此外,每个 Stream_Item Controller 都包含一个文本 Controller 和一个喜欢/不喜欢的 Controller ,这取决于条目是否有用户提及、附件和/或是否是一个简单的条目,添加额外的 Controller 。
我必须明确指出,这个 Stream_Item Controller 及其添加的 Controller 在其他 Windows 中工作得很好,但在这种特定类型的 Window 上它会出现错误。
结束编辑 2
我在 Android 中遇到的问题是行中包含的 View 上的触摸事件由于某种原因被阻止,我知道在处理 TableViews 时 Android 上的性能问题并在多个设备中进行测试后,除非具有触摸事件的元素已完成渲染,否则将允许用户与具有触摸事件的 View 进行交互。这只是一个猜测,但我认为在某种程度上对我的问题是准确的。我遇到的另一个问题是,在滚动或与表格的其他元素交互时,表格行中包含的图像有时会消失。
我不再使用 ScrollView 主要是因为向 TableView 添加元素的方法比 ScrollView 中的方法更实用(即能够在指定位置插入行,而 ScrollView 中没有这种行为)。我尝试了 List View,但 Alloy 中的实现非常困惑,文档也不清楚如何使用其他 Alloy View 动态更改内容。
有没有办法解决这些问题?我怎样才能让图像停止消失?我怎样才能绕过这个触摸 block ?
最佳答案
我对这个(消失的)问题也有非常糟糕的经历。由于 tableView 不像 iPhone 那样是 Android 的原生元素,这就是 Android 无法完美处理 TableView 并产生此类问题的原因。我多次遇到过这个问题。我建议你使用 ListView 而不是 TableView for android。只有这样我才能说你将能够避免这些问题。而对于触摸问题。我认为您需要直接在元素上使用 TouchEvents 而不是 View 。您如何使用 View 的 TouchEvents?
关于android - 如何在 Android 中使用钛合金修复 TableView 中消失的触摸事件和图像?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21034067/
我需要将文本放在 中在一个 Div 中,在另一个 Div 中,在另一个 Div 中。所以这是它的样子: #document Change PIN
奇怪的事情发生了。 我有一个基本的 html 代码。 html,头部, body 。(因为我收到了一些反对票,这里是完整的代码) 这是我的CSS: html { backgroun
我正在尝试将 Assets 中的一组图像加载到 UICollectionview 中存在的 ImageView 中,但每当我运行应用程序时它都会显示错误。而且也没有显示图像。 我在ViewDidLoa
我需要根据带参数的 perl 脚本的输出更改一些环境变量。在 tcsh 中,我可以使用别名命令来评估 perl 脚本的输出。 tcsh: alias setsdk 'eval `/localhome/
我使用 Windows 身份验证创建了一个新的 Blazor(服务器端)应用程序,并使用 IIS Express 运行它。它将显示一条消息“Hello Domain\User!”来自右上方的以下 Ra
这是我的方法 void login(Event event);我想知道 Kotlin 中应该如何 最佳答案 在 Kotlin 中通配符运算符是 * 。它指示编译器它是未知的,但一旦知道,就不会有其他类
看下面的代码 for story in book if story.title.length < 140 - var story
我正在尝试用 C 语言学习字符串处理。我写了一个程序,它存储了一些音乐轨道,并帮助用户检查他/她想到的歌曲是否存在于存储的轨道中。这是通过要求用户输入一串字符来完成的。然后程序使用 strstr()
我正在学习 sscanf 并遇到如下格式字符串: sscanf("%[^:]:%[^*=]%*[*=]%n",a,b,&c); 我理解 %[^:] 部分意味着扫描直到遇到 ':' 并将其分配给 a。:
def char_check(x,y): if (str(x) in y or x.find(y) > -1) or (str(y) in x or y.find(x) > -1):
我有一种情况,我想将文本文件中的现有行包含到一个新 block 中。 line 1 line 2 line in block line 3 line 4 应该变成 line 1 line 2 line
我有一个新项目,我正在尝试设置 Django 调试工具栏。首先,我尝试了快速设置,它只涉及将 'debug_toolbar' 添加到我的已安装应用程序列表中。有了这个,当我转到我的根 URL 时,调试
在 Matlab 中,如果我有一个函数 f,例如签名是 f(a,b,c),我可以创建一个只有一个变量 b 的函数,它将使用固定的 a=a1 和 c=c1 调用 f: g = @(b) f(a1, b,
我不明白为什么 ForEach 中的元素之间有多余的垂直间距在 VStack 里面在 ScrollView 里面使用 GeometryReader 时渲染自定义水平分隔线。 Scrol
我想知道,是否有关于何时使用 session 和 cookie 的指南或最佳实践? 什么应该和什么不应该存储在其中?谢谢! 最佳答案 这些文档很好地了解了 session cookie 的安全问题以及
我在 scipy/numpy 中有一个 Nx3 矩阵,我想用它制作一个 3 维条形图,其中 X 轴和 Y 轴由矩阵的第一列和第二列的值、高度确定每个条形的 是矩阵中的第三列,条形的数量由 N 确定。
假设我用两种不同的方式初始化信号量 sem_init(&randomsem,0,1) sem_init(&randomsem,0,0) 现在, sem_wait(&randomsem) 在这两种情况下
我怀疑该值如何存储在“WORD”中,因为 PStr 包含实际输出。? 既然Pstr中存储的是小写到大写的字母,那么在printf中如何将其给出为“WORD”。有人可以吗?解释一下? #include
我有一个 3x3 数组: var my_array = [[0,1,2], [3,4,5], [6,7,8]]; 并想获得它的第一个 2
我意识到您可以使用如下方式轻松检查焦点: var hasFocus = true; $(window).blur(function(){ hasFocus = false; }); $(win
我是一名优秀的程序员,十分优秀!