2015-06-10 52 views
0

我将视图放大,设置ID,设置一些标记,在其上设置onClickListener并将其添加到父视图。view.getId在onClick监听器中为-1

LinearLayout llCategoryListIncome = (LinearLayout)calculatorFlipContainerBack.findViewById(R.id.ll_category_list_income); 
// inflate category item 
LinearLayout categoryItem = (LinearLayout)inflater.inflate(
         R.layout.fragment_category_item, 
         container, 
         false); 

Integer id = 2; 
Integer position = 3; 

categoryItem.setId(position); 
categoryItem.setTag(R.string.tag_category_position, position); 
categoryItem.setTag(R.string.tag_category_id, id); 
categoryItem.setOnClickListener(this); 
llCategoryListIncome.addView(categoryItem); 

在onClick监听器中我想检查这个ID。但ID始终是-1。与标签相同的问题。标签始终为空。

public void onClick(View v) { 
    Integer position = (Integer)view.getTag(R.string.tag_category_position); 
    Integer id = (Integer)view.getTag(R.string.tag_category_id); 

    Log.d(TAG, "view get id " + view.getId()); // is null 
    Log.d(TAG, "position is " + position); // is null 
    Log.d(TAG, "id is " + id); // is -1 

任何想法什么可能是错的?

+0

您确定您点击的视图实际上是您的线性布局,而不是其中的其他小部件吗? –

+0

是的,我确定。我删除了setOnClickListener调用,并检查onClick是否被调用 - 并且它不被调用。 –

+1

这是一个错字吗? 'view'从哪里来? – codeMagic

回答

1

分配标签时,您必须使用标识符而不是字符串资源。

使用类似

categoryItem.setTag(R.id.your_id_for_position, position); 

,而不是

categoryItem.setTag(R.string.tag_category_position, position); 

正如View class documentation

说,指定的密钥应当在应用程序的资源的ID声明,以确保它是独一无二的

+0

正如我上面提到的,错字是问题。阅读文档,我认为你的回答也是正确的。但奇怪的是 - 它也适用于R.string。 tag_category_position .. –

0

为什么要调用setTag两次?

你必须通过下面一行的setTag一次:

categoryItem.setTag(position); 

的onclick方法

Integer id = (Integer)view.getTag(); 
Log.d(TAG, "id is " + id); 

完成

0

我建议你定义和使用你的代码中的支架。

private class TagHolder 
{ 
    int id; int position; 
} 
TagHolder tagHolder = new TagHolder(); 
tagHolder.id = 2; 
tagHolder.position = 3; 
view.setTag(tagHolder); 

public void onClick(View v) { 
    TagHolder tagHolder = (TagHolder)view.getTag(); 
    // tagHolder.id, tagHolder.position 
}