我通过输入单词动态创建Buttons
。如果我写"met
“,它会出现在屏幕上 - 每个字母一个Button
。我输入的下一个单词也会发生同样的事情,它出现在上一个单词的下方---如图所示上面的图片。
当我点击Button
时,它变为绿色。我的问题是,禁用单击Buttons
行的最佳方法是什么。这意味着,如果用户点击了'm'
中的"met"
,我希望用户只能点击Buttons
中的"met"
并且无法点击Buttons
"had", "goes", or "ran"
这是我的代码:
修改
int size = enter_txt.getText().toString().length();
for (int i=0; i<size; i++){
final Button dynamicButtons = new Button(view.getContext());
dynamicButtons.setLayoutParams(rlp);
dynamicButtons.getLayoutParams().width = 130;
dynamicButtons.getLayoutParams().height = 130;
dynamicButtons.setTag("0");
dynamicButtons.setId(1);
dynamicButtons.setText(edit_text_array[i]);
dynamicButtons.setBackgroundResource(R.drawable.button);
button_list.add(dynamicButtons);
linearLayout2.addView(dynamicButtons, rlp);
dynamicButtons.setOnClickListener(
new View.OnClickListener()
{
public void onClick(View view)
{
int i=0;
LinearLayout ll = (LinearLayout) dynamicButtons.getParent();
for(i=0; i<list_of_ll.size();i++){
if (ll == list_of_ll.get(i)){
list_of_ll.get(i).setId(i);
break;
}
}
if(list_of_ll.get(i).getId()==i)
ButtonOnClick(view);
}
});
}
linearLayout2.setId(0);
linearLayout2.setTag("0");
list_of_ll.add(linearLayout2);
修改
我为List
的每一行创建了LinearLayouts
Buttons
。如果Buttons
的{{1}}设置为1,id
会变为绿色。当我点击LinearLayout
时,我希望Button
保持为1并且将所有其他行/ LinearLayout
设置为0,以便它们变得不可点击。
目前,每次LinearLayouts
我点击都会变为绿色,即使它位于不同的行中。有人可以帮我解决这个问题吗?
答案 0 :(得分:1)
为什么你不在for循环中设置Id,这样你就可以引用并将onlicklistener设置为null,就像已经提到的jpcrow一样。
将ID设置为:
YourCreatedBtn.setId(i+1);
//Id's setted programmatically don't.
have to be unique... But they should be
a positive number (referring to the
android documentation)
在你的on click方法中,只需将指定Id的onclicklistener设置为null即可。只是一个提示,希望它有所帮助
有关开幕式评论的更新评论
我找到了两个简单的方法,但我更喜欢在buttonIsClicked中没有注释掉的方法:
LinearLayout llrow;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
llrow = (LinearLayout) findViewById(R.id.test_layout);
//Adding 5 Buttons
for(int i = 0; i<5; i++) {
Button mybtn = new Button(this);
//set LayoutParams here
mybtn.setId(5);
mybtn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
buttonIsClicked(v);
}
});
llrow.addView(mybtn);
}
}
private void buttonIsClicked(View v) {
/*ArrayList<View> myButtons = llrow.getTouchables();
for(int i = 0; i < llrow.getChildCount(); i++){
myButtons.get(i).setOnClickListener(null);
}*/
for(int i = 0; i<llrow.getChildCount(); i++){
llrow.getChildAt(i).setOnClickListener(null);
}
}
它只是您的代码的简化版本,但我确定您将获得内容..
如果发现,您不必在两种情况下都设置ID。您可以轻松地让所有孩子过来
YourRowLinearLayout.getChildAt(starting from 0 to n-1-Views you added)...
我没有找到绕过for循环的方法...但是这个小小的循环不会打破你的性能......
out -mented-code是第二种方法,在getTouchables中找到所有Child,它在逻辑上导致了ArrayList,这正是我不喜欢它的原因。你必须初步化一个arraylist ......然而,这也不会打破你的性能,但节省一分钱是一分钱! ;)希望它有所帮助,一切都很清楚。他们俩都工作!如果符合您的需要,请标记为已接受的答复...
答案 1 :(得分:0)
您必须区分这两行,或者将它们添加到不同的ViewGroups,或者您可以使用View.setTag(int key, Object tag)