禁用按钮单击某些按钮行

时间:2014-11-11 20:47:50

标签: android button android-linearlayout

enter image description here

我通过输入单词动态创建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我点击都会变为绿色,即使它位于不同的行中。有人可以帮我解决这个问题吗?

2 个答案:

答案 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)