如何使用xml按钮在程序中禁用按钮

3

我有4个通过for循环在程序中创建的按钮,是否可以使用在xml中创建的按钮来禁用onclicklistener函数或ontouchlistener函数?抱歉我的英语不好,希望我的问题能够被理解。

示例图片

enter image description here

代码

public class Tab1 extends Fragment {

    TextView textView, test1;
    Button button, button2;
    LinearLayout rl;

    //Overriden method onCreateView
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View h = inflater.inflate(R.layout.tab1, container, false);
        //Returning the layout file after inflating
        //Change R.layout.tab1 in you classest
        textView = (TextView) h.findViewById(R.id.textView);
        test1 = (TextView) h.findViewById(R.id.test1);
        button = (Button) h.findViewById(R.id.button);
        button2 = (Button) h.findViewById(R.id.button2);
        rl = (LinearLayout) h.findViewById(R.id.tlayout);

        for (int i = 1; i < 5; i++) {

            final Button btnAddARoom = new Button(getActivity());
            RelativeLayout.LayoutParams params;
            params = new RelativeLayout.LayoutParams
                    (ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);

            btnAddARoom.setText("Add");
            btnAddARoom.setLayoutParams(params);
            rl.addView(btnAddARoom);


            btnAddARoom.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    test1.setText("qweqweqweqwe");
                }
            });

            button.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    btnAddARoom.setOnClickListener(null);
                }
            });
            button2.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    test1.setText("111111111111111");
                }
            });
        }


        return h;
    }
}

尝试查看View API的setEnabled(bool)可能会指引你朝正确的方向前进。 - JoxTraex
一键,你想禁用所有按钮吗? - amalBit
是的,一键禁用由for循环创建的所有按钮。 - Tang Weiming
4个回答

1
将从for循环中创建的所有按钮添加到数组中。
ArrayList<Buttons> buttons = new ArrayList<Buttons>();

for(int i =1 ; i<5 ; i++) {

    final Button btnAddARoom = new Button(getActivity());
    RelativeLayout.LayoutParams params;
    params = new RelativeLayout.LayoutParams
            (ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);

    btnAddARoom.setText("Add");
    btnAddARoom.setLayoutParams(params);
    rl.addView(btnAddARoom);

    buttons.add(YourDynamicallyCreatedButton)
}

现在,在您的 XML 按钮的 onClick 中:
onClick(){
   for(Button button: buttons){
      button.setEnable(false)
   }
}

注意:
当我们通过xml添加视图(按钮或文本..)时,我们会给它一个id。我们可以通过这个ID访问这些元素。同样地,当我们动态创建按钮时,我们需要为按钮/视图设置ID。

谢谢,我可以知道如何将所有的for循环添加到列表中吗? - Tang Weiming

0

在你的 Button 引用上调用 setEnable(false)

示例:

Button b ;
..
..
b.setEnable(false);

实际上我使用了这个btnAddARoom.setOnClickListener(null);,它在onclicklistener方法之外可以工作,但是在onclicklistener方法中无法工作。 - Tang Weiming

0

保留您以编程方式添加的按钮的引用:

Button[] buttons = new Buttons[5];
for(int i =0 ; i<buttons.length ; i++) {
    buttons[i] = new Button(getActivity());
    final Button btnAddARoom = buttons[i];
    RelativeLayout.LayoutParams params;
    params = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);

    btnAddARoom.setText("Add");
    btnAddARoom.setLayoutParams(params);
    rl.addView(btnAddARoom);
    btnAddARoom.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            test1.setText("qweqweqweqwe");
        }
    });

    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            btnAddARoom.setOnClickListener(null);
        }
    });
    button2.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            test1.setText("111111111111111");
        }
    });
}

现在当您想要禁用这些按钮时:

private disableButtons() {
    for(int i=0;i<buttons.length;i++) {
        buttons[i].setEnabled(false);
    }
}

希望能对你有所帮助!


0
如果您为这四个按钮设置了专用的父级,则可以消除Arralist或数组。
  LinearLayout ll = ..//your linear layout or any other parent
    final int childcount = ll.getChildCount();
    for (int i = 0; i < childcount; i++) {
        View view = ll.getChildAt(i);
        if (view instanceof Button) {
            view.setEnabled(false);
        }
    }

谢谢,我可以知道我应该把这个命令放在哪里吗?是在我的for循环内循环按钮吗? - Tang Weiming
只需在“DISABLE”按钮的单击侦听器上复制并粘贴上面的代码。 - Mable John
它出现了错误/AndroidRuntime: FATAL EXCEPTION: main java.lang.ClassCastException: android.support.v7.widget.AppCompatTextView无法转换为android.widget.Button 在net.simplifiedcoding.androidtablayout.Tab1$2.onClick(Tab1.java:63)处 - Tang Weiming
这个命令行是这样的:View button = (Button)rl.getChildAt(i); - Tang Weiming

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接