【问题标题】:How to know which Toggle Buttons are clicked from dynamically added view?如何知道从动态添加的视图中单击了哪些切换按钮?
【发布时间】:2019-08-12 04:36:18
【问题描述】:

这是我第一次使用 android 编程,但我被卡住了。

现在我正在尝试动态添加包含切换按钮和编辑文本的视图。但是,每当我选择切换按钮时,我创建的选项仅适用于上次创建的视图。

选项很简单。有两个切换按钮,可以互斥点击

example

这意味着每当我在上面添加新的视图(例如 B 和 C)时,这些选项仅适用于 C 而不在 B 中。我怎样才能使其适用于每个视图?

public void onAddField(View v){
    LayoutInflater inflater=(LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    final View rowView=inflater.inflate(R.layout.data_gledger_add_new,null);

    tbg_add=(ToggleButton)rowView.findViewById(R.id.add_toggle_gledger);
    tbc_add=(ToggleButton)rowView.findViewById(R.id.add_toggle_credit);

    if(create_box<4){
        csl.addView(rowView,csl.getChildCount()-1);
        Log.d("create_box",String.valueOf(create_box));
        create_box++;
    }
    else{
        Log.d("create_box","full");
        create_box=4;
    }

    tbg_add.setOnClickListener(new View.OnClickListener(){
        public void onClick(View v){
            if(tbg_add.isChecked()){
                get_add_cla="menu1";
                tbg_add.setTextColor(getResources().getColor(R.color.color_white));
                tbc_add.setChecked(false);
                tbc_add.setTextColor(getResources().getColor(R.color.color_black));
            }
            else{
                get_add_cla="";
                tbg_add.setTextColor(getResources().getColor(R.color.color_black));
            }
        }
    });

    //대변 선택
    tbc_add.setOnClickListener(new View.OnClickListener(){
        public void onClick(View v){
            if(tbc_add.isChecked()){
                get_add_cla="menu2";
                tbc_add.setTextColor(getResources().getColor(R.color.color_white));
                tbg_add.setChecked(false);
                tbg_add.setTextColor(getResources().getColor(R.color.color_black));
            }
            else{
                get_add_cla="";
                tbc_add.setTextColor(getResources().getColor(R.color.color_black));
            }
        }
    });
}

我忘了提到视图是通过单击按钮添加的。 android:onClick="onAddField"

【问题讨论】:

    标签: java android


    【解决方案1】:

    这个问题几乎可以肯定是因为您正在重用实例字段(tbg_addtbc_add)作为动态添加新视图。

    tbg_add=(ToggleButton)rowView.findViewById(R.id.add_toggle_gledger);
    tbc_add=(ToggleButton)rowView.findViewById(R.id.add_toggle_credit);
    

    因为您正在重新分配这些字段并从点击侦听器中引用它们,所以您将始终引用最近创建的切换按钮。

    将这些更改为局部变量,一切正常。

    ToggleButton ledger=(ToggleButton)rowView.findViewById(R.id.add_toggle_gledger);
    ToggleButton credit=(ToggleButton)rowView.findViewById(R.id.add_toggle_credit);
    

    与您的问题无关,但您应该解决的问题是您将 null 作为第二个参数传递给您的 inflate() 调用:

    final View rowView=inflater.inflate(R.layout.data_gledger_add_new,null);
    

    当您以这种方式传递null 时,系统将无法正确处理新膨胀视图的LayoutParams(xml 文件中以android:layout_ 开头的任何内容)。

    您知道您最终会将rowView 添加到您的csl 视图中,因此您应该将其作为第二个参数传递。完成此操作后,您还必须将 false 作为第三个参数传递,以确保 inflate() 调用实际上返回 rowView 而不是其新父级 (csl)。

    final View rowView=inflater.inflate(R.layout.data_gledger_add_new, csl, false);
    

    【讨论】:

    • 乐于助人:)
    • 嗯,介意我再问你一件事吗?现在我试图在上述问题中为“get_add_cla”设置值。但是如果我以上述方式设置值,无论我创建多少视图,设置 get_add_cla 的每个值都取决于创建的最后一个视图。我试图存储在数组中,但它不起作用
    猜你喜欢
    • 1970-01-01
    • 2016-02-08
    • 1970-01-01
    • 2017-06-04
    • 1970-01-01
    • 2021-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多