【问题标题】:disable button click for certain rows of buttons禁用某些按钮行的按钮单击
【发布时间】:2014-11-11 20:47:50
【问题描述】:

我通过输入一个词来动态创建Buttons。如果我写 "met",它会出现在屏幕上 - 每个字母一个 Button。我输入的下一个单词也会发生同样的事情,它会出现在前一个单词的下方 --- 如上图所示。

当我点击Button 时,它会变成绿色。我的问题是,禁用单击Buttons 行的最佳方法是什么。意思是,如果用户点击"met"中的'm',我希望用户只能点击"met"中的Buttons,而不能点击@中的任何Buttons 987654332@

这是我的代码:

编辑

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);

编辑

我为Buttons 的每一行创建了LinearLayouts 中的List。如果LinearLayoutid 设置为1,则Buttons 变为绿色。当我单击Button 时,我希望LinearLayout 保持在1 并将所有其他行/LinearLayouts 设置为0 所以它们变得不可点击。

目前,我点击的每个Button 都会变成绿色,即使它位于不同的行中。有人可以帮我解决这个问题吗?

【问题讨论】:

  • 为什么不将 onclicklistener 设置为 null 对于那些你不想拥有功能的人?
  • 这是个好主意。但是所有按钮都具有相同的 onClickListener。如何区分我想要和不想要的按钮?
  • 你应该命名你的行,你现在无法区分它们。
  • 或者你应该让你的按钮成为一个数组,这样它们就可以有不同的点击监听器
  • 每一行按钮当前都保存在一个LinearLayout List中。但我仍然难以解决...请检查我上面的代码

标签: android button android-linearlayout


【解决方案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)

在您的点击方法中,只需将指定 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 循环的方法......但是这个小循环不会让你在性能方面崩溃..

注释代码是第二种方法,在 getTouchables 上找到所有 Child,这在逻辑上会导致 ArrayList,这正是我不喜欢它的原因。你必须初始化一个arraylist……但是,这也不会让你在性能方面崩溃,但节省一分钱就是一分钱! ;) 希望它有所帮助,一切都很清楚。他们两个都工作!如果符合您的需求,请标记为已接受的答案...

【讨论】:

  • 感谢您的帮助。我接受了你的建议,但我仍然陷入困境。我编辑了上面的代码。如果您能提供帮助,请告诉我。
  • @user2456977 我为您的问题添加了两个解决方案。我确定一个(首选非注释代码!!)将满足您的需求。
  • 感谢您花时间帮助我。我正在使用您的代码,但它似乎没有做任何事情。我也可以点击你所有的按钮。我想单击第一个按钮,然后无法单击其他四个按钮。这有意义吗?
  • @user2456977 我知道你想做什么,这正是我的代码所做的。我试过了,单击 llrow 中的 5 个按钮之一后,所有按钮都失去了 onclick 功能。您现在只需要确保将此代码插入到第一行的 onclicklistener 中,然后将我的 llrow 替换为第二行中的线性布局...您明白吗?
  • 我的意思是你只需要从 buttonIsClicked @user2456977 插入代码
【解决方案2】:

你必须区分这两行,要么将它们添加到不同的ViewGroups,要么你可以使用View.setTag(int key, Object tag)

【讨论】:

  • 这很好,但我如何让每一行都有自己的视图?还是它自己的对象?
  • 再次感谢,我听取了您的建议,并将每个 LinearLayout/行放入一个列表中。但我仍然遇到代码问题。你能帮忙吗?上面的代码在原帖中编辑过
  • 如何区分代码中的两行?我认为这是主要问题。
  • 我通过将每个 LinearLayout 行添加到 LinearLayout 列表来区分行 - 正如我在上面的代码中发布的那样。所以第一行是list_of_ll.get(0),第二行是list_of_ll.get(1),第三行是list_of_ll.get(2),以此类推
猜你喜欢
  • 2018-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-07
相关资源
最近更新 更多